有没有办法完全禁用边距折叠?我发现的唯一解决方案(称为“不折叠”)需要使用1px边框或1px填充。我觉得这是不可接受的:多余的像素毫无理由地使计算复杂化。是否有更合理的方法来禁用边缘折叠?
当前回答
供你参考 网格,但有副作用:)
.parent {
display: grid
}
其他回答
据我所知,禁用边距折叠的一个巧妙技巧是设置父边距为0.05px:
.parentClass {
padding: 0.05px;
}
填充不再是0,所以不会再发生折叠,但同时填充足够小,从视觉上看,它会四舍五入到0。
如果需要其他填充,则只在不需要边距收缩的“方向”上应用填充,例如padding-top: 0.05px;。
工作的例子: .noCollapse { 填充:0.05 px; } .parent { 背景颜色:红色; 宽度:150 px; } 定格{ margin-top: 50 px; background - color:石灰; 宽度:100 px; 身高:100 px; } < h3 >边境崩溃< / h3 > < div class = "父" > < div class = "孩子" > < / div > < / div > <h3>无边界崩溃</h3> <div class="parent noCollapse"> < div class = "孩子" > < / div > < / div >
编辑:将数值从0.1更改为0.05。正如Chris Morgan在下面的评论中提到的,从这个小测试来看,Firefox似乎确实考虑了0.1px的填充。不过,0.05px似乎可以解决这个问题。
我有类似的问题,边际崩溃,因为父母有位置设置为相对。下面是可以用来禁用边距折叠的命令列表。
这里是测试场地
只需尝试将任何父-fix*类分配给div.container元素,或将任何类children-fix*分配给div.margin。选择一个最适合你需要的。
When
边距折叠被禁用,红色背景的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的例子,你可以编辑
事实上,有一个完美无缺的方法:
显示:flex; flex-direction:列;
只要你能接受IE10及以上版本
.container { 显示:flex; flex-direction:列; 背景:# ddd; 宽度:15他们; } .square { 保证金:15 px; 高度:3他们; 背景:黄色; } < div class = "容器" > < div class = "广场”> < / div > < div class = "广场”> < / div > < div class = "广场”> < / div > < / div > < div class = "容器" > < div class = "广场”> < / div > < div class = "广场”> < / div > < div class = "广场”> < / div > < / div >
我知道这是一个非常老的帖子,但只是想说,在父元素上使用flexbox将禁用它的子元素的边距折叠。
供你参考 网格,但有副作用:)
.parent {
display: grid
}