使用 font-display 优化 web 字体加载速度,毕业一年萌新的前端大厂面经

50 阅读6分钟

src 属性用于指定字体的位置,其中 url() 函数也接受网络地址,来加载第三方提供的字体文件,这样也催生了像 Google Fonts 这样的云字体服务。不过,基本上只有英文字体才适合 Web Fonts,因为它只有 26 个英文字母外加数字,体积小,适合在网络上传输,而中文光常用的就有 3000 个字符,所以一般只使用操作系统自带的,不过现在也有字体服务会根据网站上所使用的文字去动态的生成字体文件。

浏览器加载 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 ,这样在加载网络字体期间,使用后备字体进行渲染,加载完成之后在替换为指定的网络字体。

应用


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

/* fonts.font.im/css?family=… */

@font-face {

font-family: 'Raleway';

font-style: normal;

font-weight: 500;

font-display: swap;

src: url(fonts.gstatic.font.im/s/raleway/v…) format('woff2');

unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;

}

/* ... */

浏览器支持


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

IEEdegeFireFoxChromeSafariIOS SafariAndroid BrowserChrome for AndroidFireFox for Android
No79586011.111.3818886
原文发表在:zxuqian.cn/css-font-di…,欢迎访问查看更多教程!

下面是我在学习HTML和CSS的时候整理的一些笔记,有兴趣的可以看下:

HTML、CSS部分截图

进阶阶段

进阶阶段,开始攻 JS,对于刚接触 JS 的初学者,确实比学习 HTML 和 CSS 有难度,但是只要肯下功夫,这部分对于你来说,也不是什么大问题。

JS 内容涉及到的知识点较多,看到网上有很多人建议你从头到尾抱着那本《JavaScript高级程序设计》学,我是不建议的,毕竟刚接触 JS 谁能看得下去,当时我也不能,也没那样做。

我这部分的学习技巧是,增加次数,减少单次看的内容。就是说,第一遍学习 JS 走马观花的看,看个大概,去找视频以及网站学习,不建议直接看书。因为看书看不下去的时候很打击你学下去的信心。

然后通过一些网站的小例子,开始动手敲代码,一定要去实践、实践、实践,这一遍是为了更好的去熟悉 JS 的语法。别只顾着来回的看知识点,眼高手低可不是个好习惯,我在这吃过亏,你懂的。

1、JavaScript 和 ES6

在这个过程你会发现,有很多 JS 知识点你并不能更好的理解为什么这么设计,以及这样设计的好处是什么,这就逼着让你去学习这单个知识点的来龙去脉,去哪学?第一,书籍,我知道你不喜欢看,我最近通过刷大厂面试题整理了一份前端核心知识笔记,比较书籍更精简,一句废话都没有,这份笔记也让我通过跳槽从8k涨成20k。

JavaScript部分截图

2、前端框架

前端框架太多了,真的学不动了,别慌,其实对于前端的三大马车,Angular、React、Vue 只要把其中一种框架学明白,底层原理实现,其他两个学起来不会很吃力,这也取决于你以后就职的公司要求你会哪一个框架了,当然,会的越多越好,但是往往每个人的时间是有限的,对于自学的学生,或者即将面试找工作的人,当然要选择一门框架深挖原理。

以 Vue 为例,我整理了如下的面试题。

Vue部分截图

开源分享:docs.qq.com/doc/DSmRnRG…