前言
在前端生涯上,经常会遇到需要容器自适应视口高度这种情况,本文将介绍我能想到的解决这个问题的方案。
基础知识
html 元素的高度默认是 auto(被内容自动撑开),宽度默认是 100%(等于浏览器可视区域宽度),没有 margin 和 padding;
body 元素的高度默认是 auto,宽度默认是 100%,有 margin 而没有 padding;
若想让一个块元素(如 div)的高度与屏幕高度自适应,始终充满屏幕,需要从 html 层开始层层添加 height=100%,而又因为 html,body 元素的 width 默认就是 100%, 因此在里面的 div 设定 width=100% 时就能和屏幕等宽。
方法一:继承父元素高度
给 html、body 标签添加 css 属性 height=100%,然后在需要撑满高度的容器添加 css 属性 height=100%,如下:
<html>
<body>
<div class="example">
</div>
</body>
<html>
html{height:100%;// 让 html 的高度等于屏幕}
body{
height:100%;
margin:0;
}
.example{
width: 100%;
height:100%;
background:rgb(55, 137, 243);
}
注意:添加类名.example 的元素必须是块级元素而且需要是 body 的 直接子元素
,也就是要设置 height=100%,其父元素必须有高度
方法二:使用绝对定位(absolute)
给需要撑满的容器添加绝对定位(absolute),然后设置 top、left、right、bottom 分别为 0,如下:
<html>
<body>
<div class="example">
</div>
</body>
<html>
.example{
position: absolute;
top:0;
left:0;
bottom:0;
right:0;
background:rgb(55, 137, 243);
}
注意:若目标元素的 父级元素
没有设置过 相对定位(relative)或绝对定位(absolute)
, 那么目标元素将相对于 html 定位,html 不需要设置宽高;否则相对于其设置过 相对定位(relative)或绝对定位(absolute)
的 父级元素
定位,且其 父级元素
必须有宽度和高度, 如下:
<html>
<body>
<div class="example2">
<span class="example"></span>
</div>
</body>
<html>
.example2{
position: relative;
width:100%;
height:100px;
}
.example{
position: absolute;
top:0;
left:0;
bottom:0;
right:0;
background:rgb(55, 137, 243);
}
方法三:使用固定定位(fixed)
给需要撑满的容器添加绝对定位(absolute),然后设置 top、left、right、bottom 分别为 0,如下:
<html>
<body>
<div class="example">
</div>
</body>
<html>
.example{
position: fixed;
top:0;
left:0;
bottom:0;
right:0;
background:rgb(55, 137, 243);
}
注意:使用 fixed 后,不需要理会父级元素是否有定位属性,均能撑满浏览器可视区域,但目标元素不随滚动容器的滚动而滚动
方法四:使用 flex 布局
给需要撑满的容器的父元素添加 display:flex,然后给撑满的元素添加 flex:1 1 auto,如下:
<html>
<body>
<div class="example">
</div>
</body>
<html>
html,body{
width:100%;
height:100%;
}
body{display: flex;}
.example{
background:#fc1;
flex:1 1 auto;
}
注意:使用 flex 同样需要父元素的有高度和宽度,否则不会撑开。
方法五:使用 javascript 获取浏览器高度
<html>
<body>
<div class="example">
</div>
</body>
<html>
<script>
let example = document.getElementById('example')
let height = document.documentElement.clientHeight
example.style.height = `${height}px`
</script>