@BoltClockが述べたことはかなりしっかりしています。ここで、この問題の解決策をいくつか追加したいと思います。このw3c_collapsingマージンを確認してください。緑の部分は、この問題をどのように解決できるかについて考えられている可能性があります。
解決策1
フロートボックスと他のボックスの間のマージンは折りたたまれません(フロートとフロー内の子の間もです)。
つまりfloat:left
、#outer
または#inner
demo1に追加できます。
また、マージンfloat
が無効になることに注意してくださいauto
。
解決策2
新しいブロックのフォーマットコンテキストを確立する要素の余白(フロートや 'visible'以外の 'overflow'を持つ要素など)は、インフローの子では折りたたまれません。
以外にvisible
、レットのput overflow: hidden
へ#outer
。そして、この方法はかなりシンプルでまともです。私はそれが好きです。
#outer{
width: 500px;
height: 200px;
background: #FFCCCC;
margin: 50px auto;
overflow: hidden;
}
#inner {
background: #FFCC33;
height: 50px;
margin: 50px;
}
解決策3
絶対的に配置されたボックスのマージンは折りたたまれません(インフローの子があったとしても)。
#outer{
width: 500px;
height: 200px;
background: #FFCCCC;
margin: 50px auto;
position: absolute;
}
#inner{
background: #FFCC33;
height: 50px;
margin: 50px;
}
または
#outer{
width: 500px;
height: 200px;
background: #FFCCCC;
margin: 50px auto;
position: relative;
}
#inner {
background: #FFCC33;
height: 50px;
margin: 50px;
position: absolute;
}
これら2つの方法は、通常のフローを中断します div
解決策4
インラインブロックボックスの余白は折りたたまれません(インフローの子の場合でも)。
@enderskillと同じ
ソリューション5
流入ブロックレベル要素の下部マージンは、兄弟にクリアランスがない限り、常に次の流入ブロックレベル兄弟の上部マージンと共に縮小します。
これは兄弟間の折りたたみマージンであるため、この質問とはあまり関係がありません。これは一般に、トップボックスにmargin-bottom: 30px
あり、兄弟ボックスにがあるかどうかを意味しますmargin-top: 10px
。それらの間の総マージンがある30px
の代わりに40px
。
解決策6
要素に上部ボーダー、上部パディング、および子のクリアランスがない場合、インフローブロック要素の上マージンは、最初のインフローブロックレベルの子の上マージンで折りたたまれます。
これは非常に興味深いもので、上枠線を1つだけ追加できます。
#outer{
width: 500px;
height: 200px;
background: #FFCCCC;
margin: 50px auto;
border-top: 1px solid red;
}
#inner {
background: #FFCC33;
height: 50px;
margin: 50px;
}
また<div>
、デフォルトではブロックレベルであるため、意図的に宣言する必要はありません。私の初心者の評判のため、2つ以上のリンクと画像を投稿できないのは申し訳ありません。少なくとも、次に似たような問題が発生したときに問題がどこから発生しているかがわかります。