如何使 div 在浏览器中占据视口高度的 100%?

5

我有一个div标签,但我发现它没有像应该的那样填满100%的高度。

我的代码:

#container {
  width: 100vw;
  height: 100vh;
  background: purple;
}

body {
  margin: 0px;
}

<div id="container"></div>
<div id="container"></div>

发生了什么?

好吧,如果我只有上面那段代码片段,将div放置在整个视口中肯定是100%的!问题是,我的页面不只有这个代码,我有更多的东西,并且我将此代码部分插入了body标签内的某个“位置”,也就是说,在这个div之前我插入了一些元素,但它并没有占据整个视口,请看如下:

在你的页面上呈现出来的结果是怎样的?

enter image description here

我滚动了页面,但是我的div仍然无法占据整个视口。难道我不正确吗?如果这应该发生,为什么没有发生?

解释:伙计们,我发现了问题,但是我不知道如何解决,好吧,事情是这样的,当容器div上方或下方有元素时,该div不会占据整个视口,看看这张图片:

enter image description here

造成这种情况的代码:

我的HTML代码:

body {
  color: red;
  background: green;
  margin: 0;
  padding: 0;
}

#container {
  width: 100vw;
  height: 100vh;
  z-index: 1;
  background: purple;
}

p {
  font-size: 20pt;
}
<div id="container"></div>
<p>ksksks</p>

上面的图像中发生的问题与我的页面上发生的问题相同,即如果页面上没有元素,则div仅填充视口高度的100%,而我希望能够使其在页面上具有元素的情况下也占据视口的高度100%。
编辑:
显然,我看到了许多答案,其中大部分都不起作用或解释错误或提供无法解决问题的答案,其他人建议使用固定位置来解决问题,但是我不想这样做,认为您有一个聊天,因为您希望它具有滚动弹幕,它将成为占据整个视口的聊天,而不是另一个div,明白吗? 这种解决方案确实解决了问题,但我不喜欢“拼凑”的方法。
我想知道更优雅的解决方法,例如,我的div容器占据了视口的100%,但是我不希望出现其他元素,我希望div容器重叠任何应该出现的元素,并且我不想滚动页面。
总结:
简而言之,div应占据视口的100%,确保body没有滚动并且页面返回顶部,即使用户在页面上的任何位置,我也希望页面返回顶部并禁用滚动,最好不要使用JavaScript,如果可能的话,请在html和css中编写,我将利用此答案中的奖励补充这一点,并要求解决此问题的解决方案。

@PeterNielsen "另外,你的内容不在div中" - 这有什么关系吗? - Roko C. Buljan
我想让div占据整个屏幕的原因是我要做一个聊天界面,需要让它占据整个视口,为此我需要解决这个问题。我的问题就是这个,因为问题是一样的。 - user15594988
2
啊,没关系,抱歉,我不太常用这个平台。 - user15594988
我想让高度在页面上即使有其他元素也能达到视口的100%。-->那么您希望如何放置页面上的其他元素? - Nitesh Phadatare
1
@Gjsks 这个问题在Chrome或Safari中也会发生吗? - edisonthk
显示剩余11条评论
8个回答

4
问题出在vhvw单位没有考虑到(添加的)滚动条的宽度/高度。只要页面不高于视口,就不会出现滚动条,100vh就是视口的高度,一切正常工作。
但是一旦有更多内容位于上下方,将显示垂直滚动条:此时width: 100vw比窗口宽度减去垂直滚动条还要宽,因此出现了水平滚动条,现在height: 100vh高于窗口高度减去(水平)滚动条。
我认为这是一种bug,但大多数浏览器似乎都是这样的。我很久以前发布过类似问题的帖子:Problem using vw units when a vertical scrollbar appears (full-width elements in WordPress) 在评论后添加/编辑:
我认为没有100%安全的解决方案。但是一个在某种程度上有所帮助的方法是不要使用100vw来设置width,而是使用100%,它会考虑(垂直)滚动条。然而,width: 100%;在任何块级元素中都是默认设置,所以您可以简单地删除width设置并仅使用height: 100vh,只要您没有任何特殊的宽度要求,那么它就可以工作(即具有完全相同的视口高度)。

2
一个有用的解决方案,适用于vw:https://dev59.com/questions/XFwX5IYBdhLWcg3wnwgy - Atomkind
1
好的,但我看了一些答案,但我不明白如何解决这个问题,有什么想法吗? - user15594988
请注意,我回答中有一项新增内容。 - Johannes
我修改了这段代码:#container { width:100vw; height: 100vh; background:purple},改为#container {height: 100vh; background:purple; ,结果相同。 - user15594988
2
你可以用英语写吗? - Johannes
我将这段代码片段 #container { width:100vw; height: 100vh; background:purple} 改为了 #container {height: 100vh; background:purple;,结果没有变化。 - user15594988

1
最简单的解决方法是利用视口高度(vh)和视口宽度(vw)单位来设置块的高度和宽度。这个块/ div将填满整个浏览器窗口空间。这里有一个例子。
div.container {
    height: 100vh;
    width: 100vw;
}

请确保在您的<head>标签中添加以下视口元标记

<meta name="viewport" content="width=device-width, initial-scale=1.0">

这将为浏览器提供如何控制页面尺寸和缩放的指令。其中width=device-width部分设置页面宽度以遵循设备的屏幕宽度(这将因设备而异)。 initial-scale=1.0 部分在浏览器首次加载页面时设置初始缩放级别。如果缺少meta标签,则初始比例和缩放可能会出现问题。同时,将您的<p>放入容器div中。 这是工作演示。

我的代码:

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

#container {
  width: 100vw;
  height: 100vh;
  background: purple;
}

p {
  height: 100%;
  width: 100%;
  background-color: rgba(255,255,255, .8);
}

<div id="container"></div>
<div id="container">
  <p>
    Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
  </p>
</div>


p标签仍然占据友好的空间。如果有人正确回答这个问题,我将提供150个奖励积分,因为显然在所有答案中几乎都有相同的问题。 - Dakota
@Dakota,请检查添加的代码片段。已测试解决方案并正常工作。希望能有所帮助。 - Kiran Maniya

1
你将紫色背景应用到高度达100vh的区域, 如果你想完全看到紫色,只需在body标签中添加紫色而不是绿色,或者你可以将div放置在容器内。这里没有问题,你只需要调整你的代码。

body {
  color: red;
  background: purple;
  margin: 0;
  padding: 0;
}

#container {
  width: 100vw;
  height: 100vh;
  z-index: 1;

}

p {
  font-size: 20pt;
}
<div id="container"></div>
<p>ksksks</p>


1
不,目标是使 div 占据视口的 100%。他在 div 中放置紫色背景,以便人们可以更好地查看它。 - Dakota

1
我已经尝试了这些代码,看起来它们是有效的。您可以检查一下:

body {
  color: red;
  background: green;
  margin: 0;
  padding: 0;
}

#container {
  width: 100vw;
  height: 100vh;
  z-index: 1;
  background: purple;
}

p {
  font-size: 20pt;
}
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="stylesheet" href="main.css">
</head>

<body>

  <div id="container"></div>
  <p>ksksks</p>
</body>

</html>


1
请在标签内使用以下元标记:
<meta name="viewport" content="width=device-width, initial-scale=1">

<html>

<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <style>
    body {
      color: red;
      background: green;
      margin: 0;
      padding: 0;
    }
    
    #container {
      width: 100vw;
      height: 100vh;
      z-index: 1;
      background: purple;
    }
    
    p {
      font-size: 20pt;
    }
  </style>
</head>

<body>
  <div id="container"></div>
  <p>ksksks</p>
</body>

</html>


1
根据您的问题,您希望 div 占据空间而不是紫色背景,对吗?
CSS:
#container {
  width: 100vw;
  height: 100%;
  background: purple;
}

body {
  margin: 0px;
  
}

#innerDiv {
  height: 100vw;
  background-color: red;
  width: 100vw;

}

#innerDiv1 {
  height: 100%;
  background-color: blue;
  width: 100vw;
  
}

Html:

<div id="container">
</div>

<div id="innerDiv">Div #1</div>
<div id="innerDiv1">Div #2</div>

1
这只是一个解决方法,我通常将其用作移动汉堡菜单并全屏显示。你必须小心,因为它强制覆盖整个页面,如果页面上已经存在其他元素,它将隐藏所有元素。
.container {
    # it make the container always on the page regardless any element or window margin
    position: fixed;
    top: 0;
    left: 0;
    z-index: 999;

    height: 100vh;
    width: 100vw;
}

-1

似乎没有问题。

#container {
  width: 100vw;
  height: 100vh;
  background: purple;
}

body {
  margin: 0px;
}

#innerDiv {
  height: 100px;
  background-color: red;
  width: 100vw;
}

#innerDiv1 {
  height: 100px;
  background-color: blue;
  width: 100vw;
}
<div id="container">
</div>

<div id="innerDiv">Div #1</div>
<div id="innerDiv1">Div #2</div>


朋友,如果我只有容器,它可以工作,否则,我需要一个 div,即使页面上有另一个元素,它也可以占据整个视口。 - user15594988

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