有没有办法完全禁用边缘折叠?我发现的唯一解决方案(名称为“uncollapsing”)需要使用1px边框或1px填充。我发现这是不可接受的:无关的像素使计算变得复杂,没有充分的理由。是否有更合理的方法来禁用此边距折叠?
保证金崩溃有两种主要类型:
使用填充或边框将仅防止在后一种情况下崩溃。此外,overflow
的任何值都不同于其默认值(visible
)应用于父级将防止崩溃。因此,overflow: auto
和overflow: hidden
都会产生同样的效果。使用hidden
时唯一的区别可能是如果父级具有固定高度,则隐藏内容的意外后果。
其他属性,一旦应用于父级,可以帮助解决此问题是:
float: left / right
position: absolute
display: inline-block
你可以在这里测试所有这些:http://jsfiddle.net/XB9wX/1/。
我应该补充一点,像往常一样,Internet Explorer是个例外。更具体地说,在IE 7中,当为父元素指定某种布局时,边距不会崩溃,例如width
。
资料来源:Sitepoint的文章Collapsing Margins
您也可以使用旧的micro clearfix。
#container:before, #container:after{
content: ' ';
display: table;
}
看到更新的小提琴:http://jsfiddle.net/XB9wX/97/
一个巧妙的技巧来禁用没有视觉冲击的边缘折叠,据我所知,将父级的填充设置为0.05px
:
.parentClass {
padding: 0.05px;
}
填充不再为0,因此不再发生折叠,但同时填充足够小,在视觉上它将向下舍入到0。
如果需要一些其他填充,则仅将填充应用于不希望边缘折叠的“方向”,例如padding-top: 0.05px;
。
工作范例:
.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
。正如克里斯摩根在评论中提到的那样,并且来自this small test,似乎Firefox确实考虑了0.1px
填充。虽然,0.05px
似乎可以做到这一点。
overflow:hidden
可以防止边缘崩溃,但它并没有副作用 - 即它......隐藏溢出。
除了这个和你所提到的,你只需要学习它并学习它们实际有用的这一天(每3到5年)。
每个基于webkit的浏览器都应该支持-webkit-margin-collapse
属性。还有一些子属性只能为顶部或底部边距设置它。您可以给它折叠值(默认值),丢弃(如果存在相邻边距,则将边距设置为0),并分开(防止边距崩溃)。
我已经测试过这适用于2014版Chrome和Safari。不幸的是,我不认为这会在IE中得到支持,因为它不是基于webkit。
阅读Apple's Safari CSS Reference以获得完整的解释。
如果您检查Mozilla's CSS webkit extensions page,他们会将这些属性列为专有属性,并建议不要使用它们。这是因为它们很可能不会很快进入标准CSS,只有基于webkit的浏览器才会支持它们。
我知道这是一个非常古老的帖子,但只是想说在父元素上使用flexbox会禁用其子元素的边距折叠。
实际上,有一个完美无瑕的工作:
显示:flex;弯曲方向:柱;
只要你能够支持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>
因为父母将position
设置为相对而我有边缘崩溃的类似问题。以下是可用于禁用边距折叠的命令列表。
只是尝试将任何parent-fix*
类分配给div.container
元素,或任何类children-fix*
分配给div.margin
。选择最符合您需求的产品。
什么时候
div.absolute
将位于页面的最顶部。div.absolute
将位于与div.margin
相同的Y坐标html, body { margin: 0; padding: 0; }
.container {
width: 100%;
position: relative;
}
.absolute {
position: absolute;
top: 0;
left: 50px;
right: 50px;
height: 100px;
border: 5px solid #F00;
background-color: rgba(255, 0, 0, 0.5);
}
.margin {
width: 100%;
height: 20px;
background-color: #444;
margin-top: 50px;
color: #FFF;
}
/* Here are some examples on how to disable margin
collapsing from within parent (.container) */
.parent-fix1 { padding-top: 1px; }
.parent-fix2 { border: 1px solid rgba(0,0,0, 0);}
.parent-fix3 { overflow: auto;}
.parent-fix4 { float: left;}
.parent-fix5 { display: inline-block; }
.parent-fix6 { position: absolute; }
.parent-fix7 { display: flex; }
.parent-fix8 { -webkit-margin-collapse: separate; }
.parent-fix9:before { content: ' '; display: table; }
/* Here are some examples on how to disable margin
collapsing from within children (.margin) */
.children-fix1 { float: left; }
.children-fix2 { display: inline-block; }
<div class="container parent-fix1">
<div class="margin children-fix">margin</div>
<div class="absolute"></div>
</div>
这里有jsFiddle,你可以编辑的例子
为了您的信息,您可以使用网格,但有副作用:)
.parent {
display: grid
}