在几个月内,这家领先的英国新闻网站成功将其第 75 百分位的 CLS 从 0.25 提高到了 0.1,提高了 250%。
视觉稳定性挑战
布局偏移可能会造成严重干扰。在 Telegraph Media Group (TMG),视觉稳定性尤为重要,因为读者主要使用我们的应用浏览新闻。如果在阅读文章时布局发生变化,读者可能会找不到之前所处的位置。这可能会让用户感到不快,并会分心。
从工程的角度来看,确保页面不会移位并干扰读者可能具有挑战性,尤其是当应用区域是异步加载并动态添加到页面时。
TMG 有多个团队负责客户端代码:
- 核心工程。实施第三方解决方案,为内容推荐和评论等领域提供支持。
- 营销。运行 A/B 测试,以评估读者与新功能或更改的互动情况。
- 广告。管理广告请求和进行预出价。
- 编辑。在推文或视频等文章以及自定义 widget(例如冠状病毒病例跟踪工具)中嵌入代码。
确保其中每个团队都不会导致页面布局抖动,这可能很难实现。该团队使用 Cumulative Layout Shift 指标来衡量此变更对读者的发生频率,从而深入了解实际用户体验并制定明确的目标。这导致我们的第 75 个百分位 CLS 从 0.25 提高到 0.1,并且通过的存储分区从 57% 增长到 72%。
250%
第 75 百分位 CLS 改进
15%
CLS 得分较高的用户增幅
起点
借助 CrUX 信息中心,我们能够确定网页的变化幅度超出我们的预期。

理想情况下,我们希望至少 75% 的读者获得“良好”的体验,因此我们开始找出布局不稳定的原因。
我们如何测量布局偏移
我们结合使用了 Chrome DevTools 和 WebPageTest 来帮助识别导致布局偏移的原因。在开发者工具中,我们使用性能标签页的“体验”部分突出显示了移位布局的各个实例,以及这些实例对总体得分的影响。

WebPageTest 会突出显示选择“突出显示布局偏移”后在时间轴视图中发生布局偏移的位置,

在审核了我们最常访问的模板的每项调整后,我们针对如何改进制定了一份建议列表。
减少布局偏移
我们重点关注了可以减少布局偏移的四个方面: - 广告 - 图片 - 标题 - 嵌入
广告
广告会在初次绘制后通过 JavaScript 加载。这些容器加载的某些容器没有预留高度。

虽然我们不知道确切的高度,但我们可以通过使用在广告位中加载的最常用广告尺寸来预留空间。

在某些情况下,我们对广告的平均高度的判断有误。对于平板电脑读卡器,插槽会收起。

我们重新审视了该槽位,并调整了高度以使用最常见的尺寸。

图片
网站上的许多图片都是延迟加载的,系统会为其预留空间。

但是,文章顶部的内嵌图片在容器中没有预留任何空间,也没有与标记相关联的宽度和高度属性。这会导致布局在加载时发生变化。

只需为图片添加宽度和高度属性,即可确保布局不会偏移。

标题
标头位于标记中的内容下方,并使用 CSS 将其放置在顶部。最初的想法是优先考虑导航之前的内容加载,但这会导致页面短暂偏移。

将页眉移至标记的顶部后,网页无需此偏移即可呈现。

嵌入
一些常用的嵌入具有定义的宽高比。例如 YouTube 视频。在播放器加载过程中,我们会从 YouTube 中提取缩略图,并在视频加载时将其用作占位符。

衡量影响
我们能够使用本文开头部分提到的工具,轻松地衡量功能层面的影响。不过,我们希望同时在模板级别和网站级别衡量 CLS。总的来说,我们使用 SpeedCurve 来验证预生产和生产环境中的更改。

然后,在代码正式投入使用后,我们能够验证 RUM 数据(由 mPulse 提供)中的结果。

查看 RUM 数据可以让我们确信我们所做的更改会对读者产生积极影响。
我们查看的最终数据是 Google 收集的 RUM 数据。现在,这项指标尤为重要,因为它们很快就会影响网页排名。 对于初学者,我们使用了 Chrome 用户体验报告,既可以通过 CrUX 信息中心获取每月源站级数据,也可以通过查询 BigQuery 来检索 p75 历史数据。通过这种方式,我们很容易就能看到,对于 CrUX 衡量的所有流量,第 75 百分位的 CLS 从 0.25 提高到 0.1,提高了 250%,通过范围从 57% 增长到了 72%。


此外,我们能够利用 Chrome UX Report API 并创建一些拆分为模板的内部信息中心。

避免 CLS 回归
改进性能的一个重要方面是避免性能下降。我们为关键指标设置了一些基本的性能预算,并且在其中纳入了 CLS。

如果测试超出预算,它将向 Slack 频道发送消息,以便我们调查原因。我们还设置了每周报告,这样即使模板仍在预算内,我们也知道发生了任何负面影响。
我们还计划增加预算,以使用 RUM 数据以及合成数据,方法是使用 mPulse 来设置静态提醒和潜在的异常值检测,让我们知道任何异常变化。
对我们而言,在开发新功能时一定要牢记 CLS。我提到的很多更改都是在向读者发布之后必须进行修复的。今后,在设计任何新功能时,布局稳定性都将成为一项解决方案设计考量因素,以便我们能够从一开始就避免任何意外的布局偏移。
总结
到目前为止,我们做出的改进易于实现,并产生了显著的影响。我在本文中概述的许多更改都没有花太多时间,而是应用于所有最常用的模板,这意味着它们给我们的读者带来了广泛的积极影响。
该网站还有一些地方需要改进。我们正在探索通过哪些方式可以在客户端逻辑服务器端执行更多工作,这将进一步改善 CLS。我们将持续跟踪和监控指标,以便不断地改进这些指标,尽可能为读者提供最佳的用户体验。