MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

CSS 字体引入方式@font-face与Google Fonts对比

2023-03-126.1k 阅读

一、@font-face 字体引入方式

1.1 @font-face 基本概念

在 CSS 中,@font-face 规则允许网页开发者为其网页指定在线字体。通过这种方式,即使用户的计算机上没有安装特定字体,网页也能以开发者期望的字体展示文本。@font-face 规则本质上是一种告诉浏览器如何加载和使用自定义字体的指令。

@font-face 规则出现之前,网页设计师只能依赖用户系统中已安装的字体。这极大地限制了网页在字体选择上的多样性。而 @font-face 打破了这一限制,使得网页能够使用几乎任何字体,只要该字体的版权允许在网页上使用。

1.2 @font-face 语法结构

@font-face 规则的基本语法如下:

@font-face {
  font-family: 'YourFontName';
  src: local('YourFontName'),
       url('yourfont.woff2') format('woff2'),
       url('yourfont.woff') format('woff'),
       url('yourfont.ttf') format('truetype'),
       url('yourfont.eot') format('embedded-opentype'),
       url('yourfont.svg#YourFontName') format('svg');
  font-weight: normal;
  font-style: normal;
}
  • font-family:指定字体的名称。这个名称将在后续的 font-family 属性中使用,来应用该字体。例如,在其他 CSS 选择器中,可以通过 font-family: 'YourFontName'; 来应用这个自定义字体。
  • src:指定字体文件的来源。src 属性可以包含多个值,浏览器会按照顺序尝试加载这些字体文件。local('YourFontName') 表示先尝试加载用户系统中已安装的同名字体,如果找不到,则会依次尝试从 URL 加载不同格式的字体文件。常见的字体格式有 woff2woffttfeotsvgwoff2 是一种高效的字体压缩格式,现代浏览器都支持它,并且它在文件大小和加载速度上表现出色;woff 是较旧版本的格式,兼容性稍好;ttf 是 TrueType 字体格式,在桌面系统中广泛使用;eot 是微软专用的嵌入式 OpenType 字体格式,主要用于支持旧版 Internet Explorer;svg 格式主要用于在 SVG 图像中嵌入字体。
  • font-weightfont-style:分别指定字体的粗细和样式。可以设置为 normalbolditalic 等常见值,用于定义字体在不同使用场景下的外观。

1.3 @font-face 示例代码

假设我们有一个自定义字体文件 MyCustomFont.woff2MyCustomFont.woff,以下是如何使用 @font-face 将其引入网页:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>@font-face Example</title>
  <style>
    @font-face {
      font-family: 'MyCustomFont';
      src: url('MyCustomFont.woff2') format('woff2'),
           url('MyCustomFont.woff') format('woff');
      font-weight: normal;
      font-style: normal;
    }
    body {
      font-family: 'MyCustomFont', sans-serif;
    }
  </style>
</head>
<body>
  <p>This is a paragraph using the custom font introduced by @font-face.</p>
</body>
</html>

在上述代码中,首先通过 @font-face 规则定义了 MyCustomFont 字体,指定了字体文件的来源。然后在 body 选择器中,将 font-family 设置为 MyCustomFont,并指定了一个备用字体 sans-serif。这样,如果 MyCustomFont 字体加载失败,网页会使用系统默认的无衬线字体来显示文本。

1.4 @font-face 的优势

  • 高度自定义:开发者可以完全掌控字体的选择和使用。无论是独特的手写字体还是专业设计的品牌字体,只要符合版权规定,都能通过 @font-face 引入到网页中,从而实现独特的视觉设计。
  • 本地优先加载:通过 local() 函数,在用户系统中存在同名字体时优先加载本地字体。这不仅提高了加载速度,还能减少网络请求,对于带宽有限或者用户在离线状态下浏览网页有很大帮助。
  • 多格式支持@font-face 支持多种字体格式,能够兼容不同的浏览器和设备。通过提供多种格式的字体文件,可以确保在大多数情况下字体都能正确加载和显示。

1.5 @font-face 的劣势

  • 字体文件管理复杂:为了确保兼容性,需要准备多种字体格式,这增加了项目资源管理的复杂度。不同格式的字体文件需要占用额外的存储空间,并且在更新字体时,需要同时更新所有格式的文件。
  • 版权问题:使用自定义字体时,必须确保拥有合法的版权。获取字体版权可能涉及到购买字体许可证或者使用开源字体,但即使是开源字体,也需要遵守相应的开源协议,否则可能面临法律风险。
  • 加载性能挑战:如果字体文件较大,可能会影响网页的加载速度。特别是在移动设备上,较慢的网络连接可能导致字体加载延迟,出现文本闪烁(FOIT,Flash of Invisible Text)或者文本闪现(FOUT,Flash of Unstyled Text)等问题。

二、Google Fonts 字体引入方式

2.1 Google Fonts 基本概念

Google Fonts 是由 Google 提供的免费字体库,包含了大量经过精心挑选和设计的字体。这些字体可以直接在网页中使用,无需开发者手动下载和管理字体文件。Google Fonts 的目标是为网页开发者提供一种简单、高效的方式来为网页添加丰富多样的字体。

Google Fonts 基于 Web 字体技术,通过 CDN(内容分发网络)进行字体分发。这意味着全球各地的用户都可以从距离他们最近的服务器获取字体文件,从而提高加载速度。同时,Google Fonts 还提供了一些工具和 API,方便开发者在网页中集成字体。

2.2 Google Fonts 引入方式

Google Fonts 有两种主要的引入方式:通过 <link> 标签和通过 @import 规则。

通过 <link> 标签引入: 在 HTML 的 <head> 部分添加一个 <link> 标签,如下所示:

<head>
  <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap">
</head>

在上述代码中,href 属性指定了 Google Fonts 的 API 链接。family 参数指定了要使用的字体,这里是 Roboto 字体,并且通过 wght 参数指定了字体的粗细为 400(正常)和 700(加粗)。display=swap 参数控制字体的加载和显示行为,swap 值表示字体加载时先显示系统默认字体,字体加载完成后再替换为指定字体,以减少 FOIT 现象。

通过 @import 规则引入: 在 CSS 文件中使用 @import 规则,例如:

@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap');

这种方式与 <link> 标签类似,只是将引入字体的代码放在了 CSS 文件中。

2.3 Google Fonts 示例代码

以下是一个完整的示例,展示如何使用 Google Fonts 中的 Roboto 字体:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Google Fonts Example</title>
  <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap">
  <style>
    body {
      font-family: 'Roboto', sans-serif;
    }
  </style>
</head>
<body>
  <p>This is a paragraph using the Roboto font from Google Fonts.</p>
</body>
</html>

在这个示例中,通过 <link> 标签引入了 Roboto 字体,然后在 body 选择器中设置 font-familyRoboto,并指定了备用字体 sans-serif

2.4 Google Fonts 的优势

  • 简单易用:无需下载和管理字体文件,只需添加一个 <link> 标签或 @import 规则,即可在网页中使用字体。这大大简化了字体引入的流程,降低了开发者的工作量。
  • 丰富的字体库:Google Fonts 包含了大量不同风格和语言支持的字体,能够满足各种设计需求。无论是现代简约风格还是复古风格的网页,都能在 Google Fonts 中找到合适的字体。
  • CDN 加速:借助 Google 的全球 CDN 网络,字体文件能够快速分发到用户端。这提高了字体的加载速度,减少了网页的加载时间,提升了用户体验。
  • 免费且合法:Google Fonts 中的字体都是免费使用的,并且 Google 已经处理好了字体的版权问题,开发者无需担心版权纠纷。

2.5 Google Fonts 的劣势

  • 依赖外部服务:Google Fonts 依赖于 Google 的服务器,如果 Google 的服务器出现故障或者网络连接不稳定,可能会导致字体无法加载,影响网页的正常显示。
  • 定制性有限:虽然 Google Fonts 提供了丰富的字体选择,但对于一些非常特殊或者品牌特定的字体需求,可能无法满足。开发者不能像使用 @font-face 那样完全自由地引入任何字体。
  • 字体子集问题:Google Fonts 虽然支持字体子集的生成,但在某些情况下,可能无法满足开发者对字体子集的精确需求。例如,如果需要一个非常小的字体子集以减少文件大小,Google Fonts 的默认设置可能无法满足。

三、@font-face 与 Google Fonts 对比分析

3.1 字体选择灵活性

  • @font-face:具有极高的灵活性,开发者可以引入任何拥有合法版权的字体,无论是常见字体还是极为罕见的自定义字体。这对于追求独特品牌形象或者特殊设计风格的项目非常重要。例如,一个高端时尚品牌的官网可能需要使用独特的手写风格字体来展现品牌的个性,通过 @font-face 可以轻松实现。
  • Google Fonts:虽然提供了丰富的字体库,但仍然局限于 Google 所收录的字体。对于一些特定行业(如法律、金融等)可能需要使用专业的、未收录在 Google Fonts 中的字体,Google Fonts 就无法满足需求。

3.2 加载性能

  • @font-face:字体文件的加载性能取决于多个因素,包括字体文件大小、服务器性能以及用户网络状况等。如果字体文件较大且没有进行优化,可能会导致较长的加载时间。为了提高性能,开发者需要手动优化字体文件,如生成字体子集、选择合适的字体格式等。例如,对于一个包含大量中文内容的网页,使用 @font-face 引入中文字体时,如果不进行子集化处理,字体文件可能会非常大,影响加载速度。
  • Google Fonts:借助 Google 的 CDN 网络,通常能够提供较快的加载速度。Google 对字体文件进行了优化,并且会根据用户的地理位置选择最近的服务器进行分发。同时,通过合理设置 display 参数(如 display=swap),可以有效减少字体加载过程中的闪烁问题。然而,如果用户所在地区网络对 Google 服务存在限制,可能会导致字体加载缓慢甚至失败。

3.3 资源管理与维护

  • @font-face:开发者需要自行管理字体文件,包括下载、存储和更新。准备多种字体格式以确保兼容性增加了资源管理的复杂性。每次字体更新时,都需要更新所有格式的字体文件,并确保它们在服务器上的正确部署。例如,如果项目使用了多个自定义字体,并且每个字体都有多种格式,那么在更新字体时,需要仔细核对每个文件的更新情况,否则可能会出现兼容性问题。
  • Google Fonts:几乎无需开发者进行资源管理,Google 负责字体文件的存储、更新和分发。开发者只需要在网页中引用相应的字体链接即可。这大大减轻了开发者在资源管理方面的负担,使开发者能够更专注于网页的设计和功能开发。

3.4 版权与法律问题

  • @font-face:开发者必须自行确保所使用字体的版权合法性。获取字体版权可能需要购买字体许可证或者遵循开源字体的相关协议。如果在版权问题上处理不当,可能会面临法律风险。例如,未经授权使用商业字体可能会导致版权所有者的索赔。
  • Google Fonts:Google 已经处理好了字体的版权问题,所有 Google Fonts 中的字体都可以免费使用,开发者无需担心版权纠纷。这使得开发者在使用字体时更加放心,尤其适合对版权问题不太熟悉的开发者。

3.5 对网页设计的影响

  • @font-face:由于可以引入任何字体,能够实现非常独特和个性化的网页设计。开发者可以根据项目的品牌形象和设计理念,选择最合适的字体来营造特定的氛围。例如,一个艺术展览的官网可以通过 @font-face 引入具有艺术感的字体,增强网页的艺术氛围。
  • Google Fonts:虽然提供了丰富的字体选择,但因为是共享的字体库,可能会在一定程度上导致网页字体的同质化。在一些追求独特性的项目中,可能需要花费更多时间在 Google Fonts 中寻找与众不同的字体,或者结合其他方式来实现独特的设计。

四、实际应用场景选择建议

4.1 追求独特品牌形象的项目

对于追求独特品牌形象的项目,如品牌官网、高端设计工作室网站等,@font-face 可能是更好的选择。这些项目通常需要使用与品牌紧密相关的独特字体,以传达品牌的个性和价值观。虽然 @font-face 在字体文件管理和版权处理上需要更多的精力,但通过精心选择和引入自定义字体,能够打造出独一无二的视觉效果,提升品牌的辨识度。

4.2 快速开发与简洁项目

在快速开发的项目或者对字体要求不是特别独特的项目中,如小型企业官网、博客等,Google Fonts 是一个不错的选择。其简单易用的特点可以节省大量的开发时间,同时丰富的字体库足以满足大多数常见的设计需求。借助 Google 的 CDN 加速,还能确保字体的快速加载,提升用户体验。而且不用担心版权问题,让开发者能够更专注于项目的功能实现。

4.3 对性能要求极高的项目

如果项目对性能要求极高,如移动应用的 Web 界面、电商平台首页等,需要综合考虑两种方式。对于一些常用的、体积较小的字体,可以优先考虑 Google Fonts,利用其 CDN 加速和优化的加载策略。而对于一些特殊字体,如果无法在 Google Fonts 中找到合适的替代,在使用 @font-face 时,要对字体文件进行严格的优化,如生成字体子集、选择高效的字体格式等,以确保字体加载不会对性能产生较大影响。

4.4 特定行业或语言需求项目

对于特定行业(如法律、医学等)或者具有特殊语言需求(如少数民族语言、特殊符号字体等)的项目,如果 Google Fonts 无法满足需求,就只能使用 @font-face 引入符合要求的字体。例如,一些法律文件需要使用特定的法律字体来确保文本的规范性和严肃性,而这些字体可能只有通过 @font-face 从专业渠道获取并引入。

五、总结与展望

在前端开发中,@font-face 和 Google Fonts 各有优劣。@font-face 提供了极致的灵活性和自定义能力,但在资源管理和版权处理上需要更多的投入;Google Fonts 则以其简单易用、加载性能好和无版权之忧等特点,成为快速开发和一般性项目的首选。

随着技术的不断发展,字体引入和管理的方式可能会进一步优化。例如,未来可能会出现更智能的字体子集生成工具,无论是 @font-face 还是 Google Fonts 都能更精确地生成适合项目需求的字体子集,进一步减少文件大小,提高加载性能。同时,字体版权管理也可能会更加规范化和便捷化,让开发者在使用自定义字体时更加轻松。

在实际项目中,开发者应根据项目的具体需求、性能要求、资源管理能力以及对版权的重视程度等因素,综合选择合适的字体引入方式,以实现最佳的网页设计效果和用户体验。