CSS 高度全页 CSS 陷阱:如何使用 div 填充页面?

2025-05-25

CSS 高度全页CSS 陷阱:如何使用 div 填充页面?

TL;DR

如果您想要一个全页容器 div,请确保您具有以下内容:



/* override browser default */
html,
body {
  margin: 0;
  padding: 0;
}

/* use viewport-relative units to cover page fully */
body {
  height: 100vh;
  width: 100vw;
}

/* include border and padding in element width and height */
* {
  box-sizing: border-box;
}

/* full-sized  container that fills up the page */
div {
  height: 100%;
  width: 100%;

  /* example padding, font-size, background, etc */
  padding: 10px;
  font-size: 20px;
  background-color: lightskyblue;
}


Enter fullscreen mode Exit fullscreen mode

假设您想要一个填满整个页面的 div...



div {
  height: 100%;
  width: 100%;

  font-size: 20px;
  background-color: lightskyblue;
}


Enter fullscreen mode Exit fullscreen mode

./无标题.png

什么?!不行!高度仍然只占内容,而不是整个页面。

这个宽度很好,因为 div 默认是一个块元素,无论如何它都会占用尽可能多的宽度。

我们可以使用更“绝对”的值吗px



div {
  /* height: 100% */
  height: 865px; /* current height of my browser */
  /* ... */
}


Enter fullscreen mode Exit fullscreen mode

它可以工作...直到浏览器调整大小

不起作用

当浏览器调整大小时它不会适应。

您可以为此使用 JS,但这对我们的期望来说太过分了。

我提到的px“绝对”是指它们不相对于任何其他元素(例如 rem 和 vh)。但实际尺寸仍然取决于设备。以下是一些详细信息:

Stack Overflow:CSS 像素真的是一个绝对单位吗?

相关单位赶来救援!

老派height: 100%



html,
body {
  height: 100%;
  width: 100%;
}

div {
  height: 100%;
  /* ... */
}


Enter fullscreen mode Exit fullscreen mode

成功了!(我们稍后会修复滚动条)

通过将两者<html>及其子项的<body>高度设置为 100%,我们实现了完整尺寸。

请注意,仅设置其中任何一个都不会起作用,因为百分比总是相对于另一个值。

在这种情况下:

  • div是 100% 的高度body
  • body是 100% 的高度html
  • html是视口高度的 100%

视口是浏览器的可见区域,根据设备不同而不同。

视口 > html> body>div

例如,iPhone 6/7/8 的视口为 375x667。您可以在浏览器的开发者工具移动选项中验证这一点。

目前,你可以将视口视为设备像素大小或分辨率。但如果你想深入了解:

媒体起源:屏幕尺寸、分辨率和视口:这一切意味着什么?

较新的解决方案:视口单位vhvw

视口百分比长度(又名视口单位)已经存在了一段时间,非常适合响应浏览器大小调整。

  • 1 视口高度 ( 1vh) = 视口高度的 1%
  • 1 视口宽度 ( 1vw) = 视口宽度的 1%

换句话说,100vh= 100% 的视口高度

100vw= 100% 视口宽度

因此这些有效地填满了设备视口。



html,
body {
  /* height: 100%; */
  /* width: 100% */
}

div {
  /* height: 100%; 
        width: 100%; */
  height: 100vh;
  width: 100vw;
  /* ... */
}


Enter fullscreen mode Exit fullscreen mode

看起来也不错!(我们稍后会修复滚动条)

正如@angelsixuk@mpuckett在评论中提到的,在移动浏览器上使用时,滚动时会出现已知的跳跃行为100vh,这是一个问题,但 Webkit 认为这是故意为之。详情请参阅以下链接:在某些移动浏览器中,视口高度高于文档可见部分;以及Stack Overflow:CSS3 100vh 在移动浏览器中不稳定

怎么样min-height: 100vh

Whileheight将长度固定为100vhmin-height起始于100vh,但允许内容延伸到 div 超出该长度。如果内容小于指定的长度,min-height则无效。

换句话说,min-height确保元素至少具有该长度,并且height如果height已定义且小于则覆盖min-height

对于我们的目标是让 div 子元素具有完整的高度和宽度,这并没有什么区别,因为内容也是完整大小的。

一个很好的用例min-height是使用粘性页脚,当页面上有更多内容时,它会被推送。查看这里以及其他 vh 的良好用法

视口单位的乐趣 | CSS-Tricks

一种非常常见的做法是直接height: 100vh应用...width: 100vw<body>

在这种情况下,我们甚至可以像一开始一样保持容器的div相对大小,以防我们以后改变主意。

通过这种方法,我们可以确保整个 DOM 主体占据整个高度和宽度,而不管我们的容器 div 如何。



body {
  height: 100vh;
  width: 100vw;
}

div {
  height: 100%;
  width: 100%;
  /* height: 100vh;
  width: 100vw; */
  /* ... */
}


Enter fullscreen mode Exit fullscreen mode

vh/vw相对%

思考vh, vwvs的一个好方法%是,它们类似于emandrem

%em都是相对于父级大小的,而vw/vhrem都是相对于“最高参考”的,根字体大小为 rem,设备视口为 vh/vw。

但为什么要有滚动条?

<html><body>具有默认边距和填充!

浏览器对 HTML 元素设置了默认的边距、填充和边框。最糟糕的是,每个浏览器的默认设置都不一样!

Chrome 默认<body>有一个margin: 8px

100vh + 8px导致溢出,因为它超出了视口

幸运的是,解决这个问题相当容易:



html,
body {
  margin: 0;
  padding: 0;
}

body {...


Enter fullscreen mode Exit fullscreen mode

这是一个“全面”的解决方案,可以涵盖您可能拥有的任何浏览器的所有边距和填充变化。

太棒了!现在我们的 div 已经填满了整个页面,而且没有滚动条!

不再有滚动条

最后,让我们添加一点填充,因为内容位于边缘处会很尴尬。



div {
  padding: 10px;
  /* ... */
}


Enter fullscreen mode Exit fullscreen mode

什么?!滚动条又回来了!发生了什么?

box-sizing边框

box-sizing允许您定义填充和边框是否包含在 div 的高度和宽度中。

content-box默认值box-sizing不包括padding和border的长度,所以div变成

  • height = 100% + 10px * 2
  • width = 100% + 10px * 2

溢出页面!

border-box包括填充和边框,因此 div 保持我们所需的大小:

  • height = 100%
  • width = 100%

使用选择器将所有元素设置border-box为整个页面的一致布局和大小是很常见的*



* {
box-sizing: border-box;
}

Enter fullscreen mode Exit fullscreen mode




完美的!

下次再见!

文章来源:https://dev.to/lennythedev/css-gotcha-how-to-fill-page-with-a-div-270j
PREV
🌱 10 分钟内使用 MongoDB Atlas 云、Node 和 Express 完成 REST API 云设置连接到数据库 CRUD 路由 Node 研讨会
NEXT
2019 年及以后的 Java