マージンを持つ要素が別の要素内に含まれている場合、親は一貫してそのマージンをラップ/包含しません。
多くの場合、親に子のマージンが含まれます。
border: solid;
position: absolute;
display: inline-block;
overflow: auto;
(そして、これはほんの少しのテストからのもので、他にもあることは間違いありません。)
これはマージンの崩壊に関係していると思いますが、次のとおりです。
- W3C 仕様ページには、そのような動作についての説明はありません。
- ここには重複する余白はありません。
- この問題に関して、すべてのブラウザの動作は一貫しているようです。
- この動作は、マージンに関係のないトリガーの影響を受けます。
overflow: auto
デフォルトの要素が、オーバーフローが自動に設定されている要素とは異なるマテリアルを含む必要があるロジックは何ですか?
通常の div のデフォルトの動作以外のすべてで、マージンが親に含まれていると仮定する必要があるのはなぜですか? また、通常のデフォルトにマージンを含めないのはなぜですか?
EDIT:最終的な答えは、W3Cが実際にこの動作を指定しているということですが、それは:
- スペックに特に意味はありません。
- 説明の言葉なしで、仕様が混在しています。
- 'free margins' (親の上部または下部に触れるマージンは、親には含まれません) および
- 'collapsed margins' (隣接するマージンを重ねることができます)。
デモ:
body {
margin: 0;
}
div.block {
background-color: skyblue;
}
div.inline-block {
display: inline-block;
background-color: lawngreen;
}
div.position-absolute {
background-color: rgba(255,255,0,.7);
position: absolute;
bottom: 0;
right: 0;
}
div.overflow-auto {
background-color: hotpink;
overflow: auto;
}
div.border {
background-color: aquamarine;
border: solid;
}
h2 {
margin: 80px;
width: 250px;
border: solid;
}
<div class="block">
<h2>Is the margin contained (block)?</h2>
</div>
<div class="inline-block">
<h2>Is the margin contained (inline-block)?</h2>
</div>
<div class="position-absolute">
<h2>Is the margin contained (position-absolute)?</h2>
</div>
<div class="overflow-auto">
<h2>Is the margin contained (overflow-auto)?</h2>
</div>
<div class="border">
<h2>Is the margin contained (border)?</h2>
</div>