鉴定热门文章之《别再用 100vh 了...》

4,701 阅读3分钟

Hello,又见面了,我是 pany。

今天在掘金社区看见前端文章榜第一的这篇文章《别再用 100vh 了!移动端视口高度的终极解决方案

图片

原文链接

juejin.cn/post/752054…

我们一起来学习一下。

「作者抛出问题」

文章开头提到了一个历时已久的 CSS 兼容性问题:100vh 在移动端设备上会出现滚动条,就像作者演示的这样(注意看页面右侧有滚动条):

图片

「作者分析问题」

图片

我将上面作者的分析过程转化为方便用户理解的图片是这样的:

图片

当然,不同的浏览器对应的动态区域可能会有所不同,有些是在是在上面,有些是在下面。

到这里,想必大家应该能更清晰的理解 “100vh 在移动端设备上会出现滚动条” 是怎么一回事了。

「作者给出过时的解决方案」

图片

这个方案巧妙的利用了 JS innerHeight 的值充当最终的 100vh,并且还非常细心的在使用 CSS 变量的时候传入了第二个可选参数 1vh 作为兜底的回退值,这样能保证在 --vh 失效时整个表达式不出现错误。

图片

但作者也提到了一个问题:监听 resize 事件过于频繁,可能会引发性能问题。这其实很好解决,我们在原基础上补充一个防抖(debounce)就好了:

function setRealVH() {
    const vh = window.innerHeight;
    document.documentElement.style.setProperty('--vh'`${vh * 0.01}px`);
}
window.addEventListener('resize'debounce(setRealVH, 100));

「作者给出终极的解决方案」

图片

在原文描述中:

使用 100dvh,当地址栏收起时,元素高度会平滑地增加以填满屏幕;当地址栏滑出时,元素高度又会平滑地减小。整个过程如丝般顺滑,没有任何滚动条,完美!

出现了 “平滑” 这个词,但 dvh  的单位变化不是平滑动画,而是瞬间切换

并且这个方案现阶段还不能称为「终极方案」,毕竟作者自己也提到了兼容性问题:

图片

但是这里,这位作者出现了一个「错误」

他认为从 2023 年开始截止到 2025 年,所有主流现代浏览器都兼容了,就代表着「兼容性非常理想」

这其实是一个在开发实践或者技术调用中不应该犯的错误,我们需要知道的是 CSS 属性的兼容性还应该根据当前主流浏览器版本用户量占比来判断。

108 版本的 Chrome 浏览器是在 2022 年 12 月 1 日发行的,和它最近的一个安卓版本是 2022 年 8 月 15 日发行的 Android 13

也就是说,大概需要默认搭载 Android 14 系统的手机才可以无风险的使用 dvh 属性,但是截止 2025 年 4 月 Android 14、15 两个版本的占比大约在 32%,10 ~ 13 四个版本的占比大约在 55%。也就是说用户在使用默认浏览器或 webview 的时候,可能依旧有兼容性问题。

「最后」

虽然是以指出热榜第一文章的一些错误结尾,但是原文本身能带给我们的知识还是非常有用的。让我们能在遇到对应问题的时候同时了解到「新」「旧」两种不同解决方案。

「关注关注关注」

如果文章对你有帮助,记得点赞、收藏、评论和关注!