ここですでに良い点が述べられていますが、マージンのレンダリングがブラウザーによってどのように行われるかについては多くの情報がありますが、その理由はまだ完全には答えられていません。
「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インデックスの上部(または下部)にレンダリングされます。 )先行する要素。パフォーマンスに問題がなくても、すべての要素を上に移動すると、要素がビューポートから外れる可能性があるため、現在のスクロール位置を変更して、すべてを再び表示できるようにする必要があります。
同じことがボックス3の下部マージンにも適用されます。負と正の両方です。既に評価された要素に影響を与える代わりに、次の要素の新しい「開始点」のみが決定されます。したがって、下マージンを正に設定すると、次の要素が押し下げられます。負の値はそれらを押し上げます。
onset
とoffset
。多くの人が(ポジティブ)を意味するときは常にoffset
(ネガティブ)という単語を使用しているのは事実です。回答を更新すると、このメッセージは自動的に破棄されます。乾杯!onset