CWV 报告里桌面端的 CLS 是 0.31,移动端反而只有 0.02,两套样式共用同一份模板,移动端还额外加载了更多脚本。
一开始怀疑是「桌面端字体加载后换行,段落高度发生变化」,查了一圈,方向不对。
原因不止一个,得分开看。桌面端侧边栏异步插入,把正文整体推到下方。也可能是桌面广告位按视口宽度计算高度,初始高度为 0。
不容易想到的是,移动端把侧边栏隐藏了,所以完全不受影响。
先确认偏移发生在哪个断点
curl -s https://www.example.com/a/1.html | grep -n 'sidebar' | head
给侧边栏预留固定高度
.sidebar{min-height:600px;contain:layout;}
广告位用 aspect-ratio 固定比例
.ad-slot{aspect-ratio:300/250;width:100%;}
等前面都确认过,再用布局偏移观察器验证修复
new PerformanceObserver(l=>console.log(l.getEntries())).observe({type:'layout-shift',buffered:true});
改完先别撤,确认这几项。桌面端 CLS 从 0.31 降到 0.05 以下,移动端保持原样,两侧都进入了绿色区间。
这里还有个坑。CLS 按设备分别统计,两个端差得远时先看哪一侧有异步插入的模块,而不是去改公共样式。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
