Answers:
保证金崩溃的主要类型有两种:
仅在后一种情况下,使用填充物或边框可以防止塌陷。此外,与父级应用的overflow
默认值(visible
)不同的任何值都可以防止崩溃。因此,两者overflow: auto
和overflow: hidden
将具有相同的效果。也许唯一的区别hidden
是如果父母的身高固定,则隐藏内容的意外结果。
一旦应用于父级,其他可以帮助解决此问题的属性是:
float: left / right
position: absolute
display: inline-block / flex
您可以在这里进行所有测试:http : //jsfiddle.net/XB9wX/1/。
我应该补充一点,像往常一样,Internet Explorer是例外。更具体地说,在IE 7中,当为父元素指定某种布局时,边距不会折叠width
。
资料来源:Sitepoint的文章“ 利润率下降”
overflow: auto
可能导致滚动条出现在父元素中,而不是使溢出内容按照溢出overflow: visible
。
flex
与其默认值不同的任何值都将禁用保证金缩减
您也可以为此使用良好的旧版micro clearfix。
#container:before, #container:after{
content: ' ';
display: table;
}
查看更新的小提琴:http : //jsfiddle.net/XB9wX/97/
:before
and :after
元素填充DOM的趋势。现在,我将此规则添加到了样式表中:div:before, div:after{content: ' '; display: table;}
。太棒了 突然,东西开始按预期运行。
据我所知,禁用边缘折叠没有任何视觉影响的一种巧妙技巧是将父级的填充设置为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
。就像克里斯·摩根(Chris Morgan)在下面的评论中提到的那样,通过这次小型测试,看来Firefox确实采用了0.1px
填充。虽然,0.05px
似乎可以解决问题。
*{padding-top:0.1px}
。我们确定它可以在所有浏览器中运行吗?
0.05px
我更喜欢似乎仍然是一个特定的选择,而不是一个随机的浏览器欺骗号码0.01px
。
overflow:hidden
可以防止页边空白,但是它也没有副作用-即...隐藏了溢出。
除了这些以及您提到的内容之外,您只需要学习它,并在这一天实际有用时(每3至5年出现一次)学习这一天。
overflow: auto
可以很好地防止隐藏的溢出并仍然防止边距崩溃。
overflow:auto;
使我的内容区域在某些页面上具有滚动条。
实际上,有一种可以完美运行的方式:
显示:flex; flex-direction:列;
只要您可以只支持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>
<div>
在内添加一个附加项.container
,否则.container
会控制其子项的Box模型。例如,内联元素将成为全角块元素;如果他们有保证金,这些保证金也将崩溃。
每个基于Webkit的浏览器都应支持属性-webkit-margin-collapse
。还有一些子属性只能将其设置为顶部或底部边距。您可以为其设置值折叠(默认值),丢弃(将边距设置为0(如果存在相邻边距))和单独(防止边距折叠)。
我已经测试过,它可以在2014版的Chrome和Safari上使用。不幸的是,我不认为IE支持该功能,因为它不是基于webkit的。
阅读Apple的Safari CSS参考以获取完整说明。
如果您查看Mozilla的CSS webkit扩展页面,它们会将这些属性列为专有属性,建议不要使用它们。这是因为它们可能不会很快进入标准CSS,只有基于Webkit的浏览器会支持它们。
我知道这是一篇非常老的文章,但只想说在父元素上使用flexbox会禁用其子元素的边距折叠。
由于父级已position
设为相对,我也遇到了利润下降的类似问题。以下是可用于禁用边距折叠的命令列表。
只需尝试将任何parent-fix*
类分配给div.container
element,或将任何类分配children-fix*
给div.margin
。选择最适合您的需求。
什么时候
div.absolute
红色背景将位于页面的顶部。div.absolute
将位于与Y相同的Y坐标div.margin
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带有示例的您可以编辑
在较新的浏览器(不包括IE11)中,可以使用防止父子边距崩溃的简单解决方案display: flow-root
。但是,您仍然需要其他技术来防止相邻元素塌陷。
演示(之前)
.parent {
background-color: grey;
}
.child {
height: 16px;
margin-top: 16px;
margin-bottom: 16px;
background-color: blue;
}
<div class="parent">
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
</div>
演示(之后)
.parent {
display: flow-root;
background-color: grey;
}
.child {
height: 16px;
margin-top: 16px;
margin-bottom: 16px;
background-color: blue;
}
<div class="parent">
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
</div>