空元素外边距叠加问题

《精通css 高级web标准解决方案》一书讲到盒模型的时候、这么说到:
外边距甚至可以与本身发生叠加。假设有一个空元素,他有外边距,但是没有边框或内边距。在这种情况下,顶外边距与底外边距就碰到了一起,它们会发生叠加。
并且给出了图事例,如下图:
图片描述

根据它所说我写下了如下代码,

<body>
<div style="margin-top:20px;margin-bottom:20px"></div>
</body>

按照它的意思是不是这个空的div就只占据20px呢?但是实际上在浏览器中看到如下图所示,
图片描述

它还是占据了40px而不是20px哇?是我理解的不对么?

但是我又写下了如下代码,

<body>
<div style="margin-top:20px;margin-bottom:20px"></div>
<div>Test</div>
</body>

图片描述

这时,包含Test的div的margin-top就是20px而不是40px了,莫非是按照我第二种理解来么?只有当有多个元素的时候,才会发生如书上所说的叠加,而当页面上只有一个空元素的时候并不会发生margin-topmargin-bottom的叠加。

是这样理解的么?

阅读 4.7k
3 个回答

泻药。

首先,我们先理一下边距重叠发生的一个非常必要的情况,在CSS规范中很清楚明白的规定了一个必要条件,那就是存在两个及以上的盒子模型(包括但不限于兄弟),相邻的边距会发生重叠,或者说合并。
其次,我们再理理问题中的代码。
第一种

<div style="margin-top:20px;margin-bottom:20px"></div>

div并没有相邻的盒模型存在,所以div本身的margin并不会发生重叠的情况。

第二种

<div style="margin-top:20px;margin-bottom:20px"></div>
<div>Test</div>

设置了margindiv这个时候有了兄弟元素的存在,满足了发生边距重叠的条件,所以虽然设置了40pxmargin,但是实际上已经塌陷成了20px。要注意一点的是,盒子本身上下margin重叠情况的条件是,该盒子必须是空元素,如果有内容撑开,那么本身的margin是不会重叠的。

总的来说,边距重叠首先要满足一个条件,那就是只有存在多个盒子的时候,相邻的margin才会发生重叠的情况,否则是不会发生这种情况的。

<div di="emptyDiv" style="margin-top:30px;margin-bottom:20px"></div>
<div id="divB" style="margin-top:20px;margin-bottom:20px;height:20px;background-color: #0E2D5F"></div>

运行后效果如下
图片描述

你可以发现divB的内容上边界距离emptyDiv的上外边距之间的距离为30px,也就说emptyDiv通过maring-top和margin-bottom的合并将divB放在其下30px处~~
而divB的margin-top:20px;小于emptyDiv合并后的margin-bottom:30px(margin-top可以认为不存在了),所以位置不变
如果divB的margin-top:50px;那么divB将被放在emptyDiv下50px;

margin重合是指两个相邻的元素了

<style>
div{
  margin-top: 10px;
  margin-bottom: 10px;
}
</style>
<div></div>
<div></div>

像这种情况,第一个DIV的margin-bottom会和第二个DIV的margin-top合并,最终两个DIV间的margin为最大的那个margin,也即是10px

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题