谷歌字体加载说明

Posted

技术标签:

【中文标题】谷歌字体加载说明【英文标题】:Google Fonts loading explained 【发布时间】:2017-01-31 01:44:37 【问题描述】:

我想知道,谷歌字体如何找出要加载的字体。例如,当我在我的 CSS 中使用它时

@import '//fonts.googleapis.com/css?family=Roboto:300';

它返回一个立即解释的 CSS(这个资源的加载甚至会阻止浏览器渲染 afaik):

/* cyrillic-ext */
@font-face 
  font-family: 'Roboto';
  font-style: normal;
  font-weight: 300;
  src: local('Roboto Light'), local('Roboto-Light'), url(http://fonts.gstatic.com/s/roboto/v15/0eC6fl06luXEYWpBSJvXCIX0hVgzZQUfRDuZrPvH3D8.woff2) format('woff2');
  unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F;

/* cyrillic */
@font-face 
  font-family: 'Roboto';
  font-style: normal;
  font-weight: 300;
  src: local('Roboto Light'), local('Roboto-Light'), url(http://fonts.gstatic.com/s/roboto/v15/Fl4y0QdOxyyTHEGMXX8kcYX0hVgzZQUfRDuZrPvH3D8.woff2) format('woff2');
  unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;

// ...and some more

我一直认为,当您在 CSS 中提供 url(...) 时,浏览器会立即加载此资源。

但是,当您打开这支笔 http://codepen.io/anon/pen/EgkvEr 并查看您的网络选项卡(可能会清除您的缓存)时,您会看到它加载了两个资源:http://fonts.googleapis.com/css?family=Roboto:300,然后是 http://fonts.gstatic.com/s/roboto/v15/Hgo13k-tfSpn0qi1SFdUfZBw1xU1rKptJj_0jans920.woff2,这是正常的拉丁语范围(定义在加载字体css的底部):

/* latin */
@font-face 
  font-family: 'Roboto';
  font-style: normal;
  font-weight: 300;
  src: local('Roboto Light'), local('Roboto-Light'), url(http://fonts.gstatic.com/s/roboto/v15/Hgo13k-tfSpn0qi1SFdUfZBw1xU1rKptJj_0jans920.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000;

那么,浏览器会查看您使用的字符,然后加载使用的字体吗?还是取决于您的浏览器设置?我找不到任何记录此行为的资源(或者我正在搜索错误的关键字)。 我怀疑这与 CSS 底部的 unicode-range: 有关。

【问题讨论】:

【参考方案1】:

    浏览器读取@import 指令,该指令告诉他加载这个由Google 提供的CSS 页面:http://fonts.googleapis.com/css?family=Roboto:300。此页面会立即加载。

    在该页面中,有一些url() 指令告诉浏览器字体文件的位置。 浏览器在需要这些字体之前不会下载它们。例如,如果该字体从未被任何元素使用,则浏览器不会下载它。

我怀疑它与 CSS 底部的 unicode-range: 有关。

是的,就是这样。 unicode-range 指定该字体包含哪类字符(例如,西里尔字符)。如果您的页面中没有这种风靡一时的字符,则不会下载这些字体。

供参考:https://en.wikipedia.org/wiki/Unicode_block

【讨论】:

另一个参考 - developer.mozilla.org/en-US/docs/Web/CSS/@font-face/…【参考方案2】:
    浏览器执行页面布局并确定在页面上呈现指定文本所需的字体变体。 对于每种需要的字体,浏览器都会检查该字体是否在本地可用。 如果文件在本地不可用,它会遍历外部定义:
如果存在格式提示,浏览器会在开始下载之前检查它是否支持它,否则进入下一个。 如果没有格式提示,浏览器会下载资源。

Google web font optimization

【讨论】:

以上是关于谷歌字体加载说明的主要内容,如果未能解决你的问题,请参考以下文章

页面加载后动态加载谷歌字体

延迟加载谷歌字体类型

从谷歌网络字体加载字体或从自己的服务器加载字体,哪一种在页面加载时间方面更有效?

如何在 Nuxt 中高效加载谷歌字体

iphone邮件不会加载谷歌字体奥斯瓦尔德

html 推迟谷歌字体加载