如何使用 @font-face 和 font-display 在 CSS 中定义自定义字体

介绍

@font-face 是一个 CSS at-rule,用于定义自定义字体。通过 @font-face,您可以提供一个路径到与您的 CSS 文件托管在同一服务器上的字体文件。这个规则已经存在了相当长的时间,但是有一个更新的属性 font-display,它带来了新的加载选项。

在本教程中,我们将下载流行的开源字体 Roboto Mono,并使用 @font-face 在一个示例网页上加载该字体。为了创建最佳的用户体验,我们将使用 font-display 属性来自定义加载字体的方式和时间。

先决条件

  • 一个您喜欢的代码编辑器,比如 nano 或 Visual Studio Code
  • 一个网络浏览器
  • 对 HTML 基础知识的了解。您可以查看我们的教程系列《如何使用 HTML 构建网站》来进行介绍。

步骤 1 — 下载字体并构建网页

在我们开始探索 @font-face 规则之前,让我们先设置一个示例网页和目录。

从一个工作目录开始,为我们的网站创建一个新文件夹和一个用于存放字体文件的子目录:

mkdir -p ./website/fonts/

进入我们新项目的根目录 website

cd website

我们将从这里运行所有剩余的命令。

现在我们将使用 curl 命令来下载 Roboto Mono 字体。我们将使用一个名为 google-webfonts-helper 的流行应用程序,它允许我们在单个、整洁的 GET 请求中直接从 Google 的内容交付网络中下载多个字体。

让我们下载 Roboto Mono 的两种不同样式和粗细,即 regular700italic

curl -o ./fonts/fontfiles.zip "https://google-webfonts-helper.herokuapp.com/api/fonts/roboto-mono?download=zip&subsets=latin,latin-ext&variants=regular,700italic&formats=woff,woff2,ttf"

请注意我们正在指定我们从 Roboto Mono 字体系列中想要的 variants。然后我们为每个指定我们想要的 formats。我们请求 ttfwoffwoff2 格式。woff2 格式是最现代的网络字体格式,但是一些浏览器仍然缺乏对 woff2 的支持。因此,我们还提供了一个回退选项,即 woff 格式,它支持到 Internet Explorer 9,并且一个 TrueType 格式,或者 ttf。这将给我们出色的覆盖范围,但是当我们编写我们的 CSS 时,我们将使用标准字体提供更多的回退选项。font-display 属性也将帮助我们管理如何为不同的用户加载字体。

现在将下载的内容解压到我们的 ./fonts 文件夹中。在运行 Linux 和 macOS 的机器上,使用以下命令:

unzip ./fonts/fontfiles.zip -d ./fonts

检查 ./fonts 文件夹的内容:

ls ./fonts

现在我们找到了六个新文件—每个字体有一个 .ttf、一个 .woff 和一个 .woff2 文件。

字体下载完成后,让我们编写一些 CSS 并将其用于样式化 HTML 元素。

步骤 2 — 使用 @font-face 规则

在这一步中,我们将使用 @font-face 属性应用我们下载的字体。

使用 nano 或您喜欢的文本编辑器,创建并打开一个名为 style.css 的文件:

nano style.css

添加以下内容,这将定义带有我们文件路径的 @font-face 规则:


@font-face {font-family: 'Roboto Mono', monospace;src: url(fonts/roboto-mono-v12-latin-regular.woff2) format('woff2'),url(fonts/roboto-mono-v12-latin-regular.woff) format('woff'),url(fonts/roboto-mono-v12-latin-regular.ttf) format('truetype');
}@font-face {font-family: 'Roboto Mono', monospace;src: url(fonts/roboto-mono-v12-latin-700italic.woff2) format('woff2'),url(fonts/roboto-mono-v12-latin-700italic.woff) format('woff'),url(fonts/roboto-mono-v12-latin-700italic.ttf) format('truetype');font-weight: 700;font-style: italic;
}h1, p {font-family: 'Roboto Mono', monospace;
}h1 {font-family: 'Roboto Mono', monospace;font-weight: 700;font-style: italic;
}

让我们逐块地检查这段代码。

始终首先在主 CSS 文件中定义您的 @font-face at-rules。@font-face 规则的最基本版本需要 font-familysrc 属性。在我们的第一个块中,我们为 font-family 提供了 Roboto Mono 作为值,并为 src 提供了我们三个文件的路径,每个文件都有不同的格式,并按优先级降序排列。

在我们的第二个块中,我们提供了相同的 font-family 值,但是我们使用了我们的 Roboto Mono 的 700italic 版本的路径。然后我们定义了两个属性,font-weightfont-style。我们将使用这些属性来定义我们想要使用第二个版本的 Roboto Mono。

在我们接下来的两个块中,我们为 <h1><p> 元素定义了自定义样式。请注意我们如何使用 font-family 来同时定义两者,然后在特定于 <h1> 的块中添加了 font-weightfont-style。这将使我们的 H1 标题以 Roboto Mono 700italic 而不是 Roboto Mono regular 渲染。

保存并关闭文件。

现在让我们创建一个带有一些 <h1><p> 标签的小型 HTML 页面。

创建并打开一个名为 index.html 的新文件:

nano index.html

添加以下代码,这将定义一个标题和一行文本:


<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>CSS @font-face</title><link rel="stylesheet" href="style.css">
</head>
<body><h1> Roboto Mono 字体,700italic </h1><p> Roboto Mono 字体,regular </p>
</body>
</html>

保存并关闭文件。

在网络浏览器中加载 index.html。您将看到您的标题以 Roboto Mono 700italic 渲染,而您的段落文本以 Roboto Mono regular 渲染,就像这样:

Roboto Mono 字体,700 italic

Roboto Mono 字体,regular

通过我们的 @font-face 属性的工作,现在让我们使用 font-display 来配置字体的加载方式和时间。

第三步 — 使用 font-display 控制字体加载

通过使用 font-display,我们可以精确控制字体的加载方式。这可以极大地改善在使用自定义字体时的用户体验。

有时,在使用自定义字体时,用户在页面首次加载时可能会遇到 FOUT(无样式文本闪烁)或 FOIT(不可见文本闪烁)。一些浏览器选择立即显示文本,即使自定义字体尚未加载。浏览器在自定义字体完全加载后会切换到该字体,但这会导致 FOUT。其他浏览器会在短暂时间内隐藏文本,直到自定义字体加载完成,这会导致 FOIT。如果在这段时间内字体未加载,浏览器将使用备用字体。

解决 FOUT 的一种方法是使用类似 Font Style Matcher 的工具,找到一个尽可能接近自定义字体的备用字体,以减轻字体更改的突然感。然而,我们可以使用 font-display 属性更优雅地处理这些问题。

为了解决加载问题,font-display 可以取以下 5 个值:

  • auto: 使用浏览器的默认行为,具体行为会有所不同。
  • block: 文本首先会在短暂时间内隐藏,但在自定义字体可用时会切换到该字体。这个值被认为有一个无限的 swap 期。
  • swap: 文本从不会被隐藏,并在自定义字体可用时切换到该字体。这也提供了一个无限的切换期。
  • fallback: 文本在一个非常短的时间内被隐藏(块期),然后有一个短暂的切换期。如果自定义字体在切换期内未加载,则不会加载。
  • optional: 文本被给予一个非常短暂的块期来加载(~100ms)。如果字体在该块期内未加载,则使用备用字体,自定义字体则不会加载。然而,字体仍会在后台下载并缓存。这意味着在后续页面加载时,自定义字体将在缓存中可用,然后会立即加载。

font-displayoptional 值为许多字体加载情况提供了一个强大的解决方案。让我们将其添加到我们自己的 CSS 中。

重新打开 style.css:

nano style.css

现在添加下面的代码:

@font-face {font-family: 'Roboto Mono', monospace;src: url(fonts/roboto-mono-v12-latin-regular.woff2) format('woff2'),url(fonts/roboto-mono-v12-latin-regular.woff) format('woff'),url(fonts/roboto-mono-v12-latin-regular.ttf) format('truetype');font-display: optional;
}@font-face {font-family: 'Roboto Mono', monospace;src: url(fonts/roboto-mono-v12-latin-700italic.woff2) format('woff2'),url(fonts/roboto-mono-v12-latin-700italic.woff) format('woff'),url(fonts/roboto-mono-v12-latin-700italic.ttf) format('truetype');font-weight: 700;font-style: italic;font-display: optional;
}h1, p {font-family: 'Roboto Mono', monospace;
}h1 {font-family: 'Roboto Mono', monospace;font-weight: 700;font-style: italic;
}

现在我们的自定义字体要么加载得如此迅速以至于用户永远不会经历 FOUT 或 FOIT,要么根本不加载。然而,它仍会在刷新或访问更多页面时立即下载和加载。

结论

在本教程中,我们下载了一个自定义字体,并使用 @font-face 属性将其添加到网页中。然后,我们使用 font-display 属性来管理自定义字体的加载方式,如果有的话。要了解更多关于 font-display 和相关属性的信息,请考虑查阅 Mozilla 开发者网络上的相关文档。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/729254.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32CubeMX学习笔记17--- FSMC

1.1 TFTLCD简介 TFT-LCD&#xff08;thin film transistor-liquid crystal display&#xff09;即薄膜晶体管液晶显示器。液晶显示屏的每一个像素上都设置有一个薄膜晶体管&#xff08;TFT&#xff09;&#xff0c;每个像素都可以通过点脉冲直接控制&#xff0c;因而每个节点都…

论文阅读:Scalable Diffusion Models with Transformers

Scalable Diffusion Models with Transformers 论文链接 介绍 传统的扩散模型基于一个U-Net骨架&#xff0c;这篇文章提出了一种新的扩散模型结构&#xff0c;将U-Net替换为一个transformer&#xff0c;并将这种结构称为Diffusion Transformers (DiTs)。他们还发现&#xff…

python77-Python的函数参数,个数可变参数

很多编程语言都允许定义个数可变的参数,这样可以在调用函数时传入任意多个参数。Python当然也不例外,Python 允许在形参前面添加一个星号(*),这样就意味着该参数可接收多个参数值,多个参数值被当成元组传入。下面程序定义了一个形参个数可变的函数。 # !/usr/bin/env pyth…

数据分析 - 面经 - 联蔚数科

2024.1.9 面试 Boss直聘沟通 先简单做下自我介绍吧 你项目中设计的技术选型&#xff0c;你都有使用过是吗&#xff1f; 这个项目的团队规模介绍一下 在数据部分&#xff0c;详细讲一下主要工作&#xff0c;在数据采集&#xff0c;处理等方面 这些工具是学校教的呢&#x…

阿里云服务器使用教程_2024建站教程_10分钟网站搭建流程

使用阿里云服务器快速搭建网站教程&#xff0c;先为云服务器安装宝塔面板&#xff0c;然后在宝塔面板上新建站点&#xff0c;阿里云服务器网aliyunfuwuqi.com以搭建WordPress网站博客为例&#xff0c;来详细说下从阿里云服务器CPU内存配置选择、Web环境、域名解析到网站上线全流…

requests模块的其他方法

requests模块的其他方法 学习目标 掌握requests中cookirJar的处理方法掌握requests解决https证书错误的问题掌握requests中超时参数的使用掌握retrying模块的使用 1 requests中cookirJar的处理方法 使用request获取的resposne对象&#xff0c;具有cookies属性&#xff0c;能够…

Vscode连接远程服务器失败解决方案

一、 could not establish connection to “XXX” 尝试使用Remote-SSH插件连接远程的服务器&#xff0c;但是配置显示出错&#xff0c;端口显示试图写入的管道不存在&#xff0c;弹出窗口显示could not establish connection to “XXX” 二、检查Windows的OpenSSH 1.检索是否…

Java中注解@RequestParam 和 @ApiParam详解

一、RequestParam 和 ApiParam的常用属性 RequestParam 和 ApiParam 是在 Spring MVC 控制器方法中使用的注解&#xff0c;它们分别服务于不同的目的&#xff1a; RequestParam RequestParam 是 Spring MVC 中用来处理 HTTP 请求参数的注解&#xff0c;主要用于绑定请求中的查…

数据分析项目[开发中]

学习进度记录&#xff1a; 12.7&#xff1a; 教程链接&#xff1a;智能 BI 项目教程(一) (yuque.com) 前端&#xff1a; Ant Design Pro&#xff1a;开始使用 - Ant Design Pro​​​​​​ 然后安装依赖 yarn install 去除不需要的&#xff1a; 移除国际化 【报错】 …

【数据结构与算法】二分查找题解(二)

这里写目录标题 一、81. 搜索旋转排序数组 II二、167. 两数之和 II - 输入有序数组三、441. 排列硬币四、374. 猜数字大小五、367. 有效的完全平方数六、69. x 的平方根 一、81. 搜索旋转排序数组 II 中等 已知存在一个按非降序排列的整数数组 nums &#xff0c;数组中的值不必…

Linux运维_Bash脚本_构建安装ReadLine-6.2.4(setup.py)

Linux运维_Bash脚本_构建安装ReadLine-6.2.4(setup.py) Bash (Bourne Again Shell) 是一个解释器&#xff0c;负责处理 Unix 系统命令行上的命令。它是由 Brian Fox 编写的免费软件&#xff0c;并于 1989 年发布的免费软件&#xff0c;作为 Sh (Bourne Shell) 的替代品。 您可…

【Linux】iftop命令详解

目录 一、iftop简介 二、安装iftop命令 2.1 命令查看测试环境系统信息 2.2 查看iftop版本与命令帮助 三、iftop的基本使用 3.1 直接使用iftop命令 3.2 iftop的显示说明 3.3 指定监控某块网卡 3.4 显示某个网段进出封包流量 3.5 按照流量排序 3.6 过滤显示连接 3.7 …

米酒生产加工污水处理需要哪些工艺设备

米酒生产加工过程中产生的污水是一项重要的环境问题&#xff0c;需要采用适当的工艺设备进行处理。下面将介绍一些常用的污水处理工艺设备。 首先&#xff0c;生产过程中的污水需要进行初级处理&#xff0c;常见的设备包括格栅和砂池。格栅用于去除污水中的大颗粒杂质&#xff…

穿越程序员的迷宫:前端花园、后端洞穴与数据科学的密室

穿越程序员的迷宫&#xff1a;前端花园、后端洞穴与数据科学的密室 当你步入程序员的职业赛道&#xff0c;就像踏入一座错综复杂的迷宫。这座迷宫中&#xff0c;有前端的美丽花园&#xff0c;后端的黑暗洞穴&#xff0c;还有数据科学的神秘密室。每一个转角都可能藏着新的机遇…

金相显微镜(金相镜)主要用于材料金相分析 我国市场集中度较低

金相显微镜&#xff08;金相镜&#xff09;主要用于材料金相分析 我国市场集中度较低 金相显微镜又称为金相镜&#xff0c;是指通过光学放大&#xff0c;对材料显微组织、低倍组织和断口组织等进行分析研究和表征的光学显微镜。金相显微镜通常由目镜、物镜、照明系统、旋转台等…

Unity 和 UE 的 .gitignore 文件

各种.gitignore版本 点击跳转 Unity .gitignore 模版 # This .gitignore file should be placed at the root of your Unity project directory # # Get latest from https://github.com/github/gitignore/blob/main/Unity.gitignore # /[Ll]ibrary/ /[Tt]emp/ /[Oo]bj/ /[Bb…

视频监控平台EasyCVR+4G/5G应急布控球远程视频监控方案

随着科技的不断发展&#xff0c;应急布控球远程视频监控方案在公共安全、交通管理、城市管理等领域的应用越来越广泛。这种方案通过在现场部署应急布控球&#xff0c;实现对特定区域的实时监控&#xff0c;有助于及时发现问题、快速响应&#xff0c;提高管理效率。 智慧安防视…

idea步过,步入,步出,详解

在软件开发中&#xff0c;"Idea"通常指的是JetBrains公司开发的一款集成开发环境&#xff08;IDE&#xff09;&#xff0c;用于编写、调试和运行各种编程语言的应用程序。下面是对"Idea"中的步过、步入和步出的详细解释&#xff1a; 步过&#xff08;Step …

MySQL如何使用EXPLAIN优化SQL:输出内容参考手册

MySQL如何使用EXPLAIN优化SQL&#xff1a;输出内容参考手册 这篇文章差不多是MySQL官网的翻译版本&#xff0c;有任何不清楚的&#xff0c;或者翻译不到位的地方&#xff0c;都可以直接去官网查询原文档。 MySQL 8.0 Reference Manual - EXPLAIN Output Format EXPLAIN语句提…

为什么不推荐使用外键

定义外键之后&#xff0c;数据库的每次操作都需要去检查外键约束。对于插入来说&#xff0c;影响了插入速度&#xff1b;对于更新来说&#xff0c;级联更新是强阻塞&#xff0c;存在数据库更新风暴&#xff08;Database Update Storm&#xff09;的风险。 所谓 Database Updat…