有没有办法完全禁用外边距折叠?我找到的唯一解决方案(名为“取消折叠”)涉及使用1像素边框或1像素填充。我觉得这是不可接受的:多余的像素增加了计算的复杂性,却没有好处。有没有更合理的方法来禁用这种外边距折叠?
有两种主要的边距折叠类型:
在后一种情况下,使用填充或边框将防止折叠。此外,将应用于父级的任何overflow
值与其默认值(visible
)不同,都将防止折叠。因此,overflow: auto
和overflow: hidden
将具有相同的效果。也许仅在使用hidden
时唯一的区别是,如果父元素具有固定高度,则会隐藏内容的意外后果。
其他一些属性,一旦应用于父级,可以帮助修复此行为,包括:
float: left / right
position: absolute
display: flex / grid
您可以在此处测试它们:http://jsfiddle.net/XB9wX/1/。
我应该补充一点,就像往常一样,Internet Explorer 是个例外。更具体地说,在IE 7中,当为父元素指定某种布局(如width
)时,边距不会折叠。
来源:Sitepoint的文章折叠边距
overflow: auto
可能会导致滚动条出现在父元素中,而不是像 overflow: visible
一样让溢出内容溢出。 - Leoflex
值都会禁用外边距折叠。 - Olydisplay: flow-root
可能会成为首选方法。 - James Coyle有一个很巧妙的技巧可以禁用边距折叠,它对视觉没有影响,据我所知,就是将父元素的内边距设置为0.05px
:
.parentClass {
padding: 0.05px;
}
内边距不再是0,因此不会再发生折叠,但同时内边距足够小,可以在视觉上舍入为0。
如果希望应用其他填充,则仅对不需要边距折叠的“方向”应用填充,例如padding-top: 0.05px;
。
Working example:
.noCollapse {
padding: 0.05px;
}
.parent {
background-color: red;
width: 150px;
}
.children {
margin-top: 50px;
background-color: lime;
width: 100px;
height: 100px;
}
<h3>Border collapsing</h3>
<div class="parent">
<div class="children">
</div>
</div>
<h3>No border collapsing</h3>
<div class="parent noCollapse">
<div class="children">
</div>
</div>
编辑:将值从0.1
更改为0.05
。正如克里斯·摩根在下面的评论中提到的那样,以及从这个小测试中可以看出,似乎Firefox确实考虑了0.1px
的填充。 不过,0.05px
似乎可行。
*{padding-top:0.1px}
。不过我们确定它在所有浏览器中都能工作吗? - Nick Manning你也可以使用传统的微清除浮动方法实现这一点。
#container::before, #container::after{
content: ' ';
display: table;
}
请查看更新后的代码演示:http://jsfiddle.net/XB9wX/97/
:before
和:after
元素填充DOM的原因了。我现在已经将这个规则添加到我的样式表中:div:before, div:after{content: ' '; display: table;}
。太棒了。突然间,一切都开始按照预期的方式运作了。 - Stijn de Witt<input>
。 - Rockallite实际上,有一个可以完美运作的方法:
display: flex; flex-direction: column;
只要你能接受仅支持IE10及以上版本
.container {
display: flex;
flex-direction: column;
background: #ddd;
width: 15em;
}
.square {
margin: 15px;
height: 3em;
background: yellow;
}
<div class="container">
<div class="square"></div>
<div class="square"></div>
<div class="square"></div>
</div>
<div class="container">
<div class="square"></div>
<div class="square"></div>
<div class="square"></div>
</div>
.container
中添加一个额外的<div>
,否则.container
将控制其子元素的框模型。例如,内联元素将变成全宽块级元素;如果它们有边距,那么这些边距也将被折叠。 - zupaoverflow:hidden
会防止边距折叠,但它并非不带副作用 - 即它会隐藏溢出内容。
除此之外和您提到的问题,您只需学会接受它,并为它有用的那一天做准备(每3至5年出现一次)。
overflow: auto
еҸҜд»ҘйҳІжӯўжәўеҮәйҡҗи—Ҹ并д»Қ然йҳІжӯўиҫ№и·қжҠҳеҸ гҖӮ - GavinCSS* | 修复 |
---|---|
display: flow-root; |
✅ 父元素折叠 ❌ 兄弟元素折叠 |
display: flex; |
✅ 父元素折叠 ✅ 兄弟元素折叠 |
*现代浏览器(不包括IE11)支持display: flow-root
和display: flex
。
section {
background: green;
outline: 2px solid purple;
}
p {
background: yellow;
margin: 1em 0;
}
section.flow-root {
display: flow-root;
}
section.flex {
display: flex;
flex-direction: column;
}
<h2>Default</h2>
<section>
<p>Paragraph 1</p>
<p>Paragraph 2</p>
</section>
<h2><code>flow-root</code> (Fixes only container)</h2>
<section class="flow-root">
<p>Paragraph 1</p>
<p>Paragraph 2</p>
</section>
<h2><code>flex</code> (Fixes both container & siblings)</h2>
<section class="flex">
<p>Paragraph 1</p>
<p>Paragraph 2</p>
</section>
我知道这是一个非常老的帖子,但只想说,在父元素上使用flexbox会禁用其子元素的边距折叠。
-webkit-margin-collapse
。还有子属性只针对顶部或底部边距进行设置。您可以将其赋予折叠(默认值)、丢弃(如果存在相邻边距,则将边距设置为 0)和分离(防止边距折叠)的值。-webkit-margin-collapse
属性。我在一些工具中使用它,现在测试失败了。 - Möhre{
display:flex;
flex-direction:column;
}
{
display:grid;
}
display: inline-block;
样式(只需要在其中一个上添加即可,虽然也可以同时添加到两个兄弟元素上)。
margin-bottom
赋值,而将margin-top
保留为 0。 - Dan Bray