html – 边缘与浮动元素折叠

前端之家收集整理的这篇文章主要介绍了html – 边缘与浮动元素折叠前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
更新:Firefox上不显示以下行为.

让我们从以下情况开始:

html {
  background: red;
}

body {
  margin: 0;
  min-height: 100vh;
  background-color: green;
}

div {
  min-height: 50px;
  background-color: pink;
  margin-bottom: 50px;
}
<div></div>

主体定义为最小高度:100vh,我们有一个滚动条,允许我们看到html.在这里,我们有一个边缘折叠,div的边缘与主体边缘折叠,从而在主体和滚动条之后创建这个空间.

如果我们参考specification,我们就有这种情况:

Two margins are adjoining if and only if:

bottom margin of a last in-flow child and bottom margin of its parent
if the parent has ‘auto’ computed height

div是最后一个in-flow元素,body是auto auto,因为我们只指定了min-height.

现在让我们添加更多可能受此边际影响的元素,并保持边距折叠规则.唯一的方法添加浮动元素以保持我们的div始终是最后一个in-flow元素.

这是新代码

html {
  background: red;
}

body {
  margin: 0;
  min-height: 100vh;
  background-color: green;
}

div {
  min-height: 50px;
  background-color: pink;
  margin-bottom: 50px;
}
.l {
  width:45%;
  height:50px;
  float:left;
  margin:0;
}
.r {
  width:45%;
  height:50px;
  float:right;
  margin:0;
}
<div></div>
<div class="l"></div>
<div class="r"></div>

我们可以清楚地看到,我们仍然有边缘折叠(因为滚动)并且浮动元素也被相同数量的边距向下推.

所以我的问题是:为什么这样的行为?

我对保证金崩溃的理解是,最后我们只会在某处应用一个保证金.通过添加新元素,我希望有以下两种情况之一:

>添加浮动元素将以某种方式取消边缘折叠(这可能不是这种情况,因为我们没有违反任何规则)
>浮动元素不会受到边缘的影响,因为这个浮动元素与身体边缘折叠并因此移动/应用于身体. (这是我的逻辑案例)

在规范中我也发现了这个复杂的陈述:

Note that the positions of elements that have been collapsed through
have no effect on the positions of the other elements with whose
margins they are being collapsed; the top border edge position is only
required for laying out descendants of these elements.

我从上面可以理解,其他元素不受边缘折叠的影响,因此保持其初始位置,这解释了浮动元素被推下的原因. (顺便说一下,我不确定是否属于这种情况)

如果这是解释,那对我来说有点混乱和不合逻辑.我添加了一个边距,最终我有两个明显可见的边距?

那么为什么会这样呢?或许我错过了规范中的一些内容,而且我们面临的不仅仅是简单的边缘崩溃?

重要提示:在回答之前,请注意我不是要找到解决方法或如何避免这种情况.我知道至少有5种方法可以取消边缘折叠(填充,溢出,边框,弹性框等).我希望了解为什么会发生这种情况.

作为参考:这是从this question开始的,其中@Alohci在我的回答中突出显示了这一点,在几条评论之后我们都没有被说服

解决方法

在开始之前,滚动条在所有浏览器中呈现的问题,但Firefox是一个单独的问题,与此处的问题有关.当父元素的最小高度导致边距不相邻时,Firefox不会折叠父元素与其子元素之间的边距. It’s also a known spec violation in Firefox that’s being worked on and yet to be fixed.

现在,关于手头的问题.从第9.5.1节(关于浮标):

  1. A floating Box’s outer top may not be higher than the top of its containing block. When the float occurs between two collapsing margins,the float is positioned as if it had an otherwise empty anonymous block parent taking part in the flow. The position of such a parent is defined by the rules in the section on margin collapsing.

这句话中的最后一句话很尴尬,但“规则”引用(并链接)到折叠的定义.虽然您从该部分引用的特定文本是相关的,但它并不能解释为什么浮点数会影响流入div的边界.

这样做:

If the top and bottom margins of a Box are adjoining,then it is possible for margins to collapse through it. In this case,the position of the element depends on its relationship with the other elements whose margins are being collapsed.

  • […]

  • Otherwise,either the element’s parent is not taking part in the margin collapsing,or only the parent’s bottom margin is involved. The position of the element’s top border edge is the same as it would have been if the element had a non-zero bottom border.

注意最后一句.如您所知,具有非零底部边框会取消边距折叠.这意味着浮子的位置就像流入的div和主体元件的底部边缘没有坍塌一样,导致浮子看起来相对于流入div的底部边缘.

我如何判断浮标是否特别尊重流入div的底部边缘而不是崩溃的边缘?通过给身体提供比流入div更大的底部边距,并观察它不会影响浮子的位置:

html {
  background: red;
}

body {
  margin: 0;
  margin-bottom: 100px;
  min-height: 100vh;
  background-color: green;
}

div {
  min-height: 50px;
  background-color: pink;
  margin-bottom: 50px;
}
.l {
  width:45%;
  height:50px;
  float:left;
  margin:0;
}
.r {
  width:45%;
  height:50px;
  float:right;
  margin:0;
}
<div></div>
<div class="l"></div>
<div class="r"></div>
原文链接:https://www.f2er.com/html/231668.html

猜你在找的HTML相关文章