第2262期Web 性能优化:使用 CSS font-display 控制字体加载和替换

Posted 前端早读课

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第2262期Web 性能优化:使用 CSS font-display 控制字体加载和替换相关的知识,希望对你有一定的参考价值。

前言

423读书节活动第二波来袭,今天有4种图书详情参考文末下方。查看通过lighthouse出的性能报告,看到font-display属性,好奇之。今日前端早读课文章由@峰华授权分享。

Bilibili UP@峰华前端工程师,激发前端创意,提升开发技能!

正文从这开始~~

在编写网站的时候,或多或少都会用到一些网络上的字体,CSS 3 中虽然加入了对 Web Fonts(网络字体)的支持,但是浏览器对它们的加载和默认处理方式会极大的影响网站的性能和用户体验。例如默认情况下,在 Web Fonts 加载时,使用该字体的地方会显示空白,直到字体下载完成之后才会显示,这时通过改变 CSS 中的 font-display 属性,就可以避免这个问题。

什么是 Web Fonts

在介绍 font-display 之前,先了解一下什么是 Web Fonts。在以前使用 CSS 指定字体时只能使用用户电脑本地上现有的字体,而由于每个用户电脑上的字体可能都不一样,所以能用的基本上就是操作系统内置的一些字体,例如微软雅黑,宋体,苹果苹方,这些也叫做安全字体(Web Safe Fonts)。为了使字体显示正常,我们一般会通过 font-family 属性同时指定多个字体,如果第一个字体没有在操作系统中找到,就会使用下一个后备字体( Fallback Font ),以此类推:

* {
font-family: "PingFang SC", "Microsoft Yahei", sans-serif;
}

后来,CSS 开始支持 @font-face 这个指令,可以加载自定义的字体文件,这个时候可以把字体随网站一起发布,用户在浏览网站的时候,会下载 @font-face 中指定的字体。例如下边的代码加载了 fonts 目录下的 Raleway 字体:

@font-face {
font-family: 'Raleway';
font-style: normal;
font-weight: 500;
src: url(/fonts/raleway.woff2) format('woff2');
}

浏览器加载 Web Fonts 的时期

浏览器加载 Web Fonts 时按顺序会有三个时期:

阻塞期(Block Period)。在此期间如果字体没有加载完成,那么浏览器会使用 font-family 指定的字体列表中的后备字体(Fallback)进行渲染,但是显示为空白,也就是对于用户是不可见的。在此期间字体加载完成之后才能正常显示该字体。

交换期(Swap Period)。跟阻塞期类似,但是在这个时期内,它会在字体加载时,先用后备字体渲染文本并显示出来(而不是显示空白),在此期间字体加载完成之后才能正常的显示该字体。

失败期(Failure Period)。如果字体加载失败,则使用后备字体显示文本。

至于每个时期有多长,是根据 font-display 属性的值来确定的。

font-display 介绍

font-display 确切的说不是 CSS 属性,而是专用于 @font-face 指令的描述符,它可以取如下几个值:

auto 。这个是 font-display 的默认值,字体的加载过程由浏览器自行决定,不过基本上和取值为 block 时的处理方式一致。

block 。在字体加载前,会使用备用字体渲染,但是显示为空白,使得它一直处于阻塞期,当字体加载完成之后,进入交换期,用下载下来的字体进行文本渲染。不过有些浏览器并不会无限的处于阻塞期,会有超时限制,一般在 3 秒后,如果阻塞期仍然没有加载完字体,那么直接就进入交换期,显示后备字体(而非空白),等字体下载完成之后直接替换。

swap 。基本上没有阻塞期,直接进入交换期,使用后备字体渲染文本,等用到的字体加载完成之后替换掉后备字体。

fallback 。阻塞期很短(大约100毫秒),也就是说会有大约 100 毫秒的显示空白的后备字体,然后交换期也有时限(大约 3 秒),在这段时间内如果字体加载成功了就会替换成该字体,如果没有加载成功那么后续会一直使用后备字体渲染文本。

optional 。与 fallback 的阻塞期一致,但是没有交换期,如果在阻塞期的 100 毫秒内字体加载完成,那么会使用该字体,否则直接使用后备字体。这个就是说指定的网络字体是可有可无的,如果加载很快那么可以显示,加载稍微慢一点就不会显示了,适合网络情况不好的时候,例如移动网络。

那么在了解 font-display 之后,那么我们应该不难看出来,对于大部分情况应该把它的值设置为 swap ,这样在加载网络字体期间,使用后备字体进行渲染,加载完成之后在替换为指定的网络字体。

【第2262期】Web 性能优化:使用 CSS font-display 控制字体加载和替换

应用

现在使用谷歌的 Web Fonts 字体服务已经不需要我们用手动去写 @font-face 指令了,而是通过调用它的接口,直接返回一段 @font-face 指令 CSS 代码,同时它也支持 display=swap 参数,来让返回的 CSS 代码中,设置 font-display 为 swap ,这个可以从我的网站上看到:

/* https://fonts.font.im/css?family=Raleway:500,700&display=swap */
@font-face {
font-family: 'Raleway';
font-style: normal;
font-weight: 500;
font-display: swap;
src: url(https://fonts.gstatic.font.im/s/raleway/v19/1Ptug8zYS_SKggPNyCAIT4ttDfCmxA.woff2) format('woff2');
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}

/* ... */

浏览器支持

从 caniuse.com 网站上可以查到,这个属性在各个浏览器中的支持程度为(最低版本):

关于本文

活动规则

很简单,添加早读君微信vx: zhgb_f2er 进群抽奖,备注:423。于2021年4月23号晚群内抽奖。奖品是,《Xmind用好思维导图走上开挂人生》,,。

为你推荐






欢迎自荐投稿,前端早读课等你来。

以上是关于第2262期Web 性能优化:使用 CSS font-display 控制字体加载和替换的主要内容,如果未能解决你的问题,请参考以下文章

第1487期Netflix 的 Web 性能案例研究

第75期10款Web程序员必备的CSS工具

第1131期对于网络爬虫技术的攻与防

第 005 期 Vue 运行时性能优化之减少渲染组件的次数

第1615期React Native 图表性能优化实践

第1671期21 项优化 React App 性能的技术