CSS:margin-top 导致滚动条

25

h1元素会导致滚动条出现。有人能解释一下为什么吗?

html, body {
  margin: 0;
  padding: 0;
  height: 100%;
}
header {
  height:10%;
}
section {
  height:90%;
}
<header>
  <h1>
    Hello
  </h1>
</header>
<section>
  test
</section>

5个回答

18
那是因为:
  • h1通常有默认的一些垂直边距,通常为0.67em
  • h1的顶部外边距会折叠。
  • height不包括外边距的高度。
由于h1的顶部外边距会折叠,所以它表现得像是外边距属于header而不是h1。由于h1的内容高度为10%,所以它的总高度将为calc(10% + 0.67em)
这就是为什么会发生溢出的原因。
如果删除顶部外边距但保留底部外边距,则没有问题,因为由于非autoheight,底部外边距不会折叠。参考自折叠margin

如果[...]两个外边距相邻且都属于相邻的盒子边缘[...]例如:

  • 一个盒子的顶部外边距和它的第一个流动子元素的顶部外边距
  • 最后一个流动子元素的底部外边距和父元素的底部外边距如果父元素具有auto计算高度。
因此,您可以执行以下任何操作:
  • 删除h1的顶部外边距
  • 防止外边距折叠
  • 向CSS工作组建议box-sizing: margin-box。它可能会被拒绝。

1
这实际上是最好的答案。但是有一些问题:如果我只有一个带边距的元素,边距如何折叠?其次,在您的建议中,您推荐哪种解决方案? - Matthew
我提到了 margin-bottom,因为在许多(大多数?)情况下,h1 下面会有其他元素。我假设问题提供了一个高度简化的示例。在实际使用中,margin-bottom 可能会产生影响。但是我同意在这种情况下只有 margin-top 有影响。 - Michael Benjamin
@Matthew 如果你不需要边距,我会把它移除掉。否则,我会使用 h1{ display: inline-block } 或类似的方法来防止边距折叠。 - Oriol
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Oriol
1
h1header的上边距会发生折叠。因此,它们的行为就像h1没有上边距,而header的上边距等于其自身上边距(0)和h1上边距中的最大值。 - Oriol
显示剩余2条评论

6
因为 h1 具有由 默认样式表 应用的边距。
当你将该边距(通常是 margin-top: .67emmargin-bottom: .67em)添加到代码中的 height: 100% 中时,这会超出视口高度,从而启动垂直滚动条。
h1 设置 margin: 0
无论使用 box-sizing: content-box 还是 border-box,边距空间始终会添加到你的 height 声明中。
如果你想在不增加高度的情况下在 h1 周围添加空间,请改用 padding 而非 margin,并使用 box-sizing: border-box。以下是一些实施选项:https://css-tricks.com/box-sizing/

1

h1默认带有边距。

enter image description here


我知道h1有一个margin。但是为什么它会导致滚动条出现?header占视口的10%,section占90%。h1包含在header中。 - Matthew

1

*
{
  margin:0px auto;
}
html, body {
  margin: 0 ;
  padding: 0;
  height: 100%;
}
header {
  height:10%;
}
section {
  height:90%;
}
<header>
  <h1>
    Hello
  </h1>
</header>
<section>

  test
</section>

只需添加通用选择器并将边距设置为 *{margin:0px auto;}。希望它能起作用。


@AliMottaghiPour 使用*{margin:0px auto}auto来让浏览器计算边距是一个很好的习惯。 - Sampad
为了重置 CSS 样式,您必须使用 * { margin:0; }。 - Ali Mottaghi Pour
@AliMottaghiPour 你说得完全正确,但是通用选择器 * 使用了 流下 技术,无论你在这里定义什么都会被继承。 - Sampad

1

标签在块级元素中有一些边距。

要消除这种额外的边距和填充,建议将所有元素的边距和填充重置为0。

可以通过以下方式实现:

 * {
     margin: 0;
     padding: 0;
 }

* {
  margin: 0;
  padding: 0;
}
html, body {
  height: 100%;
}
header {
  height:10%;
}
section {
<header>
  <h1>
    Hello
  </h1>
</header>
<section>
  test
</section>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接