<html>,<body>,padding,margin,100vh和calc()

Mar*_*ssa 5 html css

请考虑以下代码段:

html {
  margin: 0;
  padding: 0;
  background-color: blue;
}

body {
  margin: 0;
  padding: 0;
  background-color: green;
  min-height: 100vh;
}
Run Code Online (Sandbox Code Playgroud)
<section style="min-height: 50px; background-color: pink;"></section>
Run Code Online (Sandbox Code Playgroud)

正如所料,body元素以绿色填充整个视口,顶部有一个粉红色的section元素.

现在,假设你想做一些非常简单的事情,比如在section元素中设置一个边距:style="min-height: 50px; background-color: pink; margin-bottom: 10px;".出乎意料的是,html元素中的蓝色条带出现在视口的底部.

html {
  margin: 0;
  padding: 0;
  background-color: blue;
}

body {
  margin: 0;
  padding: 0;
  background-color: green;
  min-height: 100vh;
}
Run Code Online (Sandbox Code Playgroud)
<section style="min-height: 50px; background-color: pink; margin-bottom: 10px;"></section>
Run Code Online (Sandbox Code Playgroud)

问题1)为什么会这样?这对我来说没有意义.

纠正此行为的一种方法是min-height在body元素中包含padding和calc()调整:

html {
  margin: 0;
  padding: 0;
  background-color: blue;
}

body {
  margin: 0;
  padding: 0;
  padding-bottom: 1px;
  background-color: green;
  min-height: calc(100vh - 1px);
}
Run Code Online (Sandbox Code Playgroud)
<section style="min-height: 50px; background-color: pink; margin-bottom: 10px;"></section>
Run Code Online (Sandbox Code Playgroud)

但是,这个解决方案需要我不熟悉的噱头.

问题2有更好的解决方案吗?(即:更直观,更易读)

Tem*_*fif 2

您正面临利润崩溃的问题。您应用于部分的底部边距与正文的底部边距合并,因此它应用于正文而不是部分。

正如您可以在这里阅读的:

块的顶部和底部边距有时会组合(折叠)为单个边距,其大小是各个边距中最大的(或者只是其中一个,如果它们相等),这种行为称为边距折叠

边距崩溃发生在三种基本情况下:

相邻的兄弟姐妹

父母和第一个/最后一个孩子

空块

这就是为什么在你的情况下,你有 10px 的边距底部,将滚动添加到你的页面,因为 body 有一个min-height:100vh

html {
  margin: 0;
  padding: 0;
  background-color: blue;
}

body {
  margin: 0;
  padding: 0;
  background-color: green;
  min-height: 100vh;
}
Run Code Online (Sandbox Code Playgroud)
<section style="min-height: 50px; background-color: pink;margin-bottom: 10px;"></section>
Run Code Online (Sandbox Code Playgroud)

为了避免这种行为,您只需避免边距折叠即可。因此,您可以像以前一样添加一个小填充或边框,然后不要忘记添加box-sizing:border-box以避免更改高度和使用calc

html {
  margin: 0;
  padding: 0;
  background-color: blue;
}

body {
  margin: 0;
  padding: 0;
  background-color: green;
  min-height: 100vh;
  border-bottom:1px solid transparent;
  /* OR padding-bottom:1px */
  box-sizing:border-box;
}
Run Code Online (Sandbox Code Playgroud)
<section style="min-height: 50px; background-color: pink;margin-bottom: 10px;"></section>
Run Code Online (Sandbox Code Playgroud)

您还可以使用 Flex,因为 Flex 不会导致边距折叠(查看下面的链接以了解更多方法)

html {
  margin: 0;
  padding: 0;
  background-color: blue;
}

body {
  margin: 0;
  padding: 0;
  background-color: green;
  min-height: 100vh;
  display:flex;
  flex-direction:column;
}
Run Code Online (Sandbox Code Playgroud)
<section style="min-height: 50px; background-color: pink;margin-bottom: 10px;"></section>
Run Code Online (Sandbox Code Playgroud)


一些可以帮助您获取更多信息的链接:

https://css-tricks.com/what-you-should-know-about-collapsing-margins/

如何展开边距?

CSS边距恐怖;边距在父元素外部添加空间

子元素的边距移动父元素

Flexbox 中的边距崩溃