ChatGPT解决这个技术问题 Extra ChatGPT

如何使浏览器窗口的 div 高度为 100%

我有一个包含两列的布局 - 左 div 和右 div

右边的 div 有一个灰色的 background-color,我需要它根据用户浏览器窗口的高度垂直展开。现在,background-color 结束于该 div 中的最后一段内容。

我试过 height:100%min-height:100%; 等。

愿你会发现这个问题有用stackoverflow.com/questions/1366548/…
好方法,但众所周知,vh、vw 等单位有问题。如果您需要,可以使用这个轻量级 js 替代方案:joaocunha.github.io/vunit
下面是对带有百分比值的 CSS height 属性的简单而清晰的解释:stackoverflow.com/a/31728799/3597276
你可以使用高度:100vh; CSS 属性
尝试使用这个最小高度:100vh

D
Dan Dascalescu

有几个 CSS 3 度量单位称为:

视口百分比(或视口相对)长度

什么是视口百分比长度?

从上面链接的 W3 候选推荐中:

视口百分比长度与初始包含块的大小有关。当初始包含块的高度或宽度发生变化时,它们会相应地缩放。

这些单位是 vh(视口高度)、vw(视口宽度)、vmin(视口最小长度)和 vmax(视口最大长度)。

如何使用它来使分隔线填充浏览器的高度?

对于这个问题,我们可以利用 vh1vh 等于视口高度的 1%。也就是说,100vh 等于浏览器窗口的高度,与元素在 DOM 树中的位置无关:

HTML

<div></div>

CSS

div {
    height: 100vh;
}

这实际上就是所有需要的。这是使用中的JSFiddle example

哪些浏览器支持这些新单元?

目前,除 Opera Mini 外,所有最新的主流浏览器都支持此功能。查看 Can I use... 以获得更多支持。

这如何与多列一起使用?

对于手头的问题,具有左右分隔符,这里有一个 JSFiddle example,显示了一个包含 vhvw 的两列布局。

100vh 与 100% 有何不同?

以这种布局为例:

<body style="height: 100%">
    <div style="height: 200px">
        <p style="height: 100%; display: block;">Hello, world!</p>
    </div>
</body>

这里的 p 标记设置为 100% 高度,但是因为它包含的 div 有 200 像素高度,所以 200 像素的 100% 变成了 200 像素,不是 body 高度的 100% .改用 100vh 意味着 p 标记将是 body 的 100% 高度,而与 div 高度无关。看看这个 accompanying JSFiddle 即可轻松看出区别!


当元素实际上比视口高时,滚动的奇怪行为。容器保持视口高度,内容流出容器。 min-height:100vh 似乎可以解决这个问题。
@DGDD 接下来:这里有很多其他解决方案可以追溯到 IE5,所以我不需要重复其他人已经说过的话。对于自该规范首次引入以来最近 3 年发布的大多数浏览器来说,这个答案已经足够可靠了。
@DGDD 这适用于 iOS Safari 6+、Android Browser 4.4+、BlackBerry Browser 10.0 和 IEMobile 10.0。我不知道您指的是哪种移动浏览器,但这 4 种占使用的移动浏览器的 90% 以上。此问题未指定在移动浏览器上工作的要求。
@robross0606 再次,这不是我在这里回答的问题。这完全是一个不同的问题,其答案确实使用了 flexbox:stackoverflow.com/questions/90178/…
移动警报:将 vh mess 与未考虑其导航栏的 Chrome 移动设备一起使用。然后它会用它覆盖您的页面顶部。如果你在那里有菜单,这是一个严重的问题......
J
Josh Crozier

如果您想设置 <div> 或任何元素的高度,您也应该将 <body><html> 的高度设置为 100%。然后您可以将元素的高度设置为 100% :)

这是一个例子:

body, html {
  height: 100%;
}

#right {
  height: 100%;
}

如果我错了,请纠正我,但我认为你还需要为 div 的所有父母设置高度,才能真正工作
如果我使用持续设计,这将不起作用:页面 6000 像素高度,块代表页面。我希望一个块正好是视口的高度。
@DanyY,你是对的。您确实需要为 div 的所有父级设置高度,这意味着所有内容都具有屏幕高度。这是一个example
这个技巧在某些情况下有效,但在某些情况下也无效,如果您搜索兼容性或更推荐的方式,您可以查看上面的@James 的答案 :) 使用视口百分比方法 :) ,这也应该有效。干杯
@Qwerty,这是解决方案。将 css 设置为:html { height: 100%*number of blocks; }body { height: 100%;}#div { height: 100%/number of blocks; }。因此,如果您有 3 个部分,它将是 html { height: 300%; } body { height: 100%; } #div { height: 33.3% }
R
Ry-

如果你能够绝对定位你的元素,

position: absolute;
top: 0;
bottom: 0;

会做的。


这是通过将元素从文档流中取出并将其底部值固定到其父级的高度来实现的。当您的内容超过其父级的高度时,这并不理想。
这不起作用,当它的父母之一设置为 position:relative 并且它的高度不是视口的 100% 时。它将调整顶部和底部以适应它的下一个相对或绝对祖先。
P
Peter Mortensen

您可以在 CSS 中使用视口单元:

HTML:

<div id="my-div">Hello World!</div>

CSS:

#my-div {
    height: 100vh; /* vh stands for view-port height, 1vh is 1% of screen height */
}

@Lamar 您应该使用 * { box-sizing: border-box; } 来防止这种情况发生。
值得检查 caniuse 浏览器对视口单元的支持:caniuse.com/#feat=viewport-units
A
Alireza

在这种情况下,您可以使用 vh,它相对于视口 1% 的高度...

这意味着如果您想遮住高度,只需使用 100vh

看看我在这里为你画的下图:

https://i.stack.imgur.com/g0kUu.jpg

试试我为你创建的片段如下:

.left { 高度:100vh;宽度:50%;背景颜色:灰色;向左飘浮; } .right { 高度:100vh;宽度:50%;背景颜色:红色;浮动:对; }


给 100vh 为页面添加了一个垂直滚动,所以跟着这个但没有用。 stackoverflow.com/questions/44645465/…。有什么办法可以避免垂直滚动并让 div 在没有任何内容的情况下触摸底部?
@DILEEPTHOMAS 寻找现有的 paddings/margins
@Legends 在根文件中我尝试给出 * {margin: 0, padding: 0} 但没有奏效
@DILEEPTHOMAS 看看 Alireza 提供的这个例子,它也有一个滚动条,因为 body 元素有一个边距。如果删除边距,滚动条就消失了。它可能有不同的原因,但我会先检查这个原因。
m
mb21

flex model 解决方案相比,所有其他解决方案(包括投票最多的带有 vh 的解决方案)都不是最佳解决方案。

随着 CSS flex model 的出现,解决 100% 高度问题变得非常非常容易:在父元素上使用 height: 100%; display: flex,在子元素上使用 flex: 1。它们会自动占用容器中的所有可用空间。

请注意标记和 CSS 是多么简单。没有桌子黑客或任何东西。

弹性模型是 supported by all major browsers 以及 IE11+。

html, 身体 { 高度:100%; } 身体 { 显示:弹性; } .left, .right { 弹性:1; } .left { 背景:橙色; } .right { 背景:青色; }

在此处了解有关 flex model 的更多信息。


一个警告:当左/右容器之一的内容超过原来的身体高度时,对面的容器不会被调整大小,所以容器最终会有不同的高度。
Schellmax 指出的问题示例:jsfiddle.net/Arete/b4g0o3pq
根据设计,overflow-y: auto; 可能会避免“容器超出原始车身高度”。
body 还需要 margin: 0px
I
Igor Ivancha

你没有提到一些重要的细节,比如:

布局是固定宽度吗?

两列或两列的宽度是否固定?

这是一种可能性:

身体,div {边距:0;边框:0 无;填充:0; } html, body, #wrapper, #left, #right { 高度:100%;最小高度:100%; } #wrapper { 边距:0 自动;溢出:隐藏;宽度:960px; // 宽度可选 } #left { 背景:黄色;向左飘浮;宽度:360px; // 宽度可选但推荐 } #right { 背景:灰色;左边距:360px; // 必须和之前的宽度一致 } Example

Left

根据需要固定哪些色谱柱以及哪些色谱柱是液体,对此有许多变化。您也可以使用绝对定位来做到这一点,但我通常会发现使用浮动来获得更好的结果(特别是在跨浏览器方面)。


M
Mobarak Ali

这对我有用:

使用 position:fixed 而不是 position:absolute,这样即使您向下滚动,分区也会扩展到屏幕的末尾。


这段带有“位置:[固定|绝对]”的代码非常适合弹出窗口的背景(例如当您单击以缩放图片时),但在您需要实际向下滚动的情况下不太确定。还是有用的面团!
J
James Donnelly

这是高度的修复。

在您的 CSS 中使用:

#your-object: height: 100vh;

对于不支持 vh-units 的浏览器,请使用 modernizr。

添加此脚本(为 vh-units 添加检测)

// https://github.com/Modernizr/Modernizr/issues/572
// Similar to http://jsfiddle.net/FWeinb/etnYC/
Modernizr.addTest('cssvhunit', function() {
    var bool;
    Modernizr.testStyles("#modernizr { height: 50vh; }", function(elem, rule) {   
        var height = parseInt(window.innerHeight/2,10),
            compStyle = parseInt((window.getComputedStyle ?
                      getComputedStyle(elem, null) :
                      elem.currentStyle)["height"],10);

        bool= !!(compStyle == height);
    });
    return bool;
});

最后,如果浏览器不支持 vh-units,则使用此函数将视口的高度添加到 #your-object

$(function() {
    if (!Modernizr.cssvhunit) {
        var windowH = $(window).height();
        $('#your-object').css({'height':($(window).height())+'px'});
    }
});

m
machineghost

即使这里有所有的答案,我惊讶地发现没有一个能真正解决问题。如果我使用 100vh height/min-height,当内容超过一页时,布局会中断。如果我改为使用 100% height/min-height,则当内容小于页面高度时布局会中断。

我发现解决这两种情况的解决方案是结合前两个答案:

html, body, #mydiv {
  height: 100%;
  min-height: 100vh;
}

我有一个固定的 90px 高度导航栏,所以我只需要将“100vh”更改为“calc(100vh - 90px)”
Р
Руслан

100vw = 视口宽度的 100%。

100vh = 视口高度的 100%。

如果您想将 div 宽度或高度设置为 browser-window-size 的 100%,您应该使用:

对于宽度:100vw

对于高度:100vh

或者,如果您想将其设置为更小,请使用 CSS calc 函数。例子:

#example {
    width: calc(100vw - 32px)
}

l
lukaszkups

试试这个 - 测试:

body {
  min-height: 100%;
}

#right, #left {
  height: 100%;
}

编辑:2020年更新:

您现在可以使用 vh

#right, #left {
  height: 100vh
}

P
Peter Mortensen

100% 对于宽度和高度的工作方式不同。

指定 width: 100% 时,表示“占用父元素可用宽度或窗口宽度的 100%”。

当您指定 height: 100% 时,它仅表示“从父元素占用 100% 的可用高度”。这意味着如果您没有在顶级元素指定高度,所有子元素的高度将是 0 或父元素的高度,这就是为什么您需要将最顶层元素设置为具有 {3 } 的窗口高度。

我总是指定身体的最小高度为 100vh,它使定位和计算变得容易,

body {
  min-height: 100vh;
}

S
SK-the-Learner

整个页面称为“视口”,您可以根据 CSS3 中的视口设计元素。

这样的单位称为视口百分比长度,并且与初始包含块的大小有关。

视口高度称为 vh。页面的完整高度为 100vh。

视口宽度称为 vw。页面的完整高度为 100vw。

还有vmin(视口最小长度)和vmax(视口最大长度)。

所以现在,您的问题可以通过在 CSS 中添加以下内容来轻松解决:

.classname-for-right-div /*You could also use an ID*/ { 
  height: 100vh;
}

这是信息about the Viewport-relative lengths


J
James Donnelly

添加 min-height: 100% 并且不指定高度(或将其设置为自动)。它完全为我完成了工作:

.container{     
    margin: auto;
    background-color: #909090;
    width: 60%;
    padding: none;
    min-height: 100%;
}

E
EMILO

最简单的方法是这样做。

div {背景:红色;高度:100vh; } 正文 { 边距:0px; }


P
Penguin9

有多种方法可用于将 <div> 的高度设置为 100%。

方法(一):

html, 身体 { 高度:100%;最小高度:100%; } .div-left { 高度:100%;宽度:50%;背景:绿色; } .div-right { 高度:100%;宽度:50%;背景:灰色; }

使用 vh 的方法 (B):

html, 身体 { 高度:100%;最小高度:100%; } .div-left { 高度:100vh;宽度:50%;背景:绿色;向左飘浮; } .div-right { 高度:100vh;宽度:50%;背景:灰色;浮动:对; }

方法(c)使用弹性盒:

html, 身体 { 高度:100%;最小高度:100%; } .wrapper { 高度:100%;最小高度:100%;显示:弯曲; } .div-left { 宽度:50%;背景:绿色; } .div-right { 宽度:50%;背景:灰色; }


d
dippas

尝试在 html 中设置 height:100% & body

html, 
body {
    height: 100%;
}

如果您想 2 div 高度相同,请使用或设置父元素 display:flex 属性。


P
Peter Mortensen

这对我有用:

html, body {
    height: 100%; /* IMPORTANT!!! Stretches viewport to 100% */
}

#wrapper {
    min-height: 100%; /* Minimum height for a modern browser */
    height:auto !important; /* Important rule for a modern browser */
    height:100%; /* Minimum height for Internet Explorer */
    overflow: hidden !important; /* Firefox scroll-bar */
}

取自 this page


P
Peter Mortensen

这与您在以前的答案中的内容不完全相同,但它可能对某些人有所帮助:

body {
  display: flex;
  flex-direction: column;
  height: 100vh;
  margin: 0px;
}

#one {
  background-color: red;
}

#two {
  margin-top: 0px;
  background-color: black;
  color: white;
  overflow-y: scroll;
}

https://jsfiddle.net/newdark/qyxkk558/10/


M
Michael Benjamin

默认情况下,块元素会占用其父元素的整个宽度。

这就是他们如何满足他们的设计要求,即垂直堆叠。

9.4.1 块格式化上下文 在块格式化上下文中,框从包含块的顶部开始垂直排列。

但是,这种行为不会扩展到高度。

默认情况下,大多数元素是其内容的高度 (height: auto)。

与宽度不同,如果你想要额外的空间,你需要指定一个高度。

因此,请记住以下两点:

除非你想要全宽,否则你需要定义一个块元素的宽度

除非您想要内容高度,否则您需要定义元素的高度

.联系{显示:弹性; /* 默认全宽 */ min-height: 100vh; /* 至少使用视口的全高 */ } .left { flex: 0 0 60%;背景色:番茄; } .right { 弹性:1;背景颜色:粉红色; } 正文 { 边距:0; } /* 删除默认边距 */

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut劳力和多洛尔麦格纳阿里夸。 Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat。 Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur。 Exceptioneur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est labourum.


S
Sunderam Dubey

如果您将 html 和正文高度设置为 100%,那么它将覆盖整个页面,如果您将任何特定的 div 最小高度设置为 100%,那么它将覆盖整个窗口,如下所示:

CSS

html,body{
 height:100%;
}

div#some-div{
min-height:100%;

}

记住

这仅在 div 的直接父级是 body 时才有效,因为百分比总是从直接父级继承,并且通过执行上述 css 代码,您告诉 div 从直接父级(body)继承高度 100% 并使其成为您的最小高度: 100%

另一种方式

只需将 div 高度设置为 100vh,它的平均 100 视口高度

CSS

div#some-div{
 height:100vh

}

很好很干净:)))
P
Peter Mortensen

只需使用“vh”单位而不是“px”,这意味着视口高度。

height: 100vh;

P
Peter Mortensen

选项之一是使用 CSS 表。它有很好的浏览器支持,甚至可以在 Internet Explorer 8 中运行。

JSFiddle Example

html, 身体 { 高度:100%;边距:0; } .container { 显示:表;宽度:100%;高度:100%; } .left, .right { 显示:表格单元格;宽度:50%; } .right { 背景:灰色; }


S
Sunil R.

试试这个...

*{ 填充:0;边距:0; } .parent_div{ 溢出:隐藏;明确:两者;颜色:#fff;文本对齐:居中; } .left_div { 浮动:左;高度:100vh;宽度:50%;背景颜色:蓝色; } .right_div { 浮动:对;高度:100vh;宽度:50%;背景颜色:绿色; }


h
halfer

Use FlexBox CSS

Flexbox 非常适合这类问题。 Flexbox 以在水平方向布局内容而闻名,但实际上它同样适用于垂直布局问题。您所要做的就是将垂直部分包裹在一个弹性容器中,然后选择要扩展的部分。它们会自动占用容器中的所有可用空间。


T
Thuc Nguyen

您可以使用 display: flexheight: 100vh

html, 身体 { 高度:100%;边距:0px; } 身体 { 显示:弹性; } .left, .right { 弹性:1; } .left { 背景:橙色; } .right { 背景:青色; }


已经发布了几个 flexbox 解决方案,其中一个在这个答案前 26 天发布了这个确切的实现。
b
bilal BOUASRIA

你需要做两件事,一是将高度设置为你已经做过的 100%。其次是将位置设置为绝对。这应该够了吧。

html,
body {
  height: 100%;
  min-height: 100%;
  position: absolute;
}

Source


过时的解决方案。请改用 vh
如果您计划在移动设备上使用响应式设计,请勿使用 vh
P
Peter Mortensen

实际上最适合我的是使用 vh 属性。

在我的 React 应用程序中,即使调整大小,我也希望 div 与页面高度匹配。我尝试了 height: 100%;overflow-y: auto;,但在设置 height:(your percent)vh; 时,它们都没有按预期工作。

注意:如果您使用填充、圆角等,请确保从您的 vh 属性百分比中减去这些值,否则会增加额外的高度并显示滚动条。这是我的示例:

.frame {
  background-color: rgb(33, 2, 211);
  height: 96vh;
  padding: 1% 3% 2% 3%;
  border: 1px solid rgb(212, 248, 203);
  border-radius: 10px;
  display: grid;
  grid-gap: 5px;
  grid-template-columns: repeat(6, 1fr);
  grid-template-rows: 50px 100px minmax(50px, 1fr) minmax(50px, 1fr) minmax(50px, 1fr);
}

顺便说一句,您提到影响元素高度的“圆角”,我希望设置 box-sizing: border-box; 会克服这个问题,这意味着在计算元素的大小(宽度和高度)时也会考虑边框大小.
S
SK-the-Learner

.wrapper { 显示:-webkit-box;显示:-ms-flexbox;显示:弯曲; -ms-flex-wrap:换行;弹性包装:换行;高度:100vh; // 高度窗口 (vh) } .wrapper .left{ width: 80%; // 宽度可选,但推荐使用 } .wrapper .right{ width: 20%; // 宽度可选,但推荐使用 background-color: #dd1f26; }


可能的拼写错误:widht(接近结尾)