私は別の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>
W3Schools はなぜマージンがこのように振る舞うのか説明がありません。
実際には、#inner
エレメントの上部マージン が#outer
エレメントの上部エッジに折りたたまれ 、#outer
マージンのみがそのまま残ります(表示されていません)あなたの画像に)。マージンが等しいため、両方のボックスの上端は互いにぴったり重なります。
これがW3C仕様からの関連点です。
8.3.1マージンを縮小する
CSSでは、2つ以上のボックスの隣接マージン(兄弟である場合もそうでない場合もあります)を組み合わせて単一のマージンを形成することができます。このように組み合わされたマージンは折りたたみと呼ばれ、結果として得られる組み合わされたマージンは折りたたみマージンと呼ばれます。
隣接する垂直方向の余白の折りたたみ[...]
次の場合に限り、2つのマージンがに隣接するです。
- どちらも、同じブロックフォーマットコンテキストに参加するインフローブロックレベルボックスに属します。
- ラインボックスなし、クリアランスなし、パディングなし、境界線なし
- 両方とも垂直方向に隣接するボックスエッジに属し、すなわち、以下の対のうちの1つを形成する。
- ボックスの上部マージンと最初のインフロー子の上部マージン
次のいずれかを実行すると、マージンが縮小されなくなります。
div
要素のどちらかを浮動するdiv
要素 をインラインブロックにする#outer
の overflow
をauto
(またはvisible
以外の任意の値)に設定するそれは、
- 浮いている箱と他の箱の間の余白は崩れません(浮遊物とその流入している子の間でさえも)。
- 新しいブロックフォーマットコンテキストを確立する要素の余白(floatや、 'visible'以外の 'overflow'を持つ要素など)は、それらのインフローの子と一緒には折りたたまれません。
- インラインブロックボックスの余白は折りたたまれません(それらのインフローチャイルドでさえも)。
左右の余白は、予想どおりに動作します。
水平方向の余白は崩れません。
内側のdivにdisplay: inline-block;
を使ってみてください。
#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:inline-block;
}
@BoltClockが述べたことはかなり堅実です。そしてここで私はちょうどこの問題に対するいくつかの解決策を追加したいです。これを確認してください w3c_collapsingマージン 。緑色の部分は、この問題をどのように解決できるかという潜在的な考え方です。
解決策1
浮いている箱と他の箱の間の余白は崩れません(浮遊物とその流入している子の間でさえも)。
つまり、float:left
を#outer
または#inner
demo1 に追加できます。
また、float
はauto
のマージンを無効にします。
解決策2
新しいブロックフォーマットコンテキストを確立する要素の余白(floatや、 'visible'以外の 'overflow'を持つ要素など)は、それらのインフローの子と一緒には折りたたまれません。
visible
以外に、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;
}
これら二つの方法は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つ以上のリンクと画像を投稿することができないことで申し訳ありません。少なくとも、あなたは問題が次に来るときにどこから来るのかを知っています。
あなたが持っているものがなぜうまくいかないのかわからないが、あなたは追加することができます
overflow: auto;
外側のdivに。
#outer
にパディングを追加すれば、うまくいきます。
#outer {
width:500px;
height:200px;
background:#FFCCCC;
margin:50px auto 0 auto;
display:block;
padding-top:1px;
}
正確な理由はわからないが、内部のCSSを
display:inline-block;
うまくいくようです。
"理由"(折りたたみマージン付きのものにする必要があります)には答えませんが、あなたがやろうとしていることを実行する最も簡単で論理的な方法は、単ににpadding-top
を追加することです。外側のdiv :
マイナーノート - ブロックのないようにあなたのコードに何か他のものがない限り、divをdisplay:block;
に設定する必要はないはずです。
これを試して:
#outer {
width:500px;
height:200px;
background:#FFCCCC;
margin:50px auto 0 auto;
display:table;
}
#inner {
background:#FFCC33;
margin:50px 50px 50px 50px;
padding:10px;
display:block;
}
がんばろう
#innerdivのpositionプロパティをrelativeに設定するとよいでしょう。効果を達成するのにも役立ちます。しかし、とにかく私はIE9の質問と最新のGoogle Chromeに貼り付けたオリジナルのコードを試してみましたが、それらは何の変更もなく既に望ましい効果をもたらしています。
外側のdivにはpadding-top:50px
を使用してください。このようなもの:
#outer {
width:500px;
height:200px;
background:#FFCCCC;
margin:50px auto 0 auto;
display:table;}
注:パディングをするとdivのサイズが大きくなります。この場合、あなたのdivのサイズが重要であるならば、私はそれが特定の高さを持たなければならないかどうかを意味します。高さを50ピクセル減少させます。
#outer {
width:500px;
height:150px;
background:#FFCCCC;
margin:50px auto 0 auto;
display:table;}
何よりも重要なのは、すべてを強制することです。
margin:50px 50px 50px 50px !important;
簡単に修正するために、子要素を次のようにdiv
要素にラップしてみてください-
<div id="outer">
<div class="divadjust" style="padding-top: 1px">
<div id="inner">
Hello world!
</div>
</div>
</div>
inner
とouter
divの間の1px
のパディングにより、inner
divのマージンは崩壊しません。したがって、論理的には、1px
余分なスペースとinner
divの既存のマージンがあります。