vh 存在问题?试试动态视口单位之 dvh、svh、lvh

文章介绍了CSS中与视口相关的单位,如vh、vw在移动端存在的问题,特别是vh在某些情况下不等于屏幕高度。为了解决这些问题,规范引入了大视口单位(lvh等)、小视口单位(svh等)和动态视口单位(dvh等),并详细阐述了它们的含义和应用场景。此外,文章还提到了容器查询的新单位cqw和cqh,以及CSS在容器大小变化时的布局调整能力。
摘要由CSDN通过智能技术生成

大部分同学都知道,在 CSS 世界中,有 vw、vh、vmax、vmin 这几个与视口 Viewport 相关的单位。

正常而言:

  1. 1vw 等于1/100的视口宽度 (Viewport Width)

  2. 1vh 等于1/100的视口高度 (Viewport Height)

  3. vmin — vmin 的值是当前 vw 和 vh 中较小的值

  4. vmax — vw 和 vh 中较大的值

bc4799d2b3316943e704b63766519cb0.png

vh 在移动端存在重大问题!

但是,在移动端,情况就不太一样了。100vh 不总是等于一屏幕的高度。有的时候,100vh 高度会出现滚动条。

可以使用移动端 Chrome 浏览器扫描下面的二维码查看实际 100vh 在移动端的表现:

53a2561958606833757b595ea5c87b40.png

根因在于:

  1. 很多浏览器,在计算 100vh 的高度的时候,会把地址栏等相关控件的高度计算在内

  2. 同时,很多时候,由于会弹出软键盘等操作,在弹出的过程中,100vh 的计算值并不会实时发生变化!

这也就变相导致了许多基于 100vh 想实现的效果无形中会产生很多问题。

36a5f2795abd04836695031dd8a5af36.png

图片来源于:The large, small, and dynamic viewport units[1]

新视口相关单位之 lvh、svh、dvh

为了解决上述的问题,规范新推出了三类单位,分别是:

  1. The large viewport units(大视口单位):lvw,lvh, lvi, lvb, lvmin, and lvmax

  2. The small viewport units(小视口单位):svw, svh, svi, svb, svmin, and svmax

  3. The dynamic viewport units(动态视口单位):dvw, dvh, dvi, dvb, dvmin, and dvmax

别看看上去很多,其实很好记忆,vw/vw/vmax/vmin 的前缀是 v,而:

  1. 大视口单位的前缀是 lv,意为 large viewport

  2. 小视口单位的前缀是 sv,意为 small viewport

  3. 动态视口单位的前缀是 dv,意为 dynamic viewport

这里我们着重关注 lvhsvhdvh。它们三者与 vh 有什么异同呢?

先来看大视口与小视口,规范对它们的定义是:

  1. Large Viewport: The viewport sized assuming any UA interfaces that are dynamically expanded and retracted to be retracted.

  2. Small Viewport: The viewport sized assuming any UA interfaces that are dynamically expanded and retracted to be expanded.

翻译一下:

  1. 大视口(Large Viewport):视口大小假设任何动态扩展和缩回的 UA 界面都没有展开

  2. 小视口(Small Viewport):视口大小假设任何动态扩展和缩回的 UA 界面都展开了

abd359e1e363f3ba95d941380a289d48.png

因此,对应到高度之上,其状态大致如下:

01d8fa8c54a03bfb762ff8975b8a2019.png

理解了大视口与小视口之后,再理解动态视口就轻松了些。

简单而言,动态视口的意思是:

  1. 动态工具栏展开时,动态视口等于小视口的大小

  2. 当动态工具栏被缩回时,动态视口等于大视口的大小

因此,也就能得到下面这张图:

2d8519600c49fa5915eef47e5fff0d2c.png

其中,dvhdvwdvmaxdvmin 对标 vhvwvmaxvmin 比较好理解。

剩下,dvidvb 解释一下。其实,在之前也有 vivb 两个单位:

  1. vi:vi 代表 Viewport Inline,代表文档的内联方向。在水平书写方向上,这对应于视口的宽度,而在垂直书写方向上,这表示视口的高度。记住 inline 方向的简单方法是记住它与文本的方向相同。

  2. vb:vb 代表 Viewport block,代表文档的块方向。这与 vi 水平书写方向相反,这将对应于视口高度,而在垂直文档中,这将表示视口的宽度。

因此,vi 和 vb 属于两个逻辑单位。关于 CSS 中的方位与顺序,逻辑单位相关的内容,你可以看看我的这篇文章:https://github.com/chokcoco/iCSS/issues/127[2]

理解了 vivbdvidvb 也就很好理解了,它们分别表示动态视口下的 Viewport Inline 与 Viewport block。同理去理解大视口、小视口下的 lvilvbdvidvb

dvh、svh、lvh 它们的兼容性(2023-01-25)

截止到书写本文的时间,它们已经被 Chrome 108+ 支持,而 firefox、Safari 在更早的阶段,就已经开始支持这些新单位了。

看看 CanIUse:

4fcd34674836e45be1c5e0a7c919be0d.png

因此,在不久的将来,全面使用 dvh 替代 vh,能有效的减少非常多因为 vh 在移动端的表现而引起的问题

总结一下

简单再总结一下,本文通过 vh 在移动存在的问题入手,引出了规范新增的三大类新的和视口相关的单位。分别是:

  1. 大视口(Large Viewport)

  2. 小视口(Small Viewport)

  3. 动态视口(dynamic viewport)

它们的出现,极大的弥补了之前 vh/vw 等视口单位存在的问题。CSS 的更新迭代一直在快速持续,很多内容还是有必要不断了解学习,在不久的将来就能很快应用在业务中。

此外,除了动态视口外,其实 CSS 还更新了与容器大小相关的相对单位 -- 譬如 cqwcqh

  • cqw:表示容器查询宽度(Container Query Width)占比。1cqw 等于容器宽度的 1%。假设容器宽度是 1000px,则此时1cqw 对应的计算值就是 10px

  • cqh:表示容器查询高度(Container Query Height)占比。1cqh 等于容器高度的 1%

容器查询:它给予了 CSS,在不改变浏览器视口宽度的前提下,只是根据容器的宽度变化,对布局做成调整的能力。

也就是说,CSS 除了在视口这条路之外,也逐渐在扩充探索以及完善与容器大小变化相关的能力。

假期在群里看到了这样一张很有意思的图:

d843ed21d73ef0a9d24f38abba734fd0.jpeg

可以预见,未来 CSS 将朝着越来越复杂、功能越来越强大继续发展,诸多新特性层出不穷。可能不再是很多人之前眼中的比较简单的一门语言。

不知是好是坏,且学且珍惜吧。

最后

文中关于动态视口相关的问题,部分图片来自这篇文章 -- The large, small, and dynamic viewport units[3],可以一起学习,加深印象。

好了,本文到此结束,希望本文对你有所帮助 :)

如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。

参考资料

[1]

The large, small, and dynamic viewport units: https://web.dev/viewport-units/

[2]

https://github.com/chokcoco/iCSS/issues/127: https://github.com/chokcoco/iCSS/issues/127

[3]

The large, small, and dynamic viewport units: https://web.dev/viewport-units/

如果觉得还不错,欢迎点赞、收藏、转发❤❤

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值