掌握外邊距摺疊

塊級元素的上外邊距下外邊距有時會合並(摺疊)成一個單獨的外邊距,其大小是各個外邊距中的最大值(或者如果它們相等,則取其中一個),這種行為稱為外邊距摺疊。請注意,浮動元素和絕對定位元素的外邊距永遠不會摺疊。

外邊距摺疊發生在三種基本情況中:

相鄰兄弟元素

相鄰兄弟元素的外邊距會摺疊(除非後一個兄弟元素需要清除浮動)。

父元素與後代元素之間沒有內容分隔

父塊級元素及其後代元素之間的垂直外邊距可能會摺疊。這發生在它們之間沒有分隔內容時。具體來說,這發生在兩種主要情況下:

在這兩種情況下,在父元素上建立一個新的塊格式化上下文也將阻止其外邊距與其子元素摺疊。

空塊級元素

如果一個塊級元素的margin-topmargin-bottom之間沒有邊框、內邊距、行內內容、heightmin-height來分隔,那麼它的頂部和底部外邊距會摺疊。

一些注意事項

  • 當上述情況結合時,會發生更復雜的外邊距摺疊(涉及兩個以上的外邊距)。
  • 這些規則甚至適用於零外邊距,因此,無論父元素的外邊距是否為零,後代元素的外邊距最終都會在父元素之外(根據上述規則)。
  • 當涉及負外邊距時,摺疊後的外邊距大小是最大的正外邊距和最小的(最負的)負外邊距之和。
  • 當所有外邊距都為負時,摺疊後的外邊距大小是最小的(最負的)外邊距。這適用於相鄰元素和巢狀元素。
  • 外邊距摺疊只與垂直方向相關。
  • display設定為flexgrid的容器中,外邊距不會摺疊。

示例

HTML

html
<p>The bottom margin of this paragraph is collapsed …</p>
<p>
  … with the top margin of this paragraph, yielding a margin of
  <code>1.2rem</code> in between.
</p>

<div>
  This parent element contains two paragraphs!
  <p>
    This paragraph has a <code>.4rem</code> margin between it and the text
    above.
  </p>
  <p>
    My bottom margin collapses with my parent, yielding a bottom margin of
    <code>2rem</code>.
  </p>
</div>

<p>I am <code>2rem</code> below the element above.</p>

CSS

css
div {
  margin: 2rem 0;
  background: lavender;
}

p {
  margin: 0.4rem 0 1.2rem 0;
  background: yellow;
}

結果

另見