【发布时间】:2014-07-24 07:58:15
【问题描述】:
这个问题类似于this one(答案很好),虽然我的问题与浮动问题无关。
我最近在尝试对块级元素的唯一子元素应用边距时遇到了一些麻烦:
#parent {
background: rgba(255, 0, 0, 0.1);
}
#child {
margin: 30px 0;
padding: 20px;
background: rgba(0, 255, 0, 0.1);
}
<div id="parent">
<div id="child">Foo</div>
</div>
虽然应用了边距,但没有应用父级的背景。除非在#child 之前和之后添加兄弟姐妹,或者(在我看来更有趣)设置了除visible 之外的任何值的overflow,否则这仍然是正确的。这是相同的示例,但具有溢出值:
#parent {
background: rgba(255, 0, 0, 0.1);
overflow: auto;
}
#child {
margin: 30px 0;
padding: 20px;
background: rgba(0, 255, 0, 0.1);
}
<div id="parent">
<div id="child">Foo</div>
</div>
从CSS2.1 Section 9.4.1 - Block Formatting Contexts,我发现了以下内容:
浮动、绝对定位元素、不是块框的块容器(例如内联块、表格单元格和表格标题),以及具有“溢出”而不是“可见”的块框(该值除外已传播到视口)为其内容建立新的块格式化上下文。
在这种情况下,我真的很难理解“可见之外的溢出”逻辑背后的基本原理。在这种情况下,边缘似乎没有被剪裁,因为唯一需要改变的是背景。有人能证明为什么 overflow: visible 的值会造成这种情况吗?
【问题讨论】:
-
我相信(从记忆中)除了“可见”之外的任何东西都会形成一个新的子布局(最明显的效果通常是块内的 z 索引是自包含的)。没有这个,你就会有边距折叠的效果,使你的背景变小(内部孩子的边距与盒子之一和它接触的任何东西合并)。
-
我想知道边距是否默认不透明,除非强制不折叠。此外,它不仅仅是
overflow:jsfiddle.net/TylerH/u6tQj/1border也会让它出现。好问题。 -
至于为什么在正常情况下边距合并,这是因为通常这是您想要的(例如,段落边距与页眉边距合并,导致两者之间的最大边距而不是附加边距)。 TylerH(以及在外部元素上设置填充)在两个边距之间放置一些东西的边框效果,迫使它们不合并。
-
哦,我了解边距裁剪的正常情况:)