这里已经提出了很好的观点,但是虽然有很多关于浏览器如何完成边距渲染的信息,但为什么还没有完全回答:
“为什么 margin-top:-8px 与 margin-bottom:8px 不一样?”
我们还可以问的是:
为什么正的下边距不会“向上”在元素之前,而正的上边距“向下”在元素之后?
所以我们看到的是,边距的呈现会有所不同,这取决于它们应用到的一侧——顶部(和左侧)边距与底部(和右侧)边距不同。
当(简化)查看浏览器如何应用样式时,事情变得更加清晰:元素在视口中自上而下呈现,从左上角开始(现在让我们坚持垂直渲染,请记住水平的也一样)。
考虑以下html:
<div class="box1"></div>
<div class="box2"></div>
<div class="box3"></div>
类似于它们在代码中的位置,这三个盒子在浏览器中“自上而下”地堆叠在一起(为了简单起见,我们不会在这里考虑order
css3 'flex-box' 模块的属性)。因此,每当样式应用于框 3 时,前面元素的位置(对于框 1 和 2)已经确定,并且为了渲染速度不应再更改。
现在,想象框 3 的上边距为 -10px。浏览器不会向上移动所有前面的元素以收集一些空间,而是将框 3 向上推,因此它呈现在顶部(或底部,具体取决于 z-index ) 任何前面的元素。即使性能不是问题,向上移动所有元素也可能意味着将它们移出视口,因此必须更改当前滚动位置才能使所有内容再次可见。
这同样适用于框 3 的底部边距,无论是负的还是正的:不是影响已经评估的元素,而是为即将到来的元素确定一个新的“起点”。因此,设置一个正的底部边距会将以下元素向下推;消极的人会把他们推高。