【发布时间】:2013-11-14 10:04:26
【问题描述】:
折叠边距上的CSS 2.1 specification, section 8.3.1 状态:
建立新块格式化上下文的元素的边距(例如 因为浮动和具有“溢出”而不是“可见”的元素)不 和他们流入的孩子一起崩溃。
我花了一段时间才意识到块格式化上下文是 由父级建立并应用于子级的上下文, 为了有所作为,浮动或溢出属性具有 在父元素(而不是子元素)上进行调整。
在下面的代码sn-p中,相邻子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 的基本原理是什么?是否只是一个随机的决定, 还是受到一些真实的、实际的例子的启发? (知道这也会帮助我 记住规则,除了满足我的好奇心)。
谢谢。
【问题讨论】:
-
不,这是一个单独的案例。我也是那篇文章的作者,我想要一个单独的答案,因为这是一个单独的问题。
标签: css css-float overflow margins