Skip to content

CSS Margin Collapse 邊界重疊

CSS 邊界重疊(Margin Collapse)是一個重要但常被誤解的概念。當兩個或多個相鄰的 垂直邊界 相遇時,它們會合併成一個邊界或等於較大元素的邊界,這個現象就稱為邊界重疊。

邊界重疊只會在以下情況下發生:

  • 垂直方向:只有垂直邊界會重疊,水平邊界不會。
  • 相鄰元素:元素必須在正常文檔流中相鄰。
  • 塊級元素:只有塊級元素會發生邊界重疊。
  • 沒有間隔:元素之間沒有 paddingborder 或其他內容分隔。

重疊情況

相鄰同層元素

兩個相鄰的同層元素之間會發生邊界重疊。

html
<div class="box1">box1</div>
<div class="box2">box2</div>
css
.box1 {
  margin-bottom: 20px;
}

.box2 {
  margin-top: 30px;
}

小提醒

兩個元素之間的間距是 30px(較大值),而不是 50px

父子元素

父元素和子層第一個/子層最後一個元素之間也會發生邊界重疊。

html
<div class="parent">
  <div class="child">子元素</div>
</div>
css
.parent {
  margin-top: 20px;
}

.child {
  margin-top: 30px;
}

小提醒

父元素的實際上邊界是 30px,而不是 50px

如何防止 Margin Collapse

使用 padding

css
/* ❌ 會重疊 */
.box {
  margin-top: 20px;
}

/* ✅ 不會重疊 */
.box {
  padding-top: 20px;
}

使用 overflow

css
.parent {
  overflow: hidden;
}

添加 border

css
.parent {
  border-top: 1px solid transparent;
}

使用 flexbox

css
.container {
  display: flex;
  flex-direction: column;
}

.item {
  margin: 20px 0;
}