CSS – vw, vh, position fixed and ICB (initial containing block)
什么是 vw, vh?
vh 的 v 指的是 viewport, h 就是 height. 它是 CSS 值的单位就像 px, %.
.container {
height: 30vh;
background-color: red;
}
那么 30vh 是多高呢?
30% of viewport heigth 的意思.
vh 和 % 的区别
% 对标当前 element 的 parent (或更准确的说是 containing block) 来计算的.
而 vh 则对标 viewport (initial containing block ICB) 来计算的.
ICB (Initial Containing Block)
既然 vh 是 viewport 的 percentage, 那就要先搞清楚 viewport(更准确的叫法是 ICB) height 具体是多少.
viewport 一般上指的就是屏幕 avaiable size (可视区). 也就是扣除了 address bar, tool bar, bookmark bar 等等
但是有些东西却会影响 viewport 的 size, 比如在手机, body scroll 以后, address bar 会消失 (对 vh 影响). 或者在电脑内容多的时候会有 vertical scroll bar (对 vw 影响).
那游览器的 viewport size 是动态的吗 ?
先看看 Chrome 的历史: URL Bar Resizing
以前 Chrome 确实是动态的, 100vh 它会因为 address bar 的消失而改变 value. 但后来这种体验实在太差了. 所以被修改成固定的了.
Safari, Chome viewport size 都是不包含 address bar 和 tool bar 的.
固定 viewport size 的问题
参考: The trick to viewport units on mobile

由于 100vh = viewport size without address/tool bar. 所以当 address bar 存在的时候, 效果就会像左图那样.
所以用 vh, vw 时要切记. 它是不包含任何 bar 的高度/宽度 (偏大).
How to get read avaiable viewport ?
像 tesla.com 这种一屏一屏的体验, 如果用 100vh 就不对了. 因为 address bar 是一直存在的 (记住: 没有 bar 时 vh 美美, 有 bar 时 vh 不美).

有 2 种方法可以拿到包含 address bar 的 size (偏小).
参考:
Mobile issue with 100vh | height: 100% !== 100vh [3 solutions]
The trick to viewport units on mobile
CSS fix for 100vh in mobile WebKit
CSS fix for 100vh in mobile WebKit
第 1 种方式是不要用 vh, 改用 -webkit-fill-available.
.div {
min-height: 100vh;
/* fill on ios */
min-height: -webkit-fill-available;
}
这个方法适合用在 first layer. 如果很多层就不合适了.
第 2 种方法是用 JS 获取 window.innerHeight 然后赋值给 CSS variable
window.addEventListener('resize', () => {
document.querySelector(':root').style
.setProperty('--vh', window.innerHeight/100 + 'px');
})
height: calc(100 * var(--vh));
调用, 10vh 等价于 10 * var(--vh)
假设 inner height 是 768px, 那么就是 10 x 768 = 7680px 所以 vh 需要先除于 100
最终就是 --vh = 768 / 100 = 7.68px, 然后 10vh = 10 * 7.68px = 76.8px.
监听 resize 的话基本上是模拟了 Chrome 早期 vh 的实现了.
Large, Small, Dynamic (lvh, svh, dvh)
参考: YouTube – Learn Every CSS Viewport Unit In 10 Minutes
lvh, svh, dvh 是新的东西, 目前支持率还不是很好. 29 Nov 2022 的 Chrome 才开始支持.

顾名思义 lvh 就是 large vh, 也就是不包含 address bar 的 vh (偏大). 也是目前的 vh
svh small vh 就是包含 address bar 的 vh (偏小), 目前需要用 JS 才能获取到的.
dvh 就是 dynamic vh, 当 address bar 出现时它就偏小, 当 address bar 消失时它就偏大. 它就是早年 Chrome 对 vh 的实现.
有了这些就不那么乱水了. oh yeah.
vmax, vmin, vb, vl
vmax 是拿 vh, vw 最大的那个
vmin 是拿 vh, vw 最小的那个
vb 是 view block, 它是 Logical Properties. 正常情况下是 vh
vi 是 view inline, 它是 Logical Properties, 正常情况下是 vw
CSS – vw, vh, position fixed and ICB (initial containing block)的更多相关文章
- position:fixed和scroll实现div浮动【示例】
前言 在自己建站的过程中,要实现一个div随滚动条浮动的效果,网上找了些示例不太好用,还是自己动手,丰衣足食,写的不好请大家谅解,毕竟我不是搞前端的,因为自己建站毕竟每一步都必须自己来,这边只是做个记 ...
- 修正IE6不支持position:fixed的bug(转)
众所周知IE6不支持position:fixed,这个bug与IE6的双倍margin和不支持PNG透明等bug一样臭名昭著.前些天我做自己的博客模板的时候,遇到了这个问题.当时就简单的无视了IE6— ...
- 浮动层固定兼容IE6 position:fixed的最佳解决方案
第一种:css方法 有时候当我们需要把一个元素固定在页面的某个部位,一般都是用css中的“position:fixed;”方法来解决,但是IE6不支持fixed,所以今天分享一个兼容IE6的页面底部固 ...
- css中对position的几种定位方式的最佳诠释
关于元素的position定位的理解,牛客网的hardy给出了一个比较好的理解: 在html中网页可以看成一个立体的空间,一个完整的页面是由很多个页面堆积形成的,如上图所示 CSS中Positio ...
- 使用属性position:fixed的时候如何才能让div居中
css: .aa{ position: fixed; top: 200px; left: 0px; right: 0px; width: 200px; height: 200px; margin-le ...
- CSS:position:fixed使用(转)
position属性规定元素的定位类型,即建立元素布局所用的定位机制.任何元素都可以定位,不过绝对定位或固定定位元素会生成一个块级框,而不论该元素本身是什么类型.相对定位元素会相对于它在正常流中的默认 ...
- CSS中position:fixed的用法
我们都知道CSS中定位属性position的值,除了默认的值外,还有absolute,relative和fixed.我平时比较常用absolute和relative,而position:fixed却没 ...
- css 兼容 position:fixed
我是头 我是主体 有多少内容,我就有多高 我是脚 我要随滚动条滚动 我要随滚动条滚动 我要随滚动条滚动 <!DOCTYPE html PUBLIC "-//W3C//DTD XHT ...
- 让IE6支持position:fixed的方法,CSS expression与JavaScript eval讲解
做吸顶效果或是固定效果时,使用position:fixed无非是最方便的,可是万恶的IE6是没有fixed这个属性值的,而我们要使IE6能够像fixed一样固定在浏览器中的某个位置,使用onscrol ...
- 小技巧css解决移动端ios不兼容position:fixed属性,无需插件
移动端开发仿app头部底部固定设置position:fixed,android2.2以上已经实现.但是在ios8以下系统,当小键盘激活时,都会出现位置浮动问题.如图: 如何解决: 查阅资料之后想到一下 ...
随机推荐
- C#:SqlSugar中时间戳(TimeStamp)的使用
1.数据库建表 CREATE TABLE dbo.Test ( tId INT IDENTITY NOT NULL , tName NVARCHAR (20) NOT NULL , tSalary D ...
- Python 按分类权重(区间)随机获取分类样本
按分类权重(区间)随机获取分类样本 By:授客 QQ:1033553122 开发环境 win 10 python 3.6.5 需求 活动抽奖,参与抽奖产品有iphone, 华为,小米,魅族,vivo, ...
- linux部署Python UI自动化项目过程
1.安装chrome浏览器 下载 访问谷歌中文网站:Google Chrome 网络浏览器. 将页面滑到最下面,点击其他平台, 在弹出的页面选择linux 选择对应的系统版本进行下载. 下载后的deb ...
- linux学习(7):Linux最常用150个命令汇总
Linux最常用150个命令汇总 线上查询及帮助命令(2个) man 查看命令帮助,命令的词典,更复杂的还有info,但不常用. help 查看Linux内置命令的帮助,比如cd命令. 文件和目录操作 ...
- RPA处理京东滑块拼图验证码
在进行京东商家后台企业账号的RPA自动化操作过程中,登录环节是必不可少的步骤.然而,这一过程中有时会遇到一种特殊的验证机制--滑块拼图验证码,它的突然出现如同一道屏障,阻碍了自动化的顺利进行.因为只有 ...
- canvas实现截图功能
开篇 最近在做一个图片截图的功能. 因为工作时间很紧张, 当时是使用的是一个截图插件. 周末两天无所事事,来写一个简单版本的截图功能. 因为写的比较简单,如果写的不好,求大佬轻一点喷 读取图片并获取图 ...
- 【Java】Enumeration Class 枚举类
枚举类 enum 对象是有限的确定的.属于类的(静态的) 适合定义一组常量 例如固定的一些事物: - 季节 - 性别 - 状态 自定义枚举类的使用 public class EnumerationTe ...
- Parallel and Sequential Data Structures and Algorithms
并串行 从零开始考前突击并串行数据结构与算法 强烈建议和原教材参照着看 Introduction 本书的要点 定义问题 不同的算法解决 设计抽象数据类型和相应的数据结构实现 分析比较算法和数据类型的代 ...
- Streamlit运行出现ModuleNotFoundError: No module named ‘altair.vegalite.v4‘ —— ModuleNotFoundError: No module named 'altair.vegalite.v4'
参考: https://blog.csdn.net/ikun_King/article/details/131852167 解决方法: pip install altair=4.2.2
- Ubuntu、windows10双系统删除Ubuntu后如何清除grub启动
参考文章: 删除Grub,windows引导修复-百度经验 (baidu.com) ============================================== 自己的笔记本电脑一直都 ...