【发布时间】:2017-10-18 19:06:54
【问题描述】:
首先让我说我不需要帮助解决这个问题 - 我可以自己轻松解决我的具体问题。但我确实需要帮助来了解为什么它会发生 - 并可能确定它实际上是一个错误,所以我可以报告它。
问题是带有overflow:hidden 的父容器包含一个带有负数margin-bottom 的子容器,该子容器又包含一个或多个floated 项目,后跟clear(即它的高度取决于浮动的孩子)...似乎完全忽略了负底部边距。
我不希望子 div 的内容对负下边距发挥任何作用......无论那个孩子里面是什么,我都希望负边距得到尊重,并且内容被“切断” " 由家长的overflow: hidden.
TL;DR:下面有一个更简约的示例...
此示例显示了 FF 和 IE 中的问题 - 但与我在 chrome 中的预期完全一样:
* {
box-sizing: border-box;
}
body {
background: tomato;
}
.parent {
overflow: hidden;
background: goldenrod;
width: 25%;
margin: 0 12.5%;
float: left;
}
.parent.overflow_visible {
overflow: visible;
}
.child {
margin-top: -10px;
margin-bottom: -10px; /* THIS ONE has no effect in FF and IE */
}
.float {
height: 100px;
float: left;
border-top: 15px solid green;
border-bottom: 15px solid green;
width: 100%;
}
.clear {
clear: both;
}
.clear_below {
clear: both;
background: yellow;
height: 10px;
}
<div class="parent overflow_visible">
<div class="child">
<div class="float"></div>
<div class="clear"></div>
</div>
</div>
<div class="parent">
<div class="child">
<div class="float"></div>
<div class="clear"></div>
</div>
</div>
<div class="clear_below"></div>
右边的盒子顶部和底部都应该有 5px 的边框,盒子下面的黄色条应该和左边盒子的“胖”底部边框重叠,并且正好在“瘦”底部边框的正下方对。
请注意,这大部分只是为了清楚地可视化它 - 问题本身可以通过一个不那么冗长的示例来重现:
<div style="overflow: hidden">
<div style="margin-bottom: -10px">
<div style="float: left">float</div>
<div style="clear: both"></div>
</div>
</div>
如果“孙子”没有浮动,则不会出现问题:
<div style="overflow: hidden">
<div style="margin-bottom: -60px">
<div><img src="http://via.placeholder.com/350x150"></div>
</div>
</div>
任何人都可以为这种行为提供合理的解释吗?
【问题讨论】:
-
浮动就是这样工作的:浏览器通过在内部增加清除元素的上边距来清除浮动,直到它的顶部与浮动元素的底部齐平。
-
@MrLister Err... 我对花车的工作原理并不感到困惑(或者至少我不这么认为)。
clear显然 应该 在下方以浮动自身,因此将孩子的底部延伸到浮动下方...但这应该 不 防止负底部边距孩子根本没有任何影响......所以父母的底部应该是10px 高于孩子的底部(和清晰)。抛开所有细节不谈,Chrome 和 firefox 之间的渲染有非常明显的区别,如果这是 “float 是如何工作的”,情况就不应该如此。