20250706-鉴定热门文章之《别再用_100vh_了...》

原文摘要

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 的时候,可能依旧有兼容性问题。

「最后」

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

当然,在实践中其实并不止这两种方案,大家知不知道还有哪些?

「关注关注关注」

本系列文章均来自同名公众号:pany 的路边拾遗,欢迎大家微信搜索加关注~

另外,我建立了一个该公众号对应的群聊,如果你感兴趣,欢迎公众号后台私信关键字加群或加我微信联系我加群 pany-ang

原文链接

进一步信息揣测

  • 移动端浏览器对100vh的处理存在隐藏机制:不同浏览器对动态视口(如地址栏、工具栏)的渲染策略不同,部分浏览器会将100vh计算为包含动态区域的完整高度,而非可视区域高度,导致滚动条出现。这一行为通常不会在官方文档中明确说明,需通过实际测试或社区经验总结。
  • JS解决方案的性能陷阱:虽然使用innerHeight和CSS变量可以解决100vh问题,但直接监听resize事件会频繁触发重绘,可能引发性能问题。业内更推荐结合防抖(debounce)或节流(throttle)优化,但具体阈值(如原文的100ms)需根据项目实际性能需求调整。
  • CSS新特性的兼容性风险:作者提到的终极方案(如dvh单位)属于较新的CSS规范,实际支持度可能因浏览器版本或厂商差异而不同。内部团队通常会维护一份兼容性对照表,或通过渐进增强(如fallback到JS方案)避免线上事故。
  • 动态视口变化的未公开细节:某些移动端浏览器在滚动时动态调整视口高度(如地址栏隐藏),但这一行为可能因系统版本或浏览器引擎(WebKit/Blink)存在差异,需通过真机调试或内部工具(如浏览器开发者模式的模拟器)验证。
  • CSS变量回退技巧的实战价值:使用var(--vh, 1vh)提供回退值的做法,是经过大量项目验证的稳健策略,可避免变量未定义导致的布局崩溃。这一技巧在复杂项目中尤为重要,但较少被新手文档提及。
  • 社区热门文章的潜在局限性:掘金等平台的技术文章可能因时效性(如浏览器更新)或作者个人经验存在偏差,业内资深开发者通常会交叉参考MDN、CanIUse及内部技术报告,而非完全依赖单一来源。