CSS 2.1 规范,关于折叠边距的第 8.3.1 节指出:
建立新块格式化上下文的元素的边距(例如浮动和具有“溢出”而不是“可见”的元素)不会与它们的流入子代一起折叠。
我花了一段时间才意识到块格式化上下文是由父级建立并应用于子级的上下文,因此要有所不同,必须在父元素上调整浮动或溢出属性(而不是给孩子们)。
在下面的代码片段中,相邻子 div 元素的边框高度折叠,因此任何两个子 div 元素之间的垂直间距为 max(20px, 20px) = 20px 而不是 20px + 20px = 40px,并且第一个子元素和父 div 以及最后一个子元素和父 div 之间的 max(20px, 0px) = 20px 而不是 20px + 20px = 40px。请注意,与 CSS 2.1 规范一样,水平方向不会出现折叠。
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Test</title>
<style type="text/css">
* { margin: 0; border: 0; padding: 0; }
</style>
</head>
<body style="background: green;">
<div id="wrapper" style="width: 400px; background: black;
/* overflow: hidden; *//* float: left; */">
<div id="box1" style="margin: 20px; height: 100px; background: red;">
</div>
<div id="box2" style="margin: 20px; height: 100px; background: blue;">
</div>
<div id="box3" style="margin: 20px; height: 100px; background: red;">
</div>
<div id="box4" style="margin: 20px; height: 100px; background: blue;">
</div>
</div>
</body>
</html>
如果红色 box1 元素的上边距没有与其父元素折叠,这样的边距不会将黑色背景推到边距下方,并且红色 box1 的边距将叠加在父元素的黑色背景上。类似的论点适用于底部的蓝色 box1 元素。
现在,正如 CSS 2.1 规范所提到的,如果“float:left;”中的任何一个 或“溢出:隐藏;” 包含 div 的部分被注释掉,然后是父元素的顶部和底部边框(在本例中为 0)和第一个子元素的顶部(在本例中为 10px)边框,以及底部(在本例中为 10px ) 底部孩子的边框,被分开,产生如下所示的结果:
现在,问题来了:
将这条规则引入 CSS 的理由是什么?这只是一个随机的决定,还是受到一些真实的、实际的例子的启发?(知道这也有助于我记住规则,除了满足我的好奇心)。
谢谢。