如何让div高度占满浏览器窗口
技术背景
在前端开发中,有时需要让一个div
元素的高度占满整个浏览器窗口。传统的height: 100%
在某些情况下可能无法达到预期效果,因此需要借助一些CSS3的特性来实现这一需求。
实现步骤
方法一:使用视口单位vh
视口单位vh
表示视口高度的百分比,1vh
等于视口高度的1%,因此100vh
就等于视口的高度。
方法二:设置html
和body
高度为100%
先将html
和body
的高度设置为100%,然后再将div
的高度设置为100%。
1 2 3
| <body> <div id="right"></div> </body>
|
1 2 3 4 5 6 7
| body, html { height: 100%; }
#right { height: 100%; }
|
方法三:使用绝对定位
通过绝对定位将元素的顶部和底部都设置为0,使其占满整个视口高度。
1
| <div style="position: absolute; top: 0; bottom: 0;"></div>
|
方法四:使用flex布局
使用flex
布局可以很方便地让子元素占满父元素的可用空间。
1 2
| <div class="left">left</div> <div class="right">right</div>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| html, body { height: 100%; } body { display: flex; }
.left, .right { flex: 1; }
.left { background: orange; }
.right { background: cyan; }
|
核心代码
使用视口单位vh
1
| <div id="my-div">Hello World!</div>
|
1 2 3
| #my-div { height: 100vh; }
|
使用flex布局
1 2 3 4
| <div class="wrapper"> <div class="div-left"></div> <div class="div-right"></div> </div>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| html, body { height: 100%; min-height: 100%; } .wrapper { height: 100%; min-height: 100%; display: flex; } .div-left { width: 50%; background: green; } .div-right { width: 50%; background: gray; }
|
最佳实践
响应式布局
使用视口单位vh
和vw
可以实现响应式布局,让div
元素的高度和宽度随着视口的变化而自动调整。
兼容性处理
对于不支持vh
单位的浏览器,可以使用JavaScript进行兼容性处理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| 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; });
$(function() { if (!Modernizr.cssvhunit) { var windowH = $(window).height(); $('#your-object').css({'height':($(window).height()) + 'px'}); } });
|
常见问题
100vh
和100%
的区别
100%
的高度是相对于父元素的高度,而100vh
是相对于视口的高度。例如:
1 2 3 4 5
| <body style="height: 100%"> <div style="height: 200px"> <p style="height: 100%; display: block;">Hello, world!</p> </div> </body>
|
这里的p
标签设置为height: 100%
,但它的高度是其父元素div
的高度(200px),而不是body
的高度。如果使用100vh
,则p
标签的高度将是视口的高度。
移动设备上100vh
的问题
在移动设备上,浏览器的UI可能会占用一些屏幕空间,导致100vh
的效果不理想。从2023年开始,引入了新的单位,如dvh
、lhv
和svh
,可以实现动态高度,而无需使用JavaScript。
1 2 3 4
| .yourElement { height: 100vh; height: 100dvh; }
|