如何在 CSS 中使用 @font-face

Avatar of Chris Coyier
Chris Coyier

@font-face 规则允许在网页上加载自定义字体。一旦添加到样式表中,该规则就会指示浏览器从其托管位置下载字体,然后按照 CSS 中指定的格式显示。

如果没有该规则,我们的设计将局限于用户计算机上已经加载的字体,这些字体根据使用的系统而有所不同。这是一个很好的 现有系统字体的分解


通用浏览器支持

此浏览器支持数据来自 Caniuse,其中包含更多详细信息。数字表示浏览器从该版本开始支持该功能。

桌面

ChromeFirefoxIEEdgeSafari
43.59123.1

移动设备 / 平板电脑

Android ChromeAndroid FirefoxAndroidiOS Safari
12712744.2-4.3

浏览器支持的实用级别

事情 正在大力转向 WOFFWOFF 2,所以我们可能可以做到这一点

@font-face {
  font-family: 'MyWebFont';
  src:  url('myfont.woff2') format('woff2'),
        url('myfont.woff') format('woff');
}

你甚至可能可以做到这些天只使用 WOFF2。

@font-face {
  font-family: 'MyWebFont';
  src: url('myfont.woff2') format('woff2');
}

此浏览器支持数据来自 Caniuse,其中包含更多详细信息。数字表示浏览器从该版本开始支持该功能。

桌面

ChromeFirefoxIEEdgeSafari
36391412

移动设备 / 平板电脑

Android ChromeAndroid FirefoxAndroidiOS Safari
12712712710.0-10.2

使用 WOFF 的唯一实用之处也是它能让你获得 Internet Explorer 11 支持。

最深层次的浏览器支持

这是目前支持最广泛的方法。@font-face 规则应在任何样式之前添加到样式表中。

@font-face {
  font-family: 'MyWebFont';
  src: url('webfont.eot'); /* IE9 Compat Modes */
  src: url('webfont.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
       url('webfont.woff2') format('woff2'), /* Super Modern Browsers */
       url('webfont.woff') format('woff'), /* Pretty Modern Browsers */
       url('webfont.ttf')  format('truetype'), /* Safari, Android, iOS */
       url('webfont.svg#svgFontName') format('svg'); /* Legacy iOS */
}

然后像这样使用它来设置元素的样式

body {
  font-family: 'MyWebFont', Fallback, sans-serif;
}

稍微更深的浏览器支持

如果您需要在完全支持和实用支持之间找到一种平衡,添加一个 .ttf 将覆盖更多范围

@font-face {
  font-family: 'MyWebFont';
  src: url('myfont.woff2') format('woff2'),
       url('myfont.woff') format('woff'),
       url('myfont.ttf') format('truetype');
}
ChromeSafariFirefoxOperaIEAndroidiOS
3.5+3+3.5+10.1+9+2.2+4.3+

替代技术

@import

虽然 @font-face 非常适合托管在我们自己的服务器上的字体,但在某些情况下,托管字体解决方案可能更好。 Google Fonts 提供这种方式来使用他们的字体。以下是使用 @importGoogle Fonts 加载 Open Sans 字体的示例

@import url(//fonts.googleapis.com/css?family=Open+Sans);

然后我们可以用它来设置元素的样式

body {
  font-family: 'Open Sans', sans-serif;
}

如果您 打开字体的 URL,实际上可以查看幕后完成的所有 @font-face 工作。

使用托管服务的一个好处是它很可能包含所有字体文件变体,这确保了深层的跨浏览器兼容性,而不必自己托管所有这些文件。

同样,你可以像链接任何其他 CSS 文件一样链接到相同的资源,在 HTML 文档的<head> 中,而不是在 CSS 中。使用 Google Fonts 中的同一个示例,这是我们将使用的内容

<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Open+Sans&display=swap" rel="stylesheet">

然后,我们可以像其他方法一样设置我们的元素样式

body {
  font-family: 'Open Sans', sans-serif;
}

同样,这是导入@font-face 规则,但不是将它们注入到我们的样式表中,而是将它们添加到我们的 HTML <head> 中。

它差不多是同一件事......两种技术都会下载所需的资源。

了解字体文件类型

这篇文章开头的原始代码片段引用了许多具有奇怪扩展名的文件。让我们逐一了解它们,更好地理解它们的含义。

WOFF / WOFF2

代表: Web Open Font Format(网页开放字体格式)。

WOFF 字体专为网页使用而创建,并由 Mozilla 与其他组织合作开发。WOFF 字体通常比其他格式加载更快,因为它们使用 OpenType (OTF) 和 TrueType (TTF) 字体使用的结构的压缩版本。这种格式还可以在字体文件中包含元数据和许可信息。这种格式似乎是赢家,所有浏览器都将转向它。

WOFF2 是 WOFF 的下一代,它拥有比原始版本更好的压缩率。

SVG / SVGZ

代表: Scalable Vector Graphics(可缩放矢量图形)(字体)

SVG 是字体的矢量重现,这使得它在文件大小上轻得多,也使其非常适合移动设备使用。这种格式是 iOS 上 Safari 4.1 及以下版本允许的唯一格式。Firefox、IE 或 IE Mobile 目前不支持 SVG 字体。 Firefox 已经无限期地推迟了实施,以专注于 WOFF。

SVGZ 是 SVG 的压缩版本。

EOT

代表: Embedded Open Type(嵌入式 OpenType)。

这种格式由微软(@font-face 的最初创新者)创建,是一种专有文件标准,仅 IE 支持。实际上,它是 IE8 及以下版本在使用@font-face 时唯一识别的格式。

OTF / TTF

代表: OpenType Font(开放式字体)和 TrueType Font(TrueType 字体)。

WOFF 格式最初是为了应对 OTF 和 TTF 而创建的,部分原因是这些格式很容易(并且非法地)被复制。但是,OpenType 具有许多设计师可能感兴趣的功能(连字等)。

关于性能的说明

网页字体在设计上很棒,但重要的是也要了解它们对网页性能的影响。自定义字体通常会导致网站性能下降,因为字体必须先下载才能显示。

一个常见的症状过去是字体首先以回退字体加载,然后闪烁到已下载字体的一瞬间。 Paul Irish 有一篇关于此问题的旧文章(称为“FOUT”:Flash Of Unstyled Text)。

现在,浏览器通常在默认情况下会在自定义字体加载之前隐藏文本。更好还是更糟?你来决定。你可以通过各种技术对此进行一些控制。这篇文章中并没有深入讨论这些内容,但这里有一组 Zach Leatherman 写的三篇文章,可以帮助你开始踏入这个兔子洞

在实施自定义字体时,还需要考虑以下事项

注意文件大小

字体的大小可能会出乎意料地大,因此请选择提供较轻版本的选择。例如,选择一个 50KB 的字体集,而不是一个 400KB 的字体集。

如果可能,限制字符集

你真的需要一个字体中的粗体和黑色粗体吗?将字体集限制为只加载使用过的字体是一个好主意,这里有一些关于这方面的不错建议

考虑在小屏幕上使用系统字体

许多设备被困在糟糕的连接中。一个技巧可能是使用@media在加载自定义字体时定位更大的屏幕。

在这个示例中,小于 1000px 的屏幕将使用系统字体,而大于或等于该宽度的屏幕将使用自定义字体。

@media (min-width: 1000px) { 
  body {
    font-family: 'FontName', Fallback, sans-serif; 
  }
}

字体服务

有很多服务可以托管字体,并提供对商业许可字体的访问。使用服务的优势通常归结为高效地提供大量合法的字体(例如,在快速的 CDN 上提供它们)。

以下是一些托管字体服务

图标字体怎么样?

没错,@font-face 可以加载一个包含图标的字体文件,这些图标可以用作图标系统。但是,我认为使用 SVG 作为图标系统要好得多。这里是对这两种方法的比较

使用 @font-face 的后续步骤

关于 @font-face 性能的更多内容

相关 CSS 属性

更多 @font-face 资源