【CSS in Depth 2 精译_075】12.2 Web 字体简介 + 12.3 谷歌字体的用法

当前内容所在位置(可进入专栏查看其他译好的章节内容)

  • 第四部分 视觉增强技术 ✔️
  • 【第 12 章 CSS 排版与间距】 ✔️
    • 12.1 间距设置
      • 12.1.1 使用 em 还是 px
      • 12.1.2 对行高的深入思考
      • 12.1.3 行内元素的间距设置
    • 12.2 Web 字体 ✔️
    • 12.3 谷歌字体 ✔️
    • 12.4 @font-face 的工作原理

文章目录

    • [12.2 Web 字体 Web fonts](#12.2 Web 字体 Web fonts)
    • [12.3 谷歌字体 Google fonts](#12.3 谷歌字体 Google fonts)

《CSS in Depth》新版封面

译者按

结束了设计稿的间距样式微调,从本篇开始再来了解一下 CSS 排版方面的知识。首先就是本篇介绍的 Web 字体,尤其是像谷歌字体这样的线上 Web 字体的引用。时隔六年,作者对相关内容进行了全面更新,对其中个别段落还补充了必要的截图,方便各位了解 Web 字体的相关操作。一起来先睹为快吧!

12.2 Web 字体 Web fonts

接下来,我们将通过添加自定义字体来让页面效果再上一个新台阶。迄今为止,我都没在示例页面的设计稿中囊括这些内容,但设计师几乎肯定会在其设计作品中指定网页字体。

页面设计可谓成也字体,败也字体。多年来,Web 开发者只能从很有限的字体库中做选择,即所谓的 Web 安全字体(web-safe fonts 。这些字体类型(font families)包括 ArialHelveticaGeorgia 等,且绝大多数用户的操作系统都会安装。早期的浏览器只能使用这些系统字体来渲染页面,因此也不得不使用它们来进行网页开发。即便偶尔也可能指定某个非系统字体,比如 Helvetica Neue,但也只有那些碰巧安装了这款字体的用户才能正确渲染,而其他用户只能看到更通用的字体回退方案。

随着 Web 字体的兴起,情况改变了。Web 字体可以通过 @font-face 规则来告诉浏览器去哪儿检索并下载页面所需的自定义字体。使用自定义字体后,原本平淡无奇的页面也可以大有改观,仿佛开启了一个全新的世界,让人们有了更多选择与想象的空间。

不同的页面字体会带来不同的观感体验,或灵动活泼、或有板有眼;或沉稳可信、或不拘一格。如图 12.9 所示,对同一段文字分别使用了三组不同的字体。在左上角的示例中,标题用的是 News Cycle 字体,而正文则用的是 EB Garamond;这样看起来比较正式,一般出现在新闻报纸类网站中。而右上角的案例则分别使用了 ForumOpen Sans 字体,视觉效果就没那么正式,可用于个人博客或者小型技术公司。最后左下方的案例用到的字体分别是 AntonPangolin,显得比较活泼,甚至略带卡通风格,适用于儿童类网站。以上三个案例,仅仅只是变更了一下字体,别的什么都没做,就可以营造出截然不同的页面氛围。

【图 12.9 不同的字体会显著影响网站的整体观感】

通过在线服务来使用 Web 字体是最简单、可能也是最普遍的方式。常见的有 谷歌字体Google Fonts,详见:https://fonts.google.com/)与 Adobe 字体Adobe Fonts,详见:https://fonts.adobe.com/)。

无论收费还是免费,这些服务都可以解决很多问题,包括技术上(如托管服务)和法律上(如授权许可)的一些问题。它们都提供了大量可供选择的字体库;但偶尔也遇到某个特殊字体仅对付费用户开放,并且还得自行处理托管事宜。

由于谷歌字体提供了很多高质量且开源的字体(而且是免费的),接下来我将带您了解利用这项服务将 Web 字体添加到页面的具体方法。因为谷歌做了大量的工作,所以添加字体非常简单。然后我们将深入研究它的底层运行逻辑,看看它究竟是怎么工作的、又是如何托管自己的字体的。

本章将沿用之前构建的示例页,并通过 Web 字体来完善页面设计。完成后的页面渲染效果如图 12.10 所示。图中大部分内容用的是 Roboto 字体,它也是整个页面主要的正文字体;而标题使用的是 Sansita 字体。

【图 12.10 启用了 Sansita 和 Roboto 这两款 Web 字体的页面局部效果】

让标题和正文分别使用两种不同的字体是很常见的做法。通常情况下,其中一种字体是 衬线(serif)字体 ,而另一种则为 无衬线(sans serif)字体。但本例中的两种字体都是无衬线类型。此外还可能见到有的设计标题和正文用的是相同的字体,但字体粗细各不相同的情况。

定义

衬线(serif 是某字符笔画末端的小线条或者"爪状"修饰效果。包含衬线的字体就被称为 衬线字体(serif typeface) (例如 Times New Roman);而没有衬线效果的字体则被称为 无衬线字体(sans serif typeface (例如 Helvetica)。

12.3 谷歌字体 Google fonts

访问谷歌字体网站 https://fonts.google.com/,就可以看到谷歌字体中当前可用的字体目录。该网站通过网格板块的方式来展示这些字体(如图 12.11 所示)。您可以直接从页面上选择字体,或者通过页面顶部的搜索栏或左侧的筛选工具来检索特定字体。

【图 12.11 谷歌字体的字体选择界面】

单击其中某个字体将显示更多详情信息,包括可用的字体粗细(细体、常规、粗体)及字体样式(常规或斜体)的列表。在屏幕的右上角有个获取该字体("Get font" 字样)的按钮。点击该按钮会将其添加到已选字体中,并可通过点击右上角的小购物袋图标来预览选中的字体。

如果知道需要什么样的字体,就可以通过字体名称来快速检索。在搜索栏中输入 Sansita 后,就会从主视图中筛选掉其他无关字体。点击 Sansita 字体进入详情页,然后点击获取字体按钮(即 "Get font" 字样的按钮)将其添加到已选字体中。这样相当于添加了该字体的所有粗细和样式,稍后再做进一步细化。

然后返回谷歌字体首页(点击顶部的 Google Fonts 图标)。在搜索框输入 Roboto,Google 会找出好几种相关字体,其中包括 RobotoRoboto CondensedRoboto Slab 等。点击 Roboto 字体并将其添加到已选字体中。

【译注】

感觉这里有必要补充一个截图,以免过于抽象:

【补图1:进入某字体详情页后,点击右上角的按钮可将当前字体列入已选字体中】

再点击上图右上角的购物袋图标,即可看到当前已选中的所有字体:

【补图2:点击右上角的购物袋图标,可以查看当前已选中的所有谷歌字体】

这样一来,页面就会显示 "2 font families selected" 字样(即 "已选中两个字体类型")。页面右侧有两个按钮,按钮 "Get Embed Code"(获取嵌入式代码)负责提供嵌入这些字体所需的 CSS(如图 12.12 所示);而按钮 "Download all"(即 "全部下载")则可以将所选字体下载到本地。我们先点击第一个按钮。

【图 12.12 左侧为当前选中的字体列表,右侧则显示对应的嵌入式代码】

到现在为止,您已经熟悉了常规和粗体字的粗细设置,但某些字体还支持多种不同的粗细尺寸。例如,Roboto 字体共有六种不同的粗细,范围从细体(thin)到特粗体(black)不等,同时每一种粗细还有对应的斜体字格式。请注意,除了使用细体(thin)、常规(regular)、粗体(bold)、黑体(black)外,字体粗细(weights)还可以用数值来表示,例如 100、400、700 和 900 等等。

说明

字型(typeface字体(font 这两个术语经常被混为一谈。字型 是指字体的整个家族(例如 Roboto),通常由同一位设计师创建;一种字型可能会存在多种样式变体或粗细形式(例如细体(light)、粗体(bold)、斜体(italic)、压缩(condensed)等等)。这些变体的每一个都可以称之为一种 字体(font

理想情况下,您可以选择字体所有的变体形式来为您的页面设计提供丰富的选择。然而,要添加的字体越多,意味着浏览器要同步下载的内容也会增多,从而让 Web 字体成为仅次于图片的、拖慢页面加载速度的几个罪魁祸首之一。为此,一种名为 可变字体(variable fonts 的全新技术应运而生,可以在一个更轻量的文件中实现多个变体形式的嵌入,本章稍后会为您演示其用法;但要是该方案并不具备实施条件,就应该更加慎重,只选取真正需要的字体。

一开始,字体的所有粗细版本都会被选中。在每个选中的字体下方,点击 "Change styles" 按钮(即 "变更样式"),并取消选中除了 Roboto 中的 Light 300、以及 Sansita 中的 ExtraBold 800 以外的所有粗细样式。剩下的这两个才是页面需要的字体粗细。通常还需要准备正文主体文字的斜体字版本,但在本例中无需考虑。

然后根据代码清单 12.6 所示的样式,将 <link> 标签复制到示例页的 <head> 元素中。这样就把包含字体描述的样式表添加到了示例页。此时页面会有两个样式表:一个是您自己的,而另一个则是字体的专属样式表。

此外,代码中还包含两个设置了 preconnect 预连接的 <link> 元素。它们是给浏览器的提示信息,用于告诉浏览器 Web 字体需要加载来自如下 Google 域名的资源,以便在解析 HTML 时预先进行连接,从而让样式表在后续解析到它们时,进一步提升字体的加载速度。

代码清单 12.6 引入谷歌字体样式的 <link> 标签写法

html 复制代码
<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=Roboto:wght@300&family=Sansita:wght@800&display=swap"
  rel="stylesheet"
/>

有了这个样式表,Web 字体的设置就能完全交给 Google 打理了。设置完成后就能在样式中使用这些字体了。将上述代码添加到本地页面,将得到如图 12.13 所示的页面效果:

【图 12.13 使用了 Roboto 字体及 Sansita 字体后的页面效果】

要让相应的字体生效,需要通过 font-family 属性来指定 Roboto 字体或 Sansita 字体。为此,得再更新一下 CSS。先在 <body> 标签中指定正文字体 Roboto,这样整个网页都将继承该字体;然后将各级标题的字体、以及首页连接元素 home-link 的字体均设置为 Sansita。最后根据下列样式代码更新示例页面即可(要改动的位置已用注释说明)。

代码清单 12.7 使用 Web 字体的示例样式代码

css 复制代码
@layer global {
  body {
    margin: 0;
    font-family: Roboto, sans-serif; /* 对页面全局应用 Roboto 字体 */
    line-height: 1.4;
    background-color: var(--extra-light-gray);
  }

  h1, h2, h3, h4 {
    font-family: Sansita, serif; /* 各级标题设为 Sansita 字体 */
  }
}

/* ... */

@layer modules {
  .home-link {
    color: var(--text-color);
    font-size: 1.6rem;
    font-family: Sansita, serif; /* 左上角的首页链接设为 Sansita 字体 */
    font-weight: bold;
    text-decoration: none;
  }
}

由于页面添加了谷歌字体样式表,浏览器就能正确解析这些字体设置并将其关联到已下载的 Web 字体上,最终让对应字体生效。如果使用其他的 Web 字体服务(例如 Adobe 字体),那么整个过程也是大同小异。这些服务要么提供所需 CSS 样式的 URL 地址,要么提供能为页面添加 CSS 样式的 JavaScript 代码片段。

接下来我们将对字体间距进行微调,并分享几个关于性能加载方面的考量因素。在这之前,先来看看谷歌字体都为我们做了哪些工作。



关于《CSS in Depth》(中译本书名《深入解析 CSS》)

第 1 版 第 2 版
读者评分 原版:4.7 (亚马逊);中文版:9.3(豆瓣) 原版:5.0(亚马逊);中文版:暂无,待出版
出版时间 原版:2018 年 3 月 ;中文版:2020 年 4 月 原版:2024 年 7 月;中文版:暂无,待出版
原价 原版:$44.99 ;中文版:¥139.00 原版:$59.99;中文版:暂无,待出版
现价 原版:$36.49 ;中文版:¥52.54 起步 原版:$52.09;中文版:暂无,待出版
原版国内预订 起步价 ¥461.00 起步价 ¥750.00

本专栏为该书第 2 版高分译文专栏,全网首发,精译精校,持续更新,计划今年内完成全书翻译,敬请期待!!!

目前已完结的章节(可进入本专栏查看详情,连载期间完全免费):

  • 第一章 层叠、优先级与继承(已完结)
    • 1.1 层叠
    • 1.2 继承
    • 1.3 特殊值
    • 1.4 简写属性
    • 1.5 CSS 渐进式增强技术
    • 1.6 本章小结
  • 第二章 相对单位(已完结)
    • 2.1 相对单位的威力
    • 2.2 em 与 rem
    • 2.3 告别像素思维
    • 2.4 视口的相对单位
    • 2.5 无单位的数值与行高
    • 2.6 自定义属性
    • 2.7 本章小结
  • 第三章 文档流与盒模型(已完结)
    • 3.1 常规文档流
    • 3.2 盒模型
    • 3.3 元素的高度
    • 3.4 负的外边距
    • 3.5 外边距折叠
    • 3.6 容器内的元素间距问题
    • 3.7 本章小结
  • 第四章 Flexbox 布局(已完结)
    • 4.1 Flexbox 布局原理
    • 4.2 弹性子元素的大小
    • 4.3 弹性布局的方向
    • 4.4 对齐、间距等细节处
    • 4.5 本章小结
  • 第五章 网格布局(已完结)
    • 5.1 构建基础网格
    • 5.2 网格结构剖析 (上)
      • 5.2.1 网格线的编号(下)
      • 5.2.2 网格与 Flexbox 配合(下)
    • 5.3 两种替代语法
      • 5.3.1 命名网格线
      • 5.3.2 命名网格区域
    • 5.4 显式网格与隐式网格(上)
      • 5.4.1 添加变化 (中)
      • 5.4.2 让网格元素填满网格轨道(下)
    • 5.5 子网格(全新增补内容)
    • 5.6 对齐相关的属性
    • 5.7 本章小结
  • 第六章 定位与堆叠上下文(已完结)
    • 6.1 固定定位
      • 6.1.1 创建一个固定定位的模态对话框
      • 6.1.2 在模态对话框打开时防止屏幕滚动
      • 6.1.3 控制定位元素的大小
    • 6.2 绝对定位
      • 6.2.1 关闭按钮的绝对定位
      • 6.2.2 伪元素的定位问题
    • 6.3 相对定位
      • 6.3.1 创建下拉菜单(上)
      • 6.3.2 创建 CSS 三角形(下)
    • 6.4 堆叠上下文与 z-index
      • 6.4.1 理解渲染过程与堆叠顺序(上)
      • 6.4.2 用 z-index 控制堆叠顺序(上)
      • 6.4.3 深入理解堆叠上下文(下)
    • 6.5 粘性定位
    • 6.6 本章小结
  • 第七章 响应式设计(已完结)
    • 7.1 移动端优先设计原则(上篇)
      • 7.1.1 创建移动端菜单(下篇)
      • 7.1.2 给视口添加 meta 标签(下篇)
    • 7.2 媒体查询(上篇)
      • 7.2.1 深入理解媒体查询的类型(上篇)
      • 7.2.2 页面断点的添加(中篇)
      • 7.2.3 响应式列的添加(下篇)
    • 7.3 流式布局
    • 7.4 响应式图片
    • 7.5 本章小结
  • 第八章 层叠图层及其嵌套
    • 8.1 用 layer 图层来操控层叠规则(上篇)
      • 8.1.1 图层的定义(上篇)
      • 8.1.2 图层的顺序与优先级(下篇)
      • 8.1.3 revert-layer 关键字(下篇)
    • 8.2 层叠图层的推荐组织方案
    • 8.3 伪类 :is() 和 :where() 的用法
    • 8.4 CSS 嵌套的使用
      • 8.4.1 嵌套选择器的使用
      • 8.4.2 深入理解嵌套选择器
      • 8.4.3 媒体查询及其他 @规则 的嵌套
    • 8.5 本章小结
  • 第九章 CSS 的模块化与作用域
    • 9.1 模块的定义
      • 9.1.1 模块和全局样式
      • 9.1.2 一个简单的 CSS 模块
      • 9.1.3 模块的变体
      • 9.1.4 多元素模块
    • 9.2 将模块组合为更大的结构
      • 9.2.1 模块中多个职责的拆分
      • 9.2.2 模块的命名
    • 9.3 CSS 的作用域
      • 9.3.1 CSS 作用域的就近原则
      • 9.3.2 划定作用域的边界
      • 9.3.3 CSS 中的隐式作用域
      • 9.3.4 关于 CSS 作用域与层叠图层
    • 9.4 CSS 模式库
    • 9.5 本章小结
  • 第十章 CSS 容器查询
    • 10.1 容器查询的一个简单示例
      • 10.1.1 容器尺寸查询的用法
    • 10.2 深入理解容器
      • 10.2.1 容器的类型
      • 10.2.2 容器的名称
      • 10.2.3 容器与模块化 CSS
    • 10.3 与容器相关的单位
    • 10.4 容器样式查询的用法
      • 10.4.1 将模块与所在容器解耦
      • 10.4.2 减少重复代码
    • 10.5 本章小结
  • 第 11 章 颜色与对比
    • 11.1 通过对比进行交流
      • 11.1.1 模式的建立
      • 11.1.2 还原设计稿
    • 11.2 颜色的定义
      • 11.2.1 色域与色彩空间
      • 11.2.2 CSS 颜色表示法(RGB、Hex、HSL、HWB、LAB/OKLAB、LCH/OKLCH)
    • 11.3 利用 OKLCH 处理颜色(上篇)
      • 11.3.4 从页面其他颜色衍生出新颜色(下篇)
    • 11.4 思考字体颜色的对比效果
    • 11.5 本章小结
  • 附录
    • 附录A:CSS 选择器参考
    • 附录B:CSS 预处理器简介
相关推荐
前端爆冲2 分钟前
项目中无用export的检测方案
前端
热爱编程的小曾29 分钟前
sqli-labs靶场 less 8
前端·数据库·less
gongzemin41 分钟前
React 和 Vue3 在事件传递的区别
前端·vue.js·react.js
Apifox1 小时前
如何在 Apifox 中通过 Runner 运行包含云端数据库连接配置的测试场景
前端·后端·ci/cd
-代号95271 小时前
【JavaScript】十四、轮播图
javascript·css·css3
树上有只程序猿1 小时前
后端思维之高并发处理方案
前端
庸俗今天不摸鱼2 小时前
【万字总结】前端全方位性能优化指南(十)——自适应优化系统、遗传算法调参、Service Worker智能降级方案
前端·性能优化·webassembly
黄毛火烧雪下2 小时前
React Context API 用于在组件树中共享全局状态
前端·javascript·react.js
Apifox2 小时前
如何在 Apifox 中通过 CLI 运行包含云端数据库连接配置的测试场景
前端·后端·程序员
一张假钞2 小时前
Firefox默认在新标签页打开收藏栏链接
前端·firefox