- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
CSS 2.1 specification, section 8.3.1关于崩溃的边距状态:
Margins of elements that establish new block formatting contexts (such as floats and elements with 'overflow' other than 'visible') do not collapse with their in-flow children.
我花了一段时间才意识到 block 格式化上下文是由 parent 建立并应用于 child 的上下文,为了有所作为, float 或溢出属性具有在父元素(而不是子元素)上进行调整。
在下面的代码片段中,相邻子div元素的边框高度collapse,使任意两个子 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 元素的上边距没有与其父元素一起折叠,这样的边距将没有将黑色背景推到边距以下,红色框 1 的边距会叠加在父元素的黑色背景上。类似的论点适用到底部的蓝色 box1 元素。
现在,正如 CSS 2.1 规范所提到的,如果“float: left;”中的任何一个或“溢出:隐藏;”包含 div 的部分被注释掉,然后是父级的顶部和底部边框元素(在本例中为 0)和第一个子元素的顶部(在本例中为 10px)边框,和底部 child 的底部(在本例中为 10px)边框,是分开的,产生结果如下图:
现在,问题来了:
将此规则引入 CSS 的基本原理是什么?这只是一个随机的决定,还是受到一些真实的、实际的例子的启发? (知道这一点也会帮助我记住规则,除了满足我的好奇心)。
谢谢。
最佳答案
我能给出的唯一合理的解释是 block 格式化上下文是原子的,在某种意义上,一个 block 格式化上下文中的框永远不能与另一个 block 格式化上下文中的框交互。这条关于折叠边距的规则似乎与 float 从不侵入其他 block 格式化上下文或将它们自己的 block 格式化上下文退出到祖先 block 格式化上下文中的规则一脉相承。
对此进行扩展:建立新 block 格式化上下文的框的流入后代参与该框的 block 格式化上下文,而框自身参与已建立的 block 格式化上下文在布局树中更高的地方。因此,框本身的边距预计会与同一 block 格式化上下文中的框一起折叠,而不是后代框。
Section 9.4.1似乎支持这一点:
Vertical margins between adjacent block-level boxes in a block formatting context collapse.
请注意,它说“ block 格式化上下文中的相邻 block 级框”——这意味着边距不会跨 block 格式化上下文折叠是 block 格式化上下文的固有属性。但这只是我对规范的解释;我不是作者,所以我不能确定这是否是预期的意思。
关于CSS 2.1 规范 : rationale for not collapsing margins of parent (when parent is float or has overflow other than visible),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19756678/
我制作了一个 DIV 和 visibility: hidden 并附加了一个 ::before 这个 DIV 的伪元素 visibility : 可见。这在 Firefox、Chrome 和 Safa
我正在使用 jquery 可见选择器来检查子元素是否可见。但令人惊讶的是 .is("visible") 和 .is(":visible") 在使用 css Visibility:hidden 时显示不
我有这个代码 #checkboxDIV { visibility: hidden; } #itemcard:hover #checkboxDIV {
我有一个用 ul 创建的菜单/li列出。 为了创造一个不错的效果,我有以下 css: #menu ul { /* ... */ visibility:hidden; /* ..
我想要的是,当我点击 Dashboard Button 时,它会像 SlidingDrawer 一样打开,打开后再次点击它会关闭。我使用这个自定义抽屉是因为 SlidingDrawer 已弃用。 现在
如何使用 jQuery 只选择可见元素? jQuery 选择器 :visible 和 :hidden 只尊重 display:none 作为真的隐藏?不是可见性:隐藏或可见性:可见。 我知道它们在技术
为什么我的 $('#myDiv').css('visibility', 'visible'); 不起作用? $('#clickdiv').click(function() { alert($(
在 $(document).ready 函数中通过 JavaScript 将子容器设置为 visibility: visible 时,我遇到了一个奇怪的问题。 问题是: 我有一个父元素,它有 boot
在 jQuery 中: e.is(':visible'); 检查元素是否显示。 jQuery 中是否有一个函数可以检查元素是否具有隐藏或可见属性可见性? 现在我必须自己实现这个功能。但我想使用 jQu
我在 mvc 中使用一个帖子表单,在帖子中我想显示一个隐藏的 div(惊喜)。 我正在使用 js/jquery 来显示 div,它可以在所有浏览器中工作,除了 mac 上的 safari :( 我现在
我似乎无法获得我的 jquery {{NotificationNavDot}} 功能正常工作! 在下面找到帮助文件: {{NotificationNavDot}} 在下面找到我的帮助
WPF 中的 Visibility.Collapsed 和 Visibility.Hidden 有什么区别? 最佳答案 不同之处在于,Visibility.Hidden隐藏了控件,但保留了它在布局中占
我有一个 if 语句来检查我的 div 下面是否没有任何可见内容,如果是,我会隐藏子元素的同级元素。 var $remainingprojects = $searchproject.s
这是我的菜单模型 HTML Menu 1 (overflow:hidden) Item 1 submenu 1 submen
编辑 3 实际上,我根本不需要弄乱可见性/不透明度...所以我删除了那些行(如编辑 2 所示)...添加了动画 -播放状态:暂停/运行.... 得到了我想要的效果... 编辑 2:感谢 Gineto
在我的应用程序中有一个广告 WebView ,它在 Activity 开始时调用一个 url。一切都很好,除了一件小事,它更像是一个可见性问题......所以问题是,当我开始 Activity 时,我
根据 the "visible" binding documentation , 如果 visible 的值为 false,Knockout 使用 display: none 隐藏元素。我怎样才能让它
* { margin: 0; padding: 0; border: 0; } .navBar { background-color: #2A2A2A; min-width: 10
android 布局使用 layout_weight。我的目标是所有组件的 1/3,但有时页脚实际上设置为消失,然后可见。从 gone 设置为 visible 时,权重计算如何工作?我没有看到具有 1
我有两个单选按钮,两个文本框和一个按钮。 当我点击第一个按钮时,应该只会出现一个文本框,当我点击第二个按钮时,应该会出现两个文本框。 但我想使用 visibility:hidden|visible 属
我是一名优秀的程序员,十分优秀!