html css布局margin错误的问题,很简单的

<!doctype html>
<html>
<body>
    <div class="c1">
        <div class="c2"></div>
    </div>
    </body>
</html>
body{
    margin:0;
}
.c1{
    width:300px;height:200px;background-color:red;
}
.c2{
    width:300px;height:50px;margin-top:100px;background-color:green;
}

以我的理解,c1层与body不会有margin,也就是红色的c1层靠浏览器顶部显示,而c2层由于margin-top:100px,所以绿色的c2层应该距c1层顶部100像素,可事实是c1层距顶部100了。

如果在c1层加上overflow:hidden,显示符合预期。

能帮忙解释下为什么会发生这种情况吗?理解不能。

在线预览:http://runjs.cn/detail/x0bpu6ml

阅读 6.2k
4 个回答

c2 加上了 margin-top 会穿过 c1 直接作用于 body,这是由于外边距叠加,当初就是这么设计的。。。很正常。

但 如果把 c1 设置 overflow-hidden 就会在 c1 上触发 BFC,外边距叠加就会被取消了。

因为你设置了margin,子元素margin超出了父元素,但子元素相对于父元素的位置又是不变的,所以就把整个结构顶下去了,你设置了overflow:hidden,说明当发生溢出时溢出的内容隐藏,这样就不会显示顶出来的内容了。

因为c1和c2发生了margin collapse。设置c1 overflow:hidden;时形成BFC,这时就阻止了collapse。
具体原因见这个问题 中@Humphry的答案,极其清楚。

推荐问题