列表页先用骨架屏占位 数据回来之后替换成真实卡片 高度从 240px 变成 310px CLS 记到 0.21 滚动条的位置也跟着变。乍看像缓存或者权限的锅,追下去往往不是。

.skeleton { min-height: 310px; }
.card { min-height: 310px; }
# 两者高度必须一致

追下去是这么回事:骨架只画了大致轮廓 没按真实卡片的行数和字号算高度 数据回来内容自然撑开 占位和实际差多少 位移就有多少 像素级误差也会累计。

「骨架屏高度」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。

具体做法是,按真实卡片结构算骨架高度 标题两行 摘要两行 缩略图定比例;骨架和真实内容用同一套 padding 和 line-height 差值控制在一两像素;数据回来先渲染到隐藏容器量一次高度 再整体替换上去。

验收就看一点,切换前后卡片的高度保持一致 CLS 降到 0.05 以下 滚动条也不再跳动。

作者 9823189