如何禁用边缘折叠?
有没有一种方法来完全禁用边缘折叠? 我发现的唯一的解决scheme(通过名称“uncollapsing”)需要使用1px边框或1px填充。 我觉得这是不可接受的:无关的像素复杂的计算没有很好的理由。 有没有更合理的方式来禁用这个边缘崩溃?
有两种主要的保证金崩溃types:
- 折叠相邻元素之间的边距
- 父母与子女成分之间的差距缩小
只有在后一种情况下,使用填充或边框才能防止崩溃。 而且,任何overflow
值不同于默认( visible
)应用于父项的overflow
值将防止崩溃。 因此, overflow: auto
和overflow: hidden
将具有相同的效果。 也许使用hidden
的唯一区别是隐藏内容的意想不到的后果,如果父母有一个固定的高度。
其他属性,一旦应用于父,可以帮助解决这一行为是:
-
float: left / right
-
position: absolute
-
display: inline-block
你可以在这里testing它们: http : //jsfiddle.net/XB9wX/1/ 。
我应该补充说,像往常一样,Internet Explorer是个例外。 更具体地说,在IE 7中,当为父元素指定某种布局(如width
时,边距不会折叠。
来源:Sitepoint的文章折叠边缘
你也可以使用这个老的微型clearfix。
#container:before, #container:after{ content: ' '; display: table; }
查看更新的小提琴: http : //jsfiddle.net/XB9wX/97/
一个简单的方法来禁用没有视觉冲击的边缘折叠,据我所知,将父级的填充设置为0.1px
:
.parentClass { padding: 0.1px; }
填充不再是0,所以崩溃不会再发生,并且填充小于0.5px,因此视觉上它将舍入到0。
如果需要其他填充,则仅将填充应用于不需要使用边距折叠的“方向”,例如padding-top: 0.1px;
。
工作示例:
.noCollapse { padding: 0.1px; } .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>
overflow:hidden
可以防止崩溃边缘,但它不是免费的副作用 – 即它…隐藏溢出。
除了这一点以及你所提到的,你必须学习现实生活,并且在他们真正有用的时候学习(每三到五年一次)。
每个基于webkit的浏览器都应该支持属性-webkit-margin-collapse。 也有子属性只设置它的顶部或底部边距。 你可以给它的值崩溃(默认),放弃(如果有邻近的边界设置边距为0),并单独(防止边缘崩溃)。
我已经testing了这个版本的Chrome和Safari 2014版本。 不幸的是,我不认为这将在IE浏览器支持,因为它不是基于webkit。
请阅读Apple的Safari CSS参考资料以获取完整说明。
如果您查看Mozilla的CSS webkit扩展页面 ,他们将这些属性列为专有,并build议不要使用它们。 这是因为他们很可能不会很快进入标准的CSS,只有基于webkit的浏览器才会支持它们。
我知道这是一个很老的post,但只是想说,在父元素上使用flexbox会禁用其子元素的边缘折叠。
由于父母的position
设置为相对的,我也有类似的边缘崩溃问题。 以下是可用于禁用边缘折叠的命令列表。
这里是试玩
只要尝试将任何parent-fix*
类分配给div.container
元素,或将任何class children-fix*
分配给div.margin
。 select一个最适合您的需求。
什么时候
- 边缘折叠被禁用 ,红色背景
div.absolute
将被定位在页面的最顶部。 - 边距折叠
div.absolute
将被定位在与div.margin
相同的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>
为了您的信息,你可以使用网格,但副作用:)
.parent { display: grid }
其实,有一个完美的作品:
显示: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>