【问题标题】:Understanding margin-collpasing了解边距折叠
【发布时间】:2020-05-13 20:55:59
【问题描述】:

我已经成功地将 h2 元素的边距包含在其容器 - section 元素中。这样它就不会随着 p 元素的边距折叠。我通过将部分元素的overflow 设置为auto 来完成此操作。

我的问题是:

  1. 由于overflow 设置为visible 以外的任何元素的边距不能折叠,为什么我成功实现的效果只有在容器(部分)元素设置为@ 时才有效987654327@?为什么h2元素设置为auto时不起作用?

  2. 当我们去掉 p 元素的边距,并且没有将 section 设置为 auto 时,h2 将失去其上边距。为什么会这样?它似乎没有与另一个会使其崩溃的边距接触。

如果有帮助,请查看 codepen! https://codepen.io/rfrostr/pen/XWmzewp

<header>
  <p>I am a p element.
  </p>
</header>

<section id="profile-section">
 <h2>I am a h2 element</h2>
</section>

【问题讨论】:

  • 2. h2 仍然它的边距,当你将它悬停在开发工具中时,你可以清楚地看到这一点。但是它会通过该部分折叠,因此该部分现在有效地具有一个margin-top,使其远离标题。 (这实际上是w3.org/TR/CSS21/box.html#collapsing-margins 的“相邻边距”部分,而不是实际的“折叠”。)

标签: css margin


【解决方案1】:

既然溢出设置为非可见元素的元素不能折叠边距,为什么我成功实现的效果只有在容器(部分)元素设置为自动时才有效?为什么h2元素设置为auto时不起作用?

这不是真的。溢出将禁用元素与其流入的第一个(或最后一个)子元素之间的边距折叠,而不是与其兄弟元素之间的边距折叠。溢出创建一个块格式化上下文,这会将内部的所有元素与任何外部交互隔离开来。

h2 {
  margin:10px 0;
  overflow:auto; /* this will do nothing */
}

.box {
  margin:10px 0;
  outline:1px solid red;
}
<div class="box">
<h2>some text</h2>
<h2>some text</h2>
</div>

<div class="box" style="overflow:auto;">
<h2>some text</h2>
<h2>some text</h2>
</div>

在上面的例子中,所有的边距都将折叠,但不是第二部分与其子 h2 之间的边距。

当我们去掉 p 元素的边距,并且没有将 section 设置为 auto 时,h2 失去了它的上边距。为什么会这样?它似乎没有与另一个会使其崩溃的边距接触。

h2 将与节的边距为 0 折叠,生成的边距将移动到节:

p {
  margin: 0;
} 

section {
  /*overflow: auto;*/
  background:red;
}
<header>
  <p>I am a p element
  </p>
</header>

<section id="profile-section">
 <h2>I am an h2 element</h2>
</section>

即使一个元素的边距等于 0,它也可以与其他边距折叠:

【讨论】:

  • 感谢您的回复。我知道存在 W3C 文档在谈论它,但我不太明白他们在说什么。您是否知道任何关于边缘折叠的资源可以帮助像我这样的初学者?
  • @rfrostr 我真的没有任何特定的来源,但总是尝试找到带有数字的来源(例如:seifi.org/css/…)并且总是尝试逐个测试。顺便说一句,你不需要知道一切,因为它没有用。您将在路上面对它们,并通过实践了解它们。如果您不练习,阅读大量信息对您无济于事。
  • 好的,关于'2.'...你能指出我在W3C Doc中的哪个地方说这种事情会发生吗?我只能从这个例子中推断出的全新规则是子元素的垂直填充可以在正确的条件下“添加到”父元素的边距(或其他人评论 - 通过父元素)。我还记得有人说根元素不受此规则的约束,即 body 上的 20px 顶部边距将受到尊重,并且正文将从 html 元素的 20px 向下移动。
  • @rfrostr 如果元素没有上边框、没有上边距并且孩子没有权限。 w3.org/TR/CSS21/box.html#collapsing-margins
  • 太棒了。好吧,这是今天的一个小胜利,我想我得到了所涵盖的内容。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2010-09-11
  • 2011-02-09
  • 2017-07-27
  • 2017-07-09
  • 1970-01-01
  • 2018-10-30
  • 2017-02-16
  • 2015-01-19
相关资源
最近更新 更多