移动端首屏轮播用了 height:100vh,浏览器地址栏收起时视口高度变化,图片区跟着重排。CrUX 里 CLS 0.24,集中在安卓设备的落地页。

一开始怀疑是「首屏之后的正文被整体推下去,位移值被累计」,查了一圈,方向不对。

把日志和配置对完,能解释这个现象的基本就这几处。100vh 在移动浏览器里按最大视口计算,地址栏变化会触发布局重算。少数情况下是轮播容器高度依赖视口,图片没有预留固定比例。

少数情况下是轮播切换时容器高度被脚本重设 触发第二次位移。

动手时先用动态视口单位替换固定值

.hero{height:100svh;max-height:640px;}

给图片容器固定宽高比

.hero img{aspect-ratio:16/9;width:100%;height:auto;}

本地跑一次布局位移检查

npx lighthouse https://www.example.com/ --only-categories=performance

两周后看 CrUX 的 CLS 分位

curl -s https://www.example.com/ | grep -c 'svh'

别只看报错消失,验证要多做一步。换成 svh 并给图片固定比例后,实测 CLS 从 0.24 降到 0.03,移动端体验分提升 11 分。

容易忽略的是,视口单位优先用 svh 或 dvh,100vh 在移动端几乎必然带来抖动,尤其是首屏有轮播或大图的页面。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189