WHAT - 前端开发中的字体

一、介绍

字体在前端开发中扮演着重要的角色,它不仅影响到网页的可读性和美观,还关系到用户的整体体验。下面详细介绍字体在前端项目中的应用,包括字体的提供方式、兼容性考虑、常见的字体引入方式及使用实践。

字体的提供方式

  1. 字体类型

    • Web 字体:通过网络加载的字体。通常从字体服务提供商(如 Google Fonts、Adobe Fonts)加载。
    • 本地字体:用户设备上已经安装的字体。这些字体在用户设备上可用,但无法确保所有用户都有相同的字体。
    • 嵌入字体:直接嵌入在网页或应用中,通常是字体文件(如 .woff, .woff2, .ttf, .eot)。
  2. 字体文件格式

    • TrueType Font (TTF):较早的字体格式,支持各种操作系统和设备。
    • Web Open Font Format (WOFF/WOFF2):专为网页优化的字体格式,支持更高的压缩率和更快的加载速度。
    • Embedded OpenType (EOT):主要用于旧版 Internet Explorer。
    • Scalable Vector Graphics (SVG):用于图像字体,如图标字体。HOW - 图形格式SVG及其应用(图标库&字体)

字体兼容性和支持

  1. 字体包

    • 确保字体兼容:不同的设备和浏览器可能对不同的字体格式支持不一致。通常推荐使用 WOFF2 作为首选格式,因为它在现代浏览器中得到广泛支持,并提供了较好的压缩率。
    • 字体回退:定义一系列字体备选方案,以确保在首选字体不可用时,浏览器能够使用合适的替代字体。
  2. 兼容性考虑

    • 设备和操作系统:用户设备上安装的字体可能有所不同,因此需要考虑字体的回退策略。
    • 字体格式:确保提供的字体格式兼容大多数浏览器和设备。例如,使用 WOFF2、WOFF、TTF 和 EOT 格式来覆盖不同的需求。
    • CSS font-family 属性:定义字体的回退链,确保在首选字体无法加载时,有备选字体提供。

常见的字体引入方式

  1. 使用 Web 字体服务

    • Google Fonts
      <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap">
      
      在 CSS 中使用:
      body {
        font-family: 'Roboto', sans-serif;
      }
      
    • Adobe Fonts (Typekit)
      在 Adobe Fonts 控制台中生成的 <link> 标签或 JavaScript 代码:
      <link rel="stylesheet" href="https://use.typekit.net/xxxxxxx.css">
      
      在 CSS 中使用:
      body {
        font-family: 'MyAdobeFont', sans-serif;
      }
      
  2. 直接引入本地字体

    • 在项目中添加字体文件
      将字体文件放在项目的 public/fonts 文件夹中。
      @font-face {
        font-family: 'MyLocalFont';
        src: url('/fonts/MyLocalFont.woff2') format('woff2'),
             url('/fonts/MyLocalFont.woff') format('woff');
        font-weight: normal;
        font-style: normal;
      }
      
      body {
        font-family: 'MyLocalFont', sans-serif;
      }
      
  3. 通过 CSS @import 引入

    @import url('https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;600&display=swap');
    
    body {
      font-family: 'Open Sans', sans-serif;
    }
    

使用实践

  1. 选择合适的字体

    • 可读性:选择易于阅读的字体,如 Google Fonts 中的 Roboto、Open Sans。
    • 品牌一致性:使用与品牌形象一致的字体,例如公司定制的品牌字体。
    • Web友好性:优先使用 Web 字体(如 WOFF2),确保良好的浏览器支持和加载性能。
  2. 优化字体加载

    • 使用 Font Display:控制字体的加载策略,例如 font-display: swap,以避免 FOUT(Flash of Unstyled Text)。
      @font-face {
        font-family: 'MyOptimizedFont';
        src: url('/fonts/MyOptimizedFont.woff2') format('woff2');
        font-display: swap;
      }
      
    • 预加载关键字体:使用 <link rel="preload"> 标签预加载重要的字体。
      <link rel="preload" href="/fonts/MyOptimizedFont.woff2" as="font" type="font/woff2" crossorigin="anonymous">
      
  3. 字体回退策略

    • 定义回退链:提供一系列字体备选方案,确保在主要字体不可用时有替代选择。
      body {
        font-family: 'MyCustomFont', Arial, sans-serif;
      }
      

总结

字体在前端开发中不仅影响视觉效果,还直接影响用户体验。通过合适的字体选择、优化和引入方式,你可以确保网页在不同设备和浏览器上以最佳方式显示文本。结合现代技术,如 Web 字体服务和优化策略,可以显著提升字体加载性能和用户体验。

二、常见问题

1. FOUT(Flash of Unstyled Text)?

FOUT(Flash of Unstyled Text) 是一种网页渲染中的视觉问题,它指的是在字体或样式加载完成之前,浏览器显示了一个未经样式化的文本“闪烁”现象。

简而言之,就是在页面加载时,用户会看到一段短暂的、使用默认或系统字体显示的文本,直到自定义字体加载完成并应用到文本上为止。

FOUT(Flash of Unstyled Text)是什么

  • 定义:FOUT 是指用户在访问网页时,看到一段未应用样式的文本(通常是系统字体)在自定义字体加载完成后才被替换成自定义字体的现象。这种现象通常发生在网页初次加载或字体尚未完全下载时。
  • 影响:FOUT 可能会影响网页的用户体验,因为它使得文本在加载过程中看起来与最终样式不一致,可能会让页面显得不专业或混乱。

如何解决 FOUT

为了解决或减轻 FOUT 的问题,可以使用以下几种方法:

1. 使用 font-display CSS 属性

font-display 属性允许你控制字体加载时的显示行为,从而减少 FOUT 的影响。

常用的值包括:

  • swap

    • 描述:文本会使用备用字体(如系统字体)直到自定义字体加载完成。自定义字体加载后,备用字体会被替换。
    • 示例
      @font-face {
        font-family: 'MyCustomFont';
        src: url('/fonts/MyCustomFont.woff2') format('woff2');
        font-display: swap;
      }
      
  • fallback

    • 描述:与 swap 类似,但在字体加载时间较长时可能会保持备用字体的显示。
    • 示例
      @font-face {
        font-family: 'MyCustomFont';
        src: url('/fonts/MyCustomFont.woff2') format('woff2');
        font-display: fallback;
      }
      
  • optional

    • 描述:字体可能不会加载。如果加载时间较长,浏览器会继续使用备用字体。
    • 示例
      @font-face {
        font-family: 'MyCustomFont';
        src: url('/fonts/MyCustomFont.woff2') format('woff2');
        font-display: optional;
      }
      
  • block

    • 描述:在字体加载期间,文本会被隐藏。只有当自定义字体加载完成后,文本才会显示。这种方法可能会导致更长时间的空白区域,但可以避免 FOUT。
    • 示例
      @font-face {
        font-family: 'MyCustomFont';
        src: url('/fonts/MyCustomFont.woff2') format('woff2');
        font-display: block;
      }
      
2. 使用字体预加载

通过预加载关键字体可以减少 FOUT。预加载可以确保字体在页面渲染前就被下载:

  • HTML 示例
    <link rel="preload" href="/fonts/MyCustomFont.woff2" as="font" type="font/woff2" crossorigin="anonymous">
    
3. 在 JavaScript 中控制字体加载

你可以使用 JavaScript 来更精细地控制字体的加载和显示,减少 FOUT。例如,可以在页面加载后使用 JavaScript 动态插入自定义字体。

4. 自定义字体样式的延迟加载

你可以在字体加载完成之前,使用系统字体作为占位符,并通过 JavaScript 或 CSS 类在字体加载后动态应用自定义样式。

总结

解决 FOUT 问题的主要目的是减少文本在自定义字体加载期间的闪烁效果,使页面在加载过程中看起来更加一致和专业。通过合理使用 font-display 属性、预加载字体以及控制字体的加载行为,可以有效地减轻 FOUT 的影响。

2. 为什么字体是用style的形式加载?

字体通常使用 CSS 的 @font-face 规则通过 <style> 标签或外部样式表加载。这种方式有几个重要的原因,涉及到灵活性、性能和标准化等方面。以下是详细的解释:

1. 统一和标准化

  • 标准化:CSS 提供的 @font-face 规则是一个标准化的方式来定义和使用自定义字体。它允许开发者通过统一的语法在网页上加载和使用字体,确保在不同浏览器和环境中的一致性。

  • 灵活性:通过 CSS,开发者可以在不同的页面和组件中灵活地应用和管理字体。这种方法使得字体的管理更为集中和一致,不需要在 HTML 中重复添加字体链接。

2. 动态和条件加载

  • 动态加载:通过 CSS 的 @font-face 规则,字体可以在加载时根据条件进行动态控制。例如,可以使用 font-display 属性来设置字体加载策略(如 swapfallback),以优化用户体验。

  • 条件样式:CSS 可以根据不同的状态或媒体查询来应用不同的字体样式。这使得字体的加载和使用能够更好地适应不同的设备和屏幕尺寸。

3. 性能优化

  • 字体文件优化:CSS 允许你通过 @font-face 规则指定不同的字体格式(如 WOFF2、WOFF、TTF),并提供相关的优化策略。浏览器可以根据这些设置选择最合适的字体格式,从而提高性能。

  • 懒加载和延迟加载:可以通过 CSS 结合 JavaScript 来实现字体的懒加载和延迟加载,进一步优化页面性能。例如,使用 font-display 属性来控制字体的加载策略,以减少 FOUT(Flash of Unstyled Text)。

4. 样式管理

  • 集中管理:将字体定义放在 CSS 样式表中,可以更方便地管理和维护样式。CSS 样式表可以集中定义字体的各种属性,如字体系列、权重、样式等,使得管理和更新字体变得更容易。

  • 继承和覆盖:CSS 允许继承和覆盖样式,使得字体的应用更加灵活。例如,可以定义全局字体,然后在特定的组件或页面上覆盖这些字体样式。

5. 示例

<style> 标签中定义字体

<style>
  @font-face {
    font-family: 'MyCustomFont';
    src: url('/fonts/MyCustomFont.woff2') format('woff2'),
         url('/fonts/MyCustomFont.woff') format('woff');
    font-weight: normal;
    font-style: normal;
    font-display: swap; /* 控制字体加载策略 */
  }

  body {
    font-family: 'MyCustomFont', sans-serif;
  }
</style>

通过外部样式表定义字体

/* styles.css */
@font-face {
  font-family: 'MyCustomFont';
  src: url('/fonts/MyCustomFont.woff2') format('woff2'),
       url('/fonts/MyCustomFont.woff') format('woff');
  font-weight: normal;
  font-style: normal;
  font-display: swap; /* 控制字体加载策略 */
}

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

在 HTML 文件中引用:

<link rel="stylesheet" href="styles.css">

总结

将字体通过 CSS 的 @font-face 规则加载是一个标准化和高效的做法,它提供了灵活性和性能优化的可能性。使用 CSS 方式可以集中管理字体样式,确保字体的加载和使用符合现代 Web 开发的最佳实践。同时,这种方式允许开发者控制字体的加载策略,优化用户体验。

三、更多实践

在如下文章中我们介绍过字体在前端项目中的应用:

  1. HOW - next/font 字体加载优化
  2. HOW - 图形格式SVG及其应用(图标库&字体)
  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值