😽

なぜマージンの相殺があるのか?

2024/03/10に公開

マージンの相殺とは?

隣接するボックスのマージンと重なる現象のことをマージンの相殺といいます。

この現象は、

  • 上・下マージンが被った時 かつ displayがblockのときに
  • 隣接する兄弟要素 又は 自身の親要素との間で

発生します。

この現象自体は、W3Cで条件が挙げられているため、バグではなく、規定通りの動作と考えられます。

なぜマージンの相殺があるのか?

結論:余白の設定を簡潔に済ませるための機能と言われています。

※ W3C での説明は見つかりませんでした。

ここからは、

Margin Collapse in CSS: What, Why, and How

という記事を基に説明します。

簡単な例として、ブログ記事を想像してみてください。

blog-example.png
記事には、画像や文章、見出し のように様々な要素が含まれており、

読みやすくするためには、それぞれの要素に間隔を空ける必要があります。

まず、段落の間隔を設定する場合、

p {
	margin-top: 10px;
}

とすると、段落間に余白が生まれます。

blog-margin-top10.png

しかし、画像との間には余白が含まれていません。

そのため、他の画像を考慮すると、

p {
	margin-top: 10px;
	margin-bottom: 10px;
}

のような設定になります。

blog-margin-bottom10.png

このとき、マージンの相殺が行われないと、段落の間隔が 20px になってしまいます。

しかし、ここで画像に余白を持たせると、

p {
	margin-top: 10px;
}

img {
	margin-top: 10px;
}

のように余計な記述が増えてしまいます。

そのため、マージンの相殺を行うことで、簡潔なコードで、画像との間隔を10pxに設定することができます。

参考資料

https://medium.com/@joseph0crick/margin-collapse-in-css-what-why-and-how-328c10e37ca0

https://www.w3.org/TR/CSS2/box.html#collapsing-margins

https://stackoverflow.com/questions/3069921/what-is-the-point-of-css-collapsing-margins

https://kappaz.hatenablog.com/entry/2019/04/21/213214#:~:text=マージンの相殺は、垂直,マージンとしてみなされます。

https://note.com/wugetsu/n/ncc16ed163855

https://with.sunabaco.com/964

https://developer.mozilla.org/ja/docs/Web/CSS/CSS_box_model/Mastering_margin_collapsing

Discussion