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以下系统,当小键盘激活时,都会出现位置浮动问题.如图: 如何解决: 查阅资料之后想到一下 ...
随机推荐
- 魔百和s905l3a蓝牙系列 在armbian驱动并使用蓝牙!
文章已废弃,因为现在x大的dtb不需要驱动直接可以使用 之后我会重新写文章,感谢大家
- [oeasy]python0118_语言的发展_希腊字符_拼音文字_亚历山大大帝
希腊字符回忆上次内容 尼罗河流域 的 埃及圣书体 是象形文字 两河流域 的 苏美尔楔形文字 不是象形文字 做生意的 腓尼基人 利用 埃及圣书体 的 字型 苏美尔楔形文字 的 写法 构造出 腓尼基字符 ...
- [oeasy]python0086_ASCII_出现背景_1963年_DEC_PDP系列主机_VT系列终端
编码进化 回忆上次内容 上次 回顾了 字符编码的新陈代谢 ibm 曾经的EBCDIC 由于 字符不连续 导致 后续 出现无数问题 随着 网络的发展 数据交换的 需要 原来的小隐患 现在 产生了 巨大问 ...
- 从30个角度对比 PostgreSQL 和 MySQL
比较版本:PostgreSQL 11 VS MySQL5.7(innodb引擎) Oracle官方社区版 版权情况:PostgreSQL 11(免费开源).MySQL5.7 Oracl ...
- 格式输出函数printf()详解_C语言
printf函数称为格式输出函数,其关键字最末一个字母f即为"格式"(format)之意.其功能是按用户指定的格式,把指定的数据显示到显示器屏幕上. printf函数调用的一般形式 ...
- 树莓派配置固定IP地址
树莓派配置固定IP地址 1.编辑文件/etc/dhcpcd.confroot@raspberrypi:~# vi /etc/dhcpcd.conf 2.修改以下参数配置,如果没有就在文件底部添加有线配 ...
- 新年恭喜发财-scratch编程作品
程序说明: <新年-恭喜发财>是一个基于Scratch平台制作的动画贺卡项目.该项目通过编程和艺术设计,展现了浓厚的中国新年(2024年为龙年)氛围,以及传统的恭喜发财祝福.动画中包含有喜 ...
- nacos配置&gateway配置服务发现一直报500
项目场景: 这两天不是一直在搞简化配置.使用公共配置.我的服务可以通过网关访问这几个任务嘛,也是不断地踩坑补知识才总算把这几个任务都搞好了,下面就是记录过程中遇到的问题. 使用公共配置 因为发现项目使 ...
- 对比python学julia(第一章)--(第四节)冰雹猜想
4.1 依葫芦画瓢 冰雹猜想是一种非常有趣的数字黑洞,曾让无数的数学爱好者为之痴迷.它有一个非常简单的变换规则,具体来说就是:任意取一个正整数n,如果n是偶数,就把n变成n/2;如果n是奇数,就把n变 ...
- 10、SpringMVC之处理Ajax请求
创建名为spring_mvc_ajax的新module,过程参考9.1节和9.5节 10.1.SpringMVC处理Ajax请求 10.1.1.页面请求示例 <input type=" ...