ここではすでに良い点が指摘されていますが、ブラウザーによるマージンのレンダリング方法については多くの情報がありますが、その理由はまだ完全には解明されていません。
「margin-top:-8px が margin-bottom:8px と同じでないのはなぜですか?」
また、次のように質問することもできます。
正の下部マージンが前の要素を「隆起」しないのに対し、正の上部マージンが次の要素を「隆起」しないのはなぜですか?
したがって、マージンが適用される側に応じて、マージンのレンダリングに違いがあることがわかります。上部 (および左) のマージンは、下部 (および右) のマージンとは異なります。
ブラウザーによってスタイルが適用される方法を (簡略化して) 見ると、物事がより明確になります。要素は、ビューポートで左上隅から始めてトップダウンでレンダリングされます (ここでは、垂直方向のレンダリングに固執しましょう。水平のものは同じように扱われます)。
次の html を検討してください。
<div class="box1"></div>
<div class="box2"></div>
<div class="box3"></div>
コード内の位置と同様に、これら 3 つのボックスはブラウザーで「上から下」に積み上げられて表示されます (単純にするために、ここorder
では css3 の「flex-box」モジュールのプロパティについては考慮しません)。そのため、スタイルがボックス 3 に適用されるときはいつでも、前の要素の位置 (ボックス 1 と 2 の) は既に決定されており、レンダリング速度のためにそれ以上変更するべきではありません。
ここで、ボックス 3 の上マージンを -10px と想像してください。前のすべての要素を上に移動してスペースを確保する代わりに、ブラウザーはボックス 3 を押し上げるだけなので、z-index に応じてボックス 3 の上 (または下) にレンダリングされます。 ) 先行する要素。パフォーマンスが問題にならなかったとしても、すべての要素を上に移動するとビューポートの外に移動する可能性があるため、現在のスクロール位置を変更して、すべてを再び表示する必要があります。
同じことがボックス 3 の下部余白にも適用されます。負と正の両方です。既に評価された要素に影響を与える代わりに、次の要素の新しい「開始点」のみが決定されます。したがって、正の下マージンを設定すると、次の要素が押し下げられます。負のものはそれらを押し上げます。