使用 font-display 控制字体性能

决定 Web 字体在加载时的行为可能是一项重要的性能调优技术。借助 @font-face 的新 font-display 描述符,开发者可以根据 Web 字体的加载时间决定其渲染方式(或回退方式)。

目前字体呈现方面的差异

借助 Web Fonts,开发者可以将丰富的排版样式纳入到其项目中,但代价是,如果用户还没有字体,浏览器就必须花费一些时间下载该字体。由于网络可能会不稳定,因此此下载时间可能会对用户体验产生不利影响。毕竟,如果文字需要花费过长的时间才能显示,没人会在意文字有多漂亮!

为了降低字体下载缓慢带来的一些风险,大多数浏览器都会实现超时机制,超时之后将使用回退字体。这是一种非常实用的技术,但遗憾的是,各个浏览器的实际实现方式并不相同。

浏览器 超时 后备 交换
Chrome 35 及更高版本 3 秒
Opera 3 秒
Firefox 3 秒
Internet Explorer 0 秒
Safari 不会超时 不适用 不适用
  • Chrome 和 Firefox 的超时时间为 3 秒,在此之后,将会以回退字体来显示文本。如果成功下载字体,那么最终会发生交换,并以期望的字体重新渲染文本。
  • Internet Explorer 的超时时间为零秒,这表示文本得以立即渲染。如果所请求的字体尚不可用,那么将使用回退字体,之后在所请求的字体可用时将重新渲染该文本。
  • Safari 没有超时行为(或者至少并无超出网络超时基准的行为)。

更糟糕的是,开发者在决定这些规则对其应用的影响方面只能发挥有限的作用。注重性能的开发者可能更倾向于使用回退字体来提供更快的初始体验,并仅在用户在后续访问时有机会下载更漂亮的 Web 字体后才使用该字体。使用 Font Loading API 等工具,您或许可以替换某些默认浏览器行为并提升性能,但代价是需要编写大量 JavaScript,这些 JavaScript 必须内嵌到网页中或从外部文件请求,从而导致额外的 HTTP 延迟时间。

为帮助解决此问题,CSS 工作组已提议采用新的 @font-face 描述符 font-display,以及用于控制可下载字体在完全加载前如何渲染的相应属性。

字体下载时间表

与某些浏览器目前实施的现有字体超时行为相似,font-display 将字体下载生命周期分为三个主要阶段。

  1. 第一个期间是字体阻止期。在此期间,如果字体未加载,则任何尝试使用字体的元素都必须改用不可见的回退字体来渲染。如果字体在阻止期成功加载,则正常使用字体。
  2. 字体交换期紧随字体阻止期之后。在此期间,如果字体未加载,则任何尝试使用字体的元素都必须改用回退字体来渲染。如果字体在交换期成功加载,则正常使用字体。
  3. 字体失败期紧随字体交换期之后。如果字体在此期间开始时尚未加载,则会将字体标记为加载失败,从而导致正常字体回退。否则,正常使用字体。

了解这些期间后,您即可使用 font-display,根据是否或何时下载字体,决定渲染字体的方式。

哪种 font-display 适合您?

如需使用 font-display 描述符,请将其添加到 @font-face at-rule:

@font-face {
    font-family: 'Arvo';
    font-display: auto;
    src: local('Arvo'), url(https://fonts.gstatic.com/s/arvo/v9/rC7kKhY-eUDY-ucISTIf5PesZW2xOQ-xsNqO47m55DA.woff2) format('woff2');
}

font-display 目前支持以下范围的值 auto | block | swap | fallback | optional

自动

auto 使用 user-agent 所用的字体显示策略。大多数浏览器当前使用类似于屏蔽的默认策略。

阻挡

block 为字体指定较短的阻止期(在大部分情况下,建议值为 3 秒)以及无限的交换期。换言之,字体未加载时,浏览器首先绘制“不可见”的文本,但在字体加载后立即交换字体。为此,浏览器将创建指标与所选字体相似的匿名字体,但所有字形皆不含“墨水”。只有在必须以特定字样渲染文本以使页面可用时,才应使用此值。

互换

swap 为字体指定零秒的阻止期,以及无限的交换期。这意味着字体未加载时,浏览器会立即以回退字体来绘制文本,但在字体加载后立即交换字体。与 block 相似,仅当以特定字体渲染文本对于页面来说十分重要,但以任何字体渲染都可呈现正确的消息时,才应使用此值。徽标文本非常适合于交换,因为使用合理的回退字体显示公司名称即可传达消息,但您最终会使用正式的字样。

后备

fallback 为字体指定极短的阻止期(在大部分情况下,建议值为 100 毫秒或更短)以及较短的交换期(在大部分情况下,建议值为 3 秒)。换言之,字体未加载时,首先使用回退字体来渲染字体,但在字体加载后立即交换字体。但是,如果经过的时间过长,则在页面剩余的生命周期中将使用回退字体。回退字体非常适合于正文等内容,对于这些内容,您希望用户尽快开始阅读,不想让新字体载入时发生的文本移动干扰其体验。

可选

optional 为字体指定极短的阻止期(在大部分情况下,建议值为 100 毫秒或更短)以及零秒的交换期。与后备字体类似,此值非常适合在下载的字体可以“锦上添花”,但对体验而言不是至关重要时使用。此可选值让浏览器决定是否启动字体下载,而浏览器会从用户的角度出发,选择最适合的方案,即可能选择不下载,或以低优先级执行下载。当用户的网络连接较差以及下载字体并非利用资源的最佳方式时,可以使用此方法。

浏览器支持

font-display 目前位于桌面版 Chrome 49 中的“实验性 Web 平台功能”标志后面,并已在 Opera 和 Android 版 Opera 中发布。

演示

请查看示例,试用一下 font-display。对于注重性能的开发者来说,这可以成为您的工具箱中又一款实用的工具!