最开始做开发的时候,经常会踩到的坑,理论知识都学完了,就以为可以驰骋浏览器视图层,真的是太年轻了。在正常的文档流中两个毗邻的块元素会发生外边距的折叠,但是父元素盒子和子元素盒子也算是毗邻的关系,也共享外边距,这你就没想到吧。

案例中的html、css和最终效果的截图如下:

这里我们并没有给外层元素设置margin,可是他还是有一个距离浏览器顶端100px的上边距,用审查元素查看这个上边距时,会发现外层的元素marigin仍为0;所以这个margin-top是属于内层的div的。为什么会这样?

在css2.1中,是这样规定盒模型的:

In this specification, the expression collapsing margins means that adjoining margins (no non-empty content, padding or border areas or clearance separate them) of two or more boxes (which may be next to one another or nested) combine to form a single margin.

翻译成中文就是:所有毗邻的两个或更多盒元素的margin将会合并为一个margin共享之。毗邻的定义为:同级或者嵌套的盒元素,并且它们之间没有非空内容、Padding或Border分隔。

因为嵌套也属于毗邻,所以在样式表中优先级会更高;

现在给出解决办法:

  1. 父元素或者子元素使用浮动或者绝对定位absolute
    • 因为浮动或绝对定位不参与margin的折叠
  2. 父元素设置overflow:hidden;
  3. 父元素设置padding(破坏非空白的折叠条件)
  4. 父元素设置border