TL;DR:
マージンは、ラッパーを外側に拡張するのではなく、ラッパーから要素を移動するためのものです。
長い説明:
width
この動作は、ドキュメント内の任意の場所で水平に加えてを指定することと一致してmargin
います。分解するには、次のスニペットを検討してください。ここでは、overflow
プロパティのないラッパーを特定margin
し、ラッパー要素を展開しません。
body {
padding: 20px;
}
.outer {
width: 400px;
border: 1px solid black;
}
.inner {
width: 400px;
height: 40px;
margin: 0 20px;
background: grey;
}
<div class="outer">
<div class="inner">
</div>
</div>
ご覧のとおりmargin
、ラッパーのサイズが拡大することはなく、要素がオーバーフローし続けています。この動作は、CSS 2.1 仕様に記載されている の視覚的な書式設定モデルの詳細に記載されています。
次の制約は、他のプロパティの使用される値の間で保持する必要があります。
'margin-left' + 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' + 'margin-right' = 包含ブロックの幅
[...]
上記のすべてに「auto」以外の計算値がある場合、その値は「過度に制約されている」と見なされ、使用される値の 1 つがその計算値と異なる必要があります。包含ブロックの「方向」プロパティの値が「ltr」の場合、指定された「margin-right」の値は無視され、等式が真になるように値が計算されます。「方向」の値が「rtl」の場合、これは代わりに「マージン左」に発生します。
その抜粋は非常に密集しているので、単純に、 と の幅を無視しborder
て、 、、およびpadding
を0
残します。width
margin-left
margin-right
との固定width
値と 値があるためmargin-left
、margin-right
値は「過度に制約されています」。この例では、方向がltr
デフォルトであるため、margin-right
強制的に補正されます。
dir="rtl"
方向の効果を確認するために、ラッパー要素に属性を追加してみましょう。
body {
padding: 20px;
}
.outer {
width: 400px;
border: 1px solid black;
}
.inner {
width: 400px;
height: 40px;
margin: 0 20px;
background: grey;
}
<div class="outer" dir="rtl">
<div class="inner">
</div>
</div>
現在、要素は左にオーバーフローしています。dir="rtl"
この属性があなたのoverflow: scroll
例に同じ効果があるかどうか見てみましょう。
#outer {
border: 1px solid #00F;
width: 200px;
height: 100px;
overflow: scroll;
}
#inner {
border: 1px solid #F0F;
margin: 25px;
width: 400px;
height: 200px;
}
<div id="outer" dir="rtl">
<div id="inner">
</div>
</div>
ええ、そうです。右側ではなく左側の余白がなくなりました。
しかし、なぜoverflow: scroll
余白を含めないのでしょうか?
主な理由は、仕様がそうすべきだと言っていないからです。overflow
プロパティの CSS 2 仕様を見てみましょう。
オーバーフローが発生するたびに、'overflow' プロパティは、ボックスがパディング エッジまでクリップされるかどうかを指定し、そうである場合は、クリップ アウトされたコンテンツにアクセスするためのスクロール メカニズムが提供されるかどうかを指定します。
「クリップアウトされたコンテンツ」と具体的にどのように表示されているかを確認してください。「コンテンツ」の説明については、CSS 2 仕様の次の図を参照してください。
ご覧のとおり、 はmargin
とは別のものcontent
です。ただし、この時点で、パディングとボーダーがスクロール領域に含まれていることに注意する価値があるため、仕様に「コンテンツ」と記載されている場合は、ボーダーボックスを参照している可能性が高いか、少なくともそのように解釈されたようです.
なぜ機能display: inline-block
するのですか?
基本的に、余白inline-block
はブロック レベルではなくコンテンツ レベルであり、「過剰な制約」という概念がないため、要素に対するマージンの動作は異なります。