当开发网站时,你需要考虑浏览器如何处理你网站上的 CSS。为了减轻 CSS 可能引起的性能问题,你应该对其进行优化。例如,你应该优化 CSS 以减少阻塞渲染 (en-US)并最小化所需的回流次数。本文将为你介绍关键的 CSS 性能优化技术。
前提: | 基本的计算机操作能力,已安装基本软件,以及对客户端 Web 技术的基本了解。 |
---|---|
目标: | 了解 CSS 对网站性能的影响,以及如何优化 CSS 以改善性能。 |
当开发网站时,你需要考虑浏览器如何处理你网站上的 CSS。为了减轻 CSS 可能引起的性能问题,你应该对其进行优化。例如,你应该优化 CSS 以减少阻塞渲染 (en-US)并最小化所需的回流次数。本文将为你介绍关键的 CSS 性能优化技术。
前提: | 基本的计算机操作能力,已安装基本软件,以及对客户端 Web 技术的基本了解。 |
---|---|
目标: | 了解 CSS 对网站性能的影响,以及如何优化 CSS 以改善性能。 |
浏览器有一个固定的渲染流程——只有在布局(layout)完成后才能绘制(paint)页面,而布局的前提是要生成渲染树(render tree),而渲染树的生成则需要 DOM 和 CSSOM 树的配合。
如果先让用户看到一个没有样式的页面,等 CSS 样式解析完后再重绘(repaint),这样的体验会很差。所以,浏览器会等到确定需要 CSS 时才开始渲染。只有在下载完 CSS 并生成 CSS 对象模型 CSS 对象模型(CSSOM)之后,浏览器才会绘制页面。
为了优化 CSSOM 的构建并提高页面性能,你可以根据当前 CSS 的状态执行以下一项或多项操作:
动画可以改善感知性能,使界面更加流畅,让用户在等待页面加载时感觉到进展(例如加载旋转图标)。然而,更大更多的动画自然需要更多的处理能力来处理,这可能会降低性能。
最简单的建议是减少所有不必要的动画。你还可以为用户提供一个控件/站点选项,让他们可以关闭动画,例如当他们使用低功率设备或电池电量有限的移动设备时。你还可以使用 JavaScript 来控制页面是否应用动画。还有一个名为 的媒体查询,可以根据用户对动画的操作系统级偏好选择性地提供动画样式。
对于必要的 DOM 动画,建议尽可能使用 CSS 动画,而不是 JavaScript 动画(Web 动画 API 提供了一种直接使用 JavaScript 连接到 CSS 动画的方法)。
接下来,动画性能在很大程度上取决于你要进行动画处理的属性。某些属性在进行动画处理时会触发回流(进一步也会触发重绘 (en-US)),应该避免使用这些属性。这些属性包括:
现代浏览器很智能,只会重新绘制文档中已更改的区域,而不是整个页面。因此,越大的动画成本越高。
如果可以的话,最好对不会引起回流/重绘的属性进行动画处理。这包括:
为了进一步提高性能,你应该考虑将动画处理工作转移到主线程之外,并放到设备的 GPU 上进行(也称为合成(compositing))。这可以通过选择特定类型的动画来实现,浏览器会自动将这些动画发送到 GPU 来处理。包括:
在 GPU 上进行动画处理可以提高性能,尤其是在移动设备上。然而,将动画处理移到 GPU 并不总是那么简单。请阅读 CSS GPU 动画:正确使用(smashingmagazine.com,2016)以获取非常有用和详细的分析。
CSS 可以使用媒体查询将样式限定在特定条件下。媒体查询对于响应式网页设计非常重要,并且可以帮助我们优化关键渲染流程。浏览器会阻塞渲染直到解析完所有的样式,但不会阻塞不会使用的样式,例如打印样式表。通过根据媒体查询将 CSS 拆分为多个文件,可以防止在下载未使用的 CSS 时阻塞渲染。要创建一个非阻塞的 CSS 链接,将不立即使用的样式(例如打印样式)移动到单独的文件中,在 HTML 标记中添加一个 ,并添加一个媒体查询,在本例中是打印样式表。
默认情况下,浏览器假设每个指定的样式表都会阻塞渲染。通过添加具有媒体查询的 属性告诉浏览器样式表应该何时应用。当浏览器看到一个样式表时,它会知道它只需要将其应用于特定的情况,它仍然会下载样式表,但不会阻塞渲染。通过将 CSS 拆分为多个文件,主要的阻塞渲染文件(在本例中是 )会变得更小,从而减少了渲染阻塞的时间。
本节包含一些有用的技巧,可以用于改善 Web 字体的性能。
总体而言,请仔细考虑在你的网站上使用的字体。某些字体文件可能非常大(几兆字节)。虽然使用大量字体以获得视觉上的吸引力可能很诱人,但这可能会显著降低页面加载速度,并使你的网站看起来凌乱不堪。你可能只需要使用两到三种字体,如果选择使用 Web 安全字体,则可以使用更少的字体。
请记住,字体仅在使用 属性应用于元素时才会加载,而不是在首次使用 at 规则引用时加载:
因此,使用 来提前加载重要的字体,这样它们在实际需要时可以更快地可用:
如果你的 声明位于一个大型的外部样式表中,并且在解析过程中不会被立即访问到,那么这种做法更有益处。不过要适当权衡:字体文件相当大,如果预加载太多字体,可能会延迟其他资源的加载。
你还可以考虑以下几点:
通过使用 CSS 局限模块中定义的属性,你可以指示浏览器将页面的不同部分隔离开来,并独立地优化它们的渲染。这允许在渲染各个部分时提高性能。例如,你可以指定浏览器在特定容器于视口中可见之前不要渲染它们。
属性允许作者精确指定要应用于页面上各个容器的局限类型。这使得浏览器可以针对 DOM 的一部分重新计算布局、样式、绘制、大小或它们的任意组合。
属性是一个有用的快捷方式,允许作者在一组容器上应用一组强大的局限,并指定浏览器在需要之前不要布局和渲染这些容器。
另一个属性 也可用,它允许你为容器提供一个占位大小,同时它们受到局限的影响。这意味着即使容器的内容尚未渲染,它们也会占据空间,允许包含执行其性能优化而不会出现滚动条的变动和卡顿。这提高了内容正在加载时用户体验的质量。
Contact: 耀世-耀世平台-耀世全球商务站
Phone: 13800000000
Tel: 400-123-4567
E-mail: admin@youweb.com
Add: Here is your company address