CSS에서 **세로 마진(margin-top, margin-bottom)**은
서로 겹칠 경우 더해지지 않고 하나로 합쳐지는 규칙을 가집니다.
이를 **마진 상쇄(Margin Collapsing)**라고 합니다.
결과적으로 겹친 마진 중 가장 큰 값 하나만 적용됩니다.
1. 마진 상쇄가 적용되는 기본 규칙
- 세로 방향만 적용됨 (위·아래)
- 가로 마진은 상쇄 ❌
- block 요소에서 발생
- 형제 요소, 부모-자식 관계 모두 가능
2. 서로 이웃한 태그 (형제 요소)
<div id="a">a</div>
<div id="b">b</div>
#a {
margin: 30px;
}
#b {
margin: 20px;
}
결과
- #a의 아래 마진: 30px
- #b의 위 마진: 20px
👉 30px + 20px ❌
👉 둘 중 큰 값인 30px ⭕
즉, 두 요소 사이의 실제 간격은 30px입니다.

3. 부모-자식 태그 관계
<div id="a">a</div>
<div id="b">
<div id="c">c</div>
b
</div>
#a {
margin: 30px;
}
#b {
margin: 20px;
}
#c {
margin: 40px;
}
1️⃣ 부모(#b)와 자식(#c) 마진 상쇄
- #b에 padding / border가 없음
- 자식 #c의 margin-top: 40px
👉 자식의 마진이 부모 바깥으로 튀어나와
부모의 위 마진처럼 동작
즉, #b의 위쪽 여백은 40px처럼 보입니다.
2️⃣ 이웃 요소(#a)와의 관계
- #a의 margin: 30px
- #b(실제로는 #c에서 올라온) margin: 40px
👉 둘이 겹치면서
30px + 40px ❌ → 40px ⭕

4. 마진 상쇄를 막는 방법
1️⃣ 부모에 padding 추가
.parent {
padding-top: 1px;
}
2️⃣ 부모에 border 추가
.parent {
border-top: 1px solid transparent;
}
3️⃣ overflow 사용
.parent {
overflow: hidden;
}
4️⃣ flex / grid 사용 (실무 최선)
.parent {
display: flex;
flex-direction: column;
}
정리하면
마진 상쇄란
세로로 인접한 요소들의 마진이 합쳐져
가장 큰 값 하나만 적용되는 CSS 규칙이다.
특히 부모-자식 관계에서는 마진이 밖으로 튀어나올 수 있어 주의해야 한다.
※ padding·border는 부모–자식 관계에서만 마진 상쇄를 막고, 형제 요소 간 마진 상쇄에는 영향을 주지 않는다.
'웹 개발 기본 & 디자인' 카테고리의 다른 글
| [CSS] Display: inline-block, float (0) | 2025.12.15 |
|---|---|
| [CSS] Display: block과 inline의 차이 (0) | 2025.12.15 |
| [CSS] overflow 속성 이해하기 (0) | 2025.12.14 |
| [CSS] 전체 선택자 * {} 개념 (0) | 2025.12.14 |
| [CSS] border-radius와 box-sizing: border-box 개념 (0) | 2025.12.14 |