margin: 8px 16px처럼 한 줄로 네 방향의 여백을 한꺼번에 정하는 꼴을 짧게 적기라고 합니다. 한 줄은 적지 않은 방향까지 정해진 값으로 되돌리고, 값 개수에 따라 위부터 시계 방향으로 채웁니다. 위아래로 맞닿은 바깥 여백은 더해지지 않고 큰 쪽 하나만 남습니다.
앞 레슨들에서 padding: 16px · margin: 0 auto · border: 4px solid #1d1d1f를 '한 줄이 여럿을 정한다'고만 하고 썼습니다. 그런데 위 여백만 20px 주려고 margin-top을 쓴 뒤 다른 방향을 지우려고 margin: 0을 더하면 위 여백까지 사라집니다. 이 레슨은 그 한 줄이 무엇을 정하는지와, 제목과 목록 사이가 생각보다 좁은 까닭을 봅니다.
그림 준비 중
1적지 않은 칸은 되돌린다
규칙의 모양에서 세운 규칙에 문장을 잇습니다.
브라우저 규칙 4. 짧게 적기(
margin·background·flex…) 한 줄은 속성 여럿에 한꺼번에 값을 내고, 적지 않은 칸은 정해진 값으로 되돌립니다.
<div class="note">재료 메모</div>
.note {
margin-top: 20px;
margin: 0;
}.note의margin-top0px
margin: 0 한 줄은 margin-top · margin-right · margin-bottom · margin-left 넷에 모두 0을 냅니다. 같은 규칙 안에서 나중에 쓴 쪽이 이겨, 앞의 20px이 0으로 되돌아갔습니다. 두 줄의 차례를 바꾸면 위 여백은 20px입니다.
이렇게 겨루는 '한 속성'은 짧게 적기가 아니라 풀어 적은 속성 하나하나입니다.
브라우저 규칙 5. 겨루는 한 속성은 풀어 적은 속성입니다 —
margin과margin-top이 겨룹니다.
margin-top처럼 방향 하나만 정하는 속성을 풀어 적은 속성이라 부릅니다. Computed 창 목록이 margin 대신 margin-top부터 네 줄을 보이는 것도 이 까닭입니다.
2값 개수와 네 방향
값은 위부터 시계 방향(위 → 오른쪽 → 아래 → 왼쪽)으로 채우고, 빠진 방향은 맞은편 값을 받습니다.
| 적은 값 | 위 | 오른쪽 | 아래 | 왼쪽 |
|---|---|---|---|---|
8px | 8 | 8 | 8 | 8 |
8px 16px | 8 | 16 | 8 | 16 |
8px 16px 24px | 8 | 16 | 24 | 16 |
8px 16px 24px 32px | 8 | 16 | 24 | 32 |
<div class="a">가</div>
.a {
margin: 8px 16px 24px;
}.a의margin-top8px.a의margin-right16px.a의margin-bottom24px.a의margin-left16px
값이 셋이면 셋째는 아래이고, 빠진 왼쪽은 맞은편 오른쪽 16을 받습니다. padding도 같은 꼴이고, margin: 0 auto가 위아래 0 · 왼쪽 오른쪽 auto인 까닭도 이 표입니다. border: 4px solid #1d1d1f는 방향이 아니라 굵기 · 종류 · 색 셋을 정하는 짧게 적기라, 종류를 빼면 '선 없음'으로 되돌아갑니다.
3위아래로 맞닿은 바깥 여백은 겹친다
<h2>재료</h2>
<ul>
<li>밥 2공기</li>
</ul>
h2 {
margin-top: 0;
margin-bottom: 24px;
}
ul {
margin-top: 16px;
}ul의 위 틈24px
잰 값 '위 틈'은 앞 형제 요소의 아래 테두리에서 이 요소의 위 테두리까지입니다. 제목 아래 24와 목록 위 16을 더한 40이 아니라 24입니다. 일반 흐름에서 위아래로 맞닿은 바깥 여백은 겹쳐 큰 쪽 하나만 남습니다 — 바깥 여백 겹침이라 하고, 자료에 따라 여백 상쇄라고도 부릅니다. 왼쪽 · 오른쪽 바깥 여백은 겹치지 않습니다.
부모가 flex로 놓으면 겹치지 않습니다. 아래 display: flex · flex-direction: column은 '부모가 놓는 방식을 바꿨다'로만 읽으세요 — 12단원에서 봅니다.
<div class="recipe">
<h2>재료</h2>
<ul>
<li>밥 2공기</li>
</ul>
</div>
.recipe {
display: flex;
flex-direction: column;
}
h2 {
margin-top: 0;
margin-bottom: 24px;
}
ul {
margin-top: 16px;
}ul의 위 틈40px
4손 점수판에는 풀어 적어 넣는다
명시도의 손 점수판은 이제부터 짧게 적기를 풀어 적은 줄로 나눠 넣습니다. 개발자 도구 Styles 창에서도 짧게 적기 줄을 펼치면 풀어 적은 속성이 하나씩 보입니다.
<div class="note">가</div>
.note {
margin: 0;
}
div {
margin-top: 20px;
}.note의margin-top0px
| 속성 | 선언 | 출처 | 명시도 | 차례 | 이긴 값 |
|---|---|---|---|---|---|
margin-top | .note · margin: 0의 위 → 0 | 우리 CSS | 0-1-0 | 1 | 0 |
div · 20px | 우리 CSS | 0-0-1 | 2 | ||
margin-right | .note · margin: 0의 오른쪽 → 0 | 우리 CSS | 0-1-0 | 1 | 0 |
margin-bottom | .note · margin: 0의 아래 → 0 | 우리 CSS | 0-1-0 | 1 | 0 |
margin-left | .note · margin: 0의 왼쪽 → 0 | 우리 CSS | 0-1-0 | 1 | 0 |
margin: 0을 한 줄로 두면 div의 20px과 겨루는지 보이지 않습니다. 풀어 적으면 margin-top 줄에서 둘이 만나고, 명시도가 높은 .note가 이깁니다.
예제
레시피 카드 사이 여백
카드 아래에만 16px, 카드 안 문단 위에만 8px을 줍니다.
<article class="recipe-card">
<h2>김치볶음밥</h2>
<p>한식 · 조리 15분</p>
</article>
<article class="recipe-card">
<h2>계란말이</h2>
<p>한식 · 조리 20분</p>
</article>
.recipe-card {
margin: 0 0 16px;
padding: 16px;
border: 1px solid #d2d2d7;
}
.recipe-card h2 {
margin: 0;
}
.recipe-card p {
margin: 8px 0 0;
}.recipe-card의margin-bottom16px.recipe-card + .recipe-card의 위 틈16px.recipe-card p의margin-top8px
margin: 0 0 16px은 값 셋 — 위 0 · 왼쪽 오른쪽 0 · 아래 16입니다.- 제목의 기본 바깥 여백을
margin: 0으로 지우고, 문단과의 사이는 문단 위 8px 하나로만 정했습니다. 여백을 한쪽에서만 주면 겹침을 따질 일이 없습니다.
자주 틀리는 곳
틀린 생각: 위아래 바깥 여백은 늘 더해진다.
<p class="x">모임은 금요일</p>
<p class="x">장소는 2층</p>
.x {
margin: 20px 0;
}.x + .x의 위 틈20px
두 문단 사이는 20 + 20 = 40이 아니라 20입니다. 위 문단의 아래 여백과 아래 문단의 위 여백이 맞닿아 겹쳤습니다.
맞는 규칙: 일반 흐름에서 위아래로 맞닿은 바깥 여백은 큰 쪽 하나만 남습니다. flex · grid로 놓은 항목 사이에서는 겹치지 않습니다.
틀린 생각: 값이 셋이면 셋째가 왼쪽이다.
<div class="box">가</div>
.box {
padding: 8px 16px 24px;
}.box의padding-bottom24px.box의padding-left16px
셋째 값 24는 아래로 갔고, 왼쪽은 오른쪽 값 16을 받았습니다.
맞는 규칙: 값은 위 → 오른쪽 → 아래 → 왼쪽 차례로 채우고, 빠진 방향은 맞은편 값을 받습니다.
틀린 생각: 짧게 적기는 적은 칸만 바꾼다.
<div class="box">가</div>
.box {
padding-left: 32px;
padding: 8px;
}.box의padding-left8px
왼쪽만 32px로 두고 나머지를 8px로 맞추려 했지만 왼쪽도 8px입니다. 뒤의 padding: 8px이 네 방향을 모두 정해 앞의 padding-left를 되돌렸습니다.
맞는 규칙: 짧게 적기 한 줄은 적지 않은 칸까지 정합니다. 한 방향만 바꾸려면 짧게 적기 뒤에 풀어 적은 속성을 둡니다.
확인 문제
1. 예제의 .recipe-card에서 margin: 0 0 16px을 margin: 16px 0으로 바꾸면, 두 카드 사이 위 틈은 몇 px일까요?
- ① 0px
- ② 16px
- ③ 32px
힌트
값 둘이 네 방향에 어떻게 퍼지는지 2절 표에서 먼저 보세요.
힌트 둘
위 카드의 아래 여백과 아래 카드의 위 여백이 맞닿습니다. 맞닿은 두 여백이 어떻게 되는지 3절에서 보세요.
정답
② — 위아래 16씩이 맞닿아 겹치고 16 하나만 남습니다.
<article class="recipe-card">
<h2>김치볶음밥</h2>
</article>
<article class="recipe-card">
<h2>계란말이</h2>
</article>
.recipe-card {
margin: 16px 0;
padding: 16px;
border: 1px solid #d2d2d7;
}.recipe-card + .recipe-card의 위 틈16px
- ③은 두 여백을 더한 것입니다(바깥 여백은 늘 더해진다는 생각).
- ①은
16px 0의0이 위아래라고 본 것입니다. 값 둘은 위아래 · 왼쪽 오른쪽 차례입니다.
2. 동아리 배지가 차지하는 너비를 상자 셈으로 구합니다. 둘째 걸음의 셈과 값을 쓰세요.
<span class="badge">사진</span>
.badge {
display: inline-block;
width: 60px;
padding: 4px 10px;
border: 1px solid #d2d2d7;
}아래는 셈 표입니다.
| 걸음 | 셈 | 값 |
|---|---|---|
| 1. 내용 칸 | width | 60 |
| 2. 안쪽 여백 더하기 | ____ | ____ |
| 3. 테두리 더하기 | 둘째 값 + 1 × 2 | 82 |
| 4. 바깥 여백은 따로 | 없음 | — |
힌트
padding: 4px 10px에서 왼쪽 · 오른쪽 값이 무엇인지 2절 표에서 찾으세요.
정답
60 + 10 × 2 = 80
.badge의 너비82px.badge의padding-left10px
- 값 둘의 둘째(10)가 왼쪽 · 오른쪽입니다. 너비 셈에는 왼쪽 · 오른쪽만 듭니다.
- 흔한 오답은 68입니다. 첫째 값 4를 왼쪽 · 오른쪽으로 본 것입니다.
3. 여행 일정 칸 사이를 24px 띄우려 했는데 칸이 맞붙었습니다. Computed 창에서 첫 칸을 보니 잰 값 칸과 같습니다. CSS를 어떻게 고치면 될까요?
<div class="day">첫날</div>
<div class="day">둘째 날</div>
.day {
margin-bottom: 24px;
margin: 0 8px;
}.day의margin-bottom0px.day의margin-left8px
힌트
두 선언을 위에서부터 읽으며, 선언마다 어느 방향의 바깥 여백을 정하는지 적어 보세요.
힌트 둘
margin: 0 8px은 아래 여백도 정합니다. 그 값이 무엇인지, 앞의 24px이 어떻게 되었는지 보세요.
정답
두 줄의 차례를 바꿉니다. 한 줄로 margin: 0 8px 24px;이라 써도 됩니다.
<div class="day">첫날</div>
<div class="day">둘째 날</div>
.day {
margin: 0 8px;
margin-bottom: 24px;
}.day의margin-bottom24px.day + .day의 위 틈24px
- 뒤의
margin: 0 8px이 아래 여백까지 0으로 되돌렸습니다(짧게 적기는 적은 칸만 바꾼다는 생각). - 풀어 적은
margin-bottom을 짧게 적기 뒤에 두면 그 방향만 바뀝니다.
컴퓨터에서 해 보기(선택) — 점수에 들지 않습니다. 폰으로만 보고 있다면 건너뛰세요.
예제의 HTML과 CSS를 index.html과 style.css로 저장하고 link로 이어 엽니다(문서 뼈대의 body 안에 예제 HTML을 넣습니다). .recipe-card의 margin을 0 0 16px · 16px 0 · 8px 16px 24px 32px로 하나씩 바꾸기 전에 카드 사이 틈을 먼저 적고, 저장하고 새로고침해 맞춰 봅니다. 카드를 검사해 Computed 창의 margin-top부터 네 줄도 봅니다.