当前位置: 首页 > 面试题库 >

保证金因浮动元素而崩溃,为什么还要增加额外的保证金?

章建木
2023-03-14
问题内容

更新 :以下行为在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>

主体用定义,min-height:100vh我们有一个滚动条,让我们可以看到html。在这里,我们有一个 margin-colapsing
,边距div与主体边距一起折叠,从而在主体和滚动条之后创建此空间。

如果我们参考规范,则有这种情况:

当且仅当以下情况,两个边距相邻:

最后一个流入子项的底边距及其父项的底边距(如果父级具有“自动”计算的高度)

该元素div最后一个流入 元素,并且body具有高度自动值,因为我们仅指定了最小高度。

现在,让我们添加更多可能受此边距影响的元素,并保留边距折叠规则。唯一的方法是添加 浮动 元素,以使我们div始终是最后一个流入元素。

这是新代码:

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>

正如我们可以清楚地看到的那样,由于滚动的缘故,我们仍然有边际崩溃,并且浮动元素也被下压了相同数量的边际。

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

我对保证金崩溃的理解是,最后,我们将仅在某处应用 一个 保证金。通过添加新元素,我期望会出现以下两种情况之一:

  1. 添加浮动元素将以某种方式取消边距崩溃 (这不会发生,因为我们没有违反任何规则)
  2. 浮动元素不会受到边距的影响,因为此元素随着身体边缘塌陷并因此移动/应用到了身体。 (这对我来说是一个逻辑案例)

在规范中,我还发现了以下 复杂 语句:

请注意,已折叠的元素的位置对其他以其边距折叠的元素的位置没有影响;仅在布置这些元素的后代时才需要顶部边框边缘位置。

从以上内容可以理解,其他元素不受边界收缩的影响,因此保持其初始位置,这解释了为什么浮动元素被向下推。 (我不确定是否是这种情况)

如果这是解释,那么对我来说有点混乱和不合逻辑。我增加了 一个 边距,最后却有 两个 清晰可见的边距?

那么为什么会这样呢?还是我错过了规范中的某些内容,而我们所面临的不仅仅是简单的边际崩溃?

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

供参考 :这是从这个问题开始的,@Alohci在我的回答中突出了这一点,经过几番评论,我们俩都没有被说服


问题答案:

在我开始之前,所有浏览器中都会呈现滚动条的问题,但Firefox是一个与此处所询问的问题不同的问题。当父元素与其子元素之间min-height的边距不相邻时,Firefox不会折叠其父元素与其子元素之间的边距。在Firefox中,这也是已知的违反规范的问题,目前仍在解决,尚待解决。

现在,讨论当前的问题。从第9.5.1节开始(关于浮动):

4.
浮动框的外部顶部不得高于其包含的块的顶部。当浮动发生在两个折叠边距之间时,浮动的位置就好像是有一个空的匿名块父级参与了流程。这样的父母的位置由保证金崩溃部分中的规则定义。

该引号中的最后一句很尴尬,但是“规则”是指(和链接)崩溃的定义。虽然您从该部分引用的特定文本是相关的,但并未说明浮动内容为何尊重流入量的余量div

这样做:

如果框的顶部和底部边距相邻,则边缘可能会通过它塌陷。在这种情况下,元素的位置取决于其与其边距被折叠的其他元素的关系。

  • […]

  • 否则,要么元素的父级不参与边距崩溃,要么仅涉及父级的底边距。元素的顶部边框边缘的位置与元素的底部边框非零时的位置相同。

注意最后一句话。如您所知,底部边框不为零将消除边距折叠。这意味着浮子的位置就好像流入流的底部边缘div并且body元素 没有
塌陷,导致浮子似乎尊重流入流的底部边缘div

我如何知道浮标专门考虑流入量的底边div不是
倒塌边?通过提供body比流入流量更大的底边距,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>


 类似资料:
  • 问题内容: 这套巧妙的规则对您有所帮助,只是无法弄清楚情况。当您将不同的布局组合在一起时,它们打破了盒模型的简单性,并提供了无限的麻烦源。那是什么原因呢? 更新:规则对于同级元素非常合乎逻辑,但是为什么边距应该传播到树上的父元素?解决什么样的问题? 例如: 顶级div彼此间隔100像素。 问题答案: 这是一种情况,在您意识到替代方案的意义不大之前,它才真正有意义。 您可能知道,边距指定了元素之间的

  • 问题内容: 我正在处理一些设置为并具有和的。在HTML中,如果在每行之后都有一个换行符,则会在div的右侧和底部自动添加5px的边距。 例: 是否有我忽略的属性可以让我重置自动保证金? 更新资料 从我发现的结果来看,没有任何方法可以消除空白…除非您将所有内容都放在同一行,或者添加注释以注释掉换行符。例: 这不是最佳的解决方案,但是如果您有多行,它仍然更易于阅读。 问题答案: div被视为内联元素。

  • 问题内容: 我有一个div,在该div内,我有一个无序列表。我已将其应用于无序列表,但不会在标头div中居中。 有人可以告诉我为什么吗?我认为,如果我定义父div的宽度,那么无序列表应该能够以居中。我想念什么? 这是我的代码: 问题答案: 您需要定义要居中的元素的宽度,而不是父元素。 编辑 :好的,我现在已经看到了测试页,这就是我认为您想要的:

  • 问题内容: 我有一个带有某些样式的简单html页面,但我不明白为什么会增加一些顶部边距? 来源如下: 如果我添加“ margin-top:0;” 到了空间已经消失了……但是直到我明白为什么我才感到不高兴。 问题答案: 上的空白来自浏览器添加到元素的默认样式。例如,如果您打开的并检查元素,您将看到这样的样式。该用户代理样式表是指浏览器默认样式。保证金变成16px为浏览器有一个默认。 由于浏览器之间的

  • 问题内容: 假设您有一个,给它一个定值,然后在其中添加元素,在我的情况下为另一个。 这个想法是容器的内容将导致容器伸展,并成为内容的背景。但是,当我这样做时,包含的对象会缩小以适合非漂浮的对象,并且漂浮的对象将要么全部伸出,要么一半伸出,一半进入,并且对big的大小没有任何影响。 为什么是这样?有什么我想念的东西,怎么才能让漂浮的物品伸出其中的东西呢? 问题答案: 最简单的方法是放在父div上,而

  • 问题内容: 我想问一下高度和漂浮物是如何工作的。我有一个外部div和一个内部div,其中包含内容。它的高度可能取决于内部div 的内容,但似乎我的内部div会溢出其外部div。正确的做法是什么? 问题答案: float大多数初学者都误解了该属性。好吧,到底是做float什么的?最初,float引入了该属性,以使文字围绕图像浮动left或浮动right。这是 @Madara Uchicha 的另一种