【问题标题】:Negative margin-bottom is completely ignored in FF and IE. Is this a bug?负边距底部在 FF 和 IE 中完全被忽略。这是一个错误吗?
【发布时间】: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 是如何工作的”,情况就不应该如此。

标签: html css firefox


【解决方案1】:

这似乎是 Chrome 中的一个错误。

让我们从顶层分解您的示例。您的.parent 容器是块格式上下文根,因为它们是floating(CSS2.x 规范的section 9.4.1)。他们指定的heightauto(默认值)。根据section 10.6.7

...如果元素有任何浮动后代,其底部边距 边缘低于元素的底部内容边缘,则 高度为 增加以包括这些边缘

浮动后代(.float 元素)的下边距边缘是它们的下边界边缘,因为它们自己的下边距为零。该规范没有说明浮动后代的中间块包装器,因此.child 元素的高度小于.float 元素的事实不应该影响容器的高度,并且生成的容器高度应该是由浮动元素的高度(包括它们的边框)决定。这是我们在其他浏览器中看到的,如果我们从 .clear 元素中删除 clear: both; 属性,这也是我们在 Chrome 中看到的。

但是,clearing 块的存在以某种方式改变了 Chrome 中容器的行为。似乎浏览器“决定”在浮动元素下方有一些内容,并开始表现得好像高度由该内容决定,“忘记”浮动元素的底部边框实际上位于容器本身的底部内容边缘下方(位于.child 的底部边缘边缘)。

所以,如果你想裁剪块格式化上下文根的浮动后代,最好为这些浮动元素本身设置负边距。

【讨论】:

  • 我觉得它非常违反直觉,所以我正在努力争论......我已经阅读了 10.6.7 好几次,并试图找到与你的结论相矛盾的东西。我不习惯阅读这些东西……但是:“仅考虑参与此块格式化上下文的浮点数”。您所指的“中间块包装器”(即我所说的.child)......如果不建立 new 块格式化上下文 - 这意味着该错误实际上是在 FF 中。 .?
  • 如果它有display:flow-root/inline-block/table/table-cell/flex/gridoverflow:hidden/autofloat: left/right、任何column-count,或者如果它是fieldset元素,它将建立新的BFC。但在您的示例中,它只是一个常规块,参与其父 BFC 及其后代。
  • 我同意,这非常违反直觉。在我看来,CSS 中关于浮动/清除的几乎所有内容!
  • 确实如此:p
猜你喜欢
  • 2015-06-17
  • 2012-09-12
  • 1970-01-01
  • 2015-09-15
  • 2012-11-19
  • 1970-01-01
  • 2019-08-05
  • 1970-01-01
  • 2018-06-22
相关资源
最近更新 更多