什么是 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)的更多相关文章

  1. position:fixed和scroll实现div浮动【示例】

    前言 在自己建站的过程中,要实现一个div随滚动条浮动的效果,网上找了些示例不太好用,还是自己动手,丰衣足食,写的不好请大家谅解,毕竟我不是搞前端的,因为自己建站毕竟每一步都必须自己来,这边只是做个记 ...

  2. 修正IE6不支持position:fixed的bug(转)

    众所周知IE6不支持position:fixed,这个bug与IE6的双倍margin和不支持PNG透明等bug一样臭名昭著.前些天我做自己的博客模板的时候,遇到了这个问题.当时就简单的无视了IE6— ...

  3. 浮动层固定兼容IE6 position:fixed的最佳解决方案

    第一种:css方法 有时候当我们需要把一个元素固定在页面的某个部位,一般都是用css中的“position:fixed;”方法来解决,但是IE6不支持fixed,所以今天分享一个兼容IE6的页面底部固 ...

  4. css中对position的几种定位方式的最佳诠释

    关于元素的position定位的理解,牛客网的hardy给出了一个比较好的理解: 在html中网页可以看成一个立体的空间,一个完整的页面是由很多个页面堆积形成的,如上图所示   CSS中Positio ...

  5. 使用属性position:fixed的时候如何才能让div居中

    css: .aa{ position: fixed; top: 200px; left: 0px; right: 0px; width: 200px; height: 200px; margin-le ...

  6. CSS:position:fixed使用(转)

    position属性规定元素的定位类型,即建立元素布局所用的定位机制.任何元素都可以定位,不过绝对定位或固定定位元素会生成一个块级框,而不论该元素本身是什么类型.相对定位元素会相对于它在正常流中的默认 ...

  7. CSS中position:fixed的用法

    我们都知道CSS中定位属性position的值,除了默认的值外,还有absolute,relative和fixed.我平时比较常用absolute和relative,而position:fixed却没 ...

  8. css 兼容 position:fixed

    我是头 我是主体 有多少内容,我就有多高   我是脚 我要随滚动条滚动 我要随滚动条滚动 我要随滚动条滚动 <!DOCTYPE html PUBLIC "-//W3C//DTD XHT ...

  9. 让IE6支持position:fixed的方法,CSS expression与JavaScript eval讲解

    做吸顶效果或是固定效果时,使用position:fixed无非是最方便的,可是万恶的IE6是没有fixed这个属性值的,而我们要使IE6能够像fixed一样固定在浏览器中的某个位置,使用onscrol ...

  10. 小技巧css解决移动端ios不兼容position:fixed属性,无需插件

    移动端开发仿app头部底部固定设置position:fixed,android2.2以上已经实现.但是在ios8以下系统,当小键盘激活时,都会出现位置浮动问题.如图: 如何解决: 查阅资料之后想到一下 ...

随机推荐

  1. 浅谈地址,section,vstart

    地址:地址只是数字,描述各种符号在源程序中的位置,它是源代码文件中各符号偏移文件开头的距离.由于指令和变量所占内存大小不同,故他们的偏移量参差不齐.由编译器给各符号编址,编译器给程序中各符号(变量名和 ...

  2. php.ini文件与php.d

    `php.ini` 是 PHP 的主要配置文件,用于全局配置 PHP 的行为和功能.它包含了许多 PHP 的核心设置,如内存限制.错误报告级别.扩展加载等. `php.ini` 文件通常位于 PHP ...

  3. XAMPP的mysql启动失败:Plugin ‘FEEDBACK‘ is disabled

    安装完XAMPP后启动mysql,发现启动失败也没有任何提示,通过查看mysql_error日志,描述: 2021-08-11 18:56:53 0 [Note] InnoDB: Mutexes an ...

  4. 题解:P10677 『STA - R6』inkar-usi

    背景 把人家鸽了,感觉废了. 分析 这道题刚看到题目的时候很多人会想爆搜,但是因为 \(10^3\) 的数据范围,所以应该去想一想是不是有什么性质. 我们稍微想一想就会发现,题目上提到了可以重复走,那 ...

  5. Linux安装 JDK (CentOS 7)

    Linux安装 JDK 一.Linux安装软件的方式 第一种:二进制发布包安装: 软件已经针对具体平台编译打包发布,只要解压,修改配置即可 第二种: rpm安装 : 软件已经按照redhat的包管理规 ...

  6. Vue 修改网页标题和图标

    Vue 修改网页标题和图标   by:授客 QQ:1033553122   开发环境   Win 10   Vue 2.5.2 需求描述 如下,想更改网页的标题和图标 解决方法 编辑项目根目录下的in ...

  7. 【WSDL】02 四种客户端调用方式

    WSDL概念和一些语法内容: https://www.w3school.com.cn/wsdl/index.asp SOAP概念: https://www.runoob.com/soap/soap-t ...

  8. 【Kafka】02 原生集群部署

    基于大数据教程的环境: 192.168.101.11 centos7-01 192.168.101.12 centos7-02 192.168.101.13 centos7-03 搭建Kafka环境需 ...

  9. 如何访问SCI-Hub上的资源?

    答案: 使用tor访问.onion网络资源. tor 下载地址: https://www.torproject.org/ 如果不使用tor方式访问可能会无法访问,被提示:

  10. pytest中文文档

    在网上找到的感觉还不错的pytest的中文文档,这里收藏一下: 翻译的中文文档:完整的Pytest文档 中文文档链接地址: https://www.osgeo.cn/pytest/contents.h ...