内部margin
の に値を追加しようとしました。 一番上の値以外はすべて正常に動作しますが、無視されているようです。 なぜでしょうか?div
div
コード:
#outer {
width: 500px;
height: 200px;
background: #FFCCCC;
margin: 50px auto 0 auto;
display: block;
}
#inner {
background: #FFCC33;
margin: 50px 50px 50px 50px;
padding: 10px;
display: block;
}
<div id="outer">
<div id="inner">
Hello world!
</div>
</div>
W3スクールmargin
なぜこのように動作するのかは説明できません。
ベストアンサー1
#inner
実際に要素の上余白が表示されています崩壊要素の上端に#outer
、余白のみを#outer
そのまま残して配置します (画像には表示されていませんが)。両方のボックスの上端は、余白が等しいため、互いにぴったりと重なります。
W3C 仕様の関連ポイントは次のとおりです。
8.3.1 マージンの縮小
CSS では、2 つ以上のボックス (兄弟の場合もそうでない場合もあります) の隣接するマージンを組み合わせて、1 つのマージンを形成できます。このように結合されたマージンは折りたたまれると言われ、結果として得られる結合マージンは折りたたまれたマージンと呼ばれます。
隣接する垂直余白が潰れる[...]
2 つの余白が隣接しているのは、次の場合のみです。
- どちらも、同じブロックフォーマットコンテキストに参加するフロー内ブロックレベルボックスに属します。
- ラインボックス、クリアランス、パディング、境界線がないため、分離されません。
- 両方とも垂直に隣接するボックスの端に属し、つまり次のペアのいずれかを形成します。
- ボックスの上余白と最初のインフローの子の上余白
余白がつぶれないようにするには、次のいずれかの操作を実行します。
- いずれかの
div
要素をフロートする- いずれかの
div
要素を作成しますインラインブロック- セット
overflow
の#outer
〜へauto
(または 以外の値visible
)
上記のオプションによってマージンの縮小が防止される理由は次のとおりです。
- フロート ボックスと他のボックス間のマージンは相殺されません (フロートとそのフロー内の子の間でも相殺されません)。
- 新しいブロック書式設定コンテキストを確立する要素 (フロートや、「visible」以外の「overflow」を持つ要素など) のマージンは、インフローの子要素とともに折りたたまれることはありません。
- インライン ブロック ボックスのマージンは相殺されません (インフローの子要素であっても相殺されません)。
左余白と右余白は、次の理由により期待どおりに動作します。
水平方向の余白がなくなることはありません。