MDN / Mastering margin collapsing
MDN / Mastering margin collapsing
The top and bottom margins of blocks are sometimes combined (collapsed) into a single margin whose size is the largest of the individual margins (or just one of them, if they are equal), a behavior known as margin collapsing. Note that the margins of floating and absolutely positioned elements never collapse.
Margin collapsing occurs in three basic cases:
Adjacent siblings
: The margins of adjacent siblings are collapsed (except when the latter sibling needs to be cleared past floats).
No content separating parent and descendants
: The vertical margins between a parent block and its descendants can collapse. This happens when there is no separating content between them. Specifically, this occurs in two main cases:
The of a parent collapses with the of its first in-flow descendant unless the parent has a , , contains any inline content (such as text), or has clearance applied.
The of a parent collapses with the of its last in-flow descendant unless the parent has a defined or , a , or .
In both cases, creating a new block formatting context on the parent will also prevent its margins from collapsing with its children.
Empty blocks
: If there is no border, padding, inline content, , or to separate a block’s from its , then its top and bottom margins collapse.
Some things to note:
More complex margin collapsing (of more than two margins) occurs when the above cases are combined.
These rules apply even to margins that are zero, so the margin of a descendant ends up outside its parent (according to the rules above) whether or not the parent’s margin is zero.
When negative margins are involved, the size of the collapsed margin is the sum of the largest positive margin and the smallest (most negative) negative margin.
When all margins are negative, the size of the collapsed margin is the smallest (most negative) margin. This applies to both adjacent elements and nested elements.
Collapsing margins is only relevant in the vertical direction.
Margins don’t collapse in a container with
displayset toflexorgrid.
Examples
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
div {
margin: 2rem 0;
background: lavender;
}
p {
margin: 0.4rem 0 1.2rem 0;
background: yellow;
}