这个问题来自于所谓的“利润崩溃”。很简单:两个相邻的边距折叠到两个中最高的一个(我说两个,但也可以更多)。
在你的例子中,“#mydivs”margin-top
- 80px - 正在触及“标题”margin-top
- 0 像素。它们是相邻的——它们之间没有元素,也没有填充,也没有边框。
因此,边距折叠到两个元素中最高的一个 (80px),然后将其应用于父子层次结构中最高的元素 - 这就是header
在这种情况下。
解决这个问题的一种方法是在边缘之间放置一些东西;一些填充或标题上的边框都可以正常工作。
header {
border-top: 0.1em solid rgba(0,0,0,0);
}
第二种解决方案(我的首选方案)是让父元素创建一个新的块格式化上下文。这样,它的边距就不会与其子项的边距一起崩溃。
如何创建块格式化上下文?有四种可能的方法。
- 通过浮动它。
- “绝对定位它”。
- 添加以下显示之一:“table-cell”、“table-caption”或“inline-block”。
- 添加可见以外的溢出。
为了防止边距塌陷,您可以执行以下任何操作 4。我通常选择第 4) - 将溢出设置为自动,因为它只是副作用......好吧,它不太可能成为问题。
header {
overflow: auto;
}
这基本上就是父子边距崩溃的情况。兄弟姐妹之间也存在边距折叠,并且规则几乎相同:两个相邻的边距折叠到两个中的最高者。这些解决方案不是。
这是对边距折叠的一个很好的解释 - http://www.howtocreate.co.uk/tutorials/css/margincollapsing http://www.howtocreate.co.uk/tutorials/css/margincollapsing