不同操作系统、不同浏览器下的默认字体是不同的,在网页项目中,我们可以通过 CSS 的 font-family 和 @font-face 来让页面渲染出自己心仪的字体。在使用之前,我们需要了解一下,网页中关于字体设定方面的基础知识。
1.字体的 fallback 机制
在 CSS 中,可以通过 font-family 引用多种系列、多种字体,并且可以对字体先后顺序进行设置。当用户打开一个网页的时候,浏览就会读取 font-family 第一个引用的字体,并去检索用户当前操作系统下的字体,如有就显示,如没有就检索下一个,以此类推。若浏览器找不到指定的字体,或者没有设置 font-family 则会 fallback 到浏览器的默认字体。
2.字体的先后顺序设置
由于中文字体内都包含西文字体,如想优先显示效果较好的西文字体,需要将西文字体写在中文字体的前面。虽然用户群体中使用 Windows 系统较多,但 Mac 用户大部分会下载 Office,所以会存在许多 Windows 下常见的字体,比如微软雅黑。将 macOS 系统的字体写在 Windows 的前面,可以保证在对应平台显示更好的效果。
先了解 serif(衬线体)与 sans-serif(无衬线体),衬线体与无衬线体是两种最基础的字形分类,衬线体在笔画开始与末端的地方有像小三角的装饰。

衬线体更多使用在印刷品上,在纸张上有棱角的字体更容易被识别。而在屏幕显示中字体过多的装饰点缀容易造成视觉疲劳,所以在屏幕显示中更多使用无衬线体。下面是一些常见常用的字体:
system-ui: 一种通用字体系列,它会选择当前操作系统的默认字体渲染。如在 macOS 与 iOS 系统里 system-ui 指向的中文字体为苹方,西文字体为 .SF NS。
-apple-system: system-ui 的兼容写法,在 macOS 与 iOS 系统里调用苹果系统的默认字体。
BlinkMacSystemFont: 为 macOS Chrome 里调用苹果系统的默认字体。
Arial: 无衬线西文字体,经常与 Helvetica 一起出现,支持不同操作系统、不同浏览器,兼容性好,属于安全字体。
Tahoma: 无衬线西文字体,经常出现,支持不同操作系统、不同浏览器,兼容性好,属于安全字体。
Helvetica / Helvetica Neue: 苹果生态中最常用的无衬线西文字体,Helvetica Neue 是 Helvetica 的升级版,加了不同粗细、不同宽度的字形。
Segoe UI: 无衬线西文字体,Windows 系统的默认西文字体。
Roboto: 无衬线西文字体,Android 系统的默认西文字体。
苹方: 无衬线中文字体,苹果系统的默认中文字体,除了中文简体(PingFang SC),还有台湾繁体(PingFang TC)和香港繁体(PingFang HK)。
Hiragino Sans GB (冬青黑体): 无衬线中文字体,用于兼容不支持苹方的旧版苹果系统,作为苹方字体的 fallback。
Microsoft YaHei (微软雅黑): 无衬线中文字体,Windows 系统的默认中文字体,iOS 与 Android 系统不支持微软雅黑。
Noto Sans (思源黑体): 无衬线中文字体,Android 系统的默认中文字体,由 Google 与 Adobe 推出的开源字体。除了中文简体(Noto Sans CJK SC),还有中文繁体( Sans CJK TC)。
WenQuanYi Micro Hei (文泉驿微米黑): 无衬线中文字体,Linux 系统的默认中文字体,用于兼容 Linux 系统。
Simsun (宋体): 衬线中文字体,风格明显,支持 Windows 与 macOS 系统。
sans-serif: 一种无衬线字体系列,常见的兜底字体,在前面所有引用的字体都找不到时会生效,显示当前浏览器默认的无衬线字体。
使用自定义字体,常用的方式有2种,本地@font-face和外部样式表(如:Google Fonts Web API库),它们在使用和功能上有所不同。
@font-face:
外部样式表
@font-face方式:将需要使用的字体文件下载后放在服务器上,用 @font-face 将字体文件作为一个资源应用到 CSS样式 文件。为了兼容不同浏览器需要准备多种字体格式文件,保证字体格式文件与浏览器的兼容情况。目前大部分浏览器都支持.woff2格式的字体文件,因此我们只需要引入.woff2这一种格式的字体文件即可。下面是详细使用方法:
@font-face {
font-family: 'warick';
src:local("warick"),url("./warick.257.woff2")format("woff2");
font-style:normal;
font-display:swap;
font-weight:400;
}
body{
font-family: 'warick';
}
项目中可以通过配置多个@font-face设置多种字体文件,需要使用那种字体,便可通过CSS属性 font-family: '字体名称';进行实际应用。
外部样式表:无需下载字体文件,项目中只需要引入对应的CSS外部样式表即可,然后通过CSS属性 font-family: '字体名称'引用需要的字体。下面以Google Fonts和jsDelivr cdn加速github仓库静态资源2种方式,讲讲如何使用。
Google Fonts站点,不仅支持字体文件下载,本地引入字体文件的方式,同时也支持Google Fonts Web API方式进行引入,比如:Noto Sans字体,我们在web项目中可以直接采用以下方式进行引入:
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans:ital,wght@0,100..900;1,100..900&display=swap" rel="stylesheet">
然后项目中直接使用字体:
body, html {
font-family: "Noto Sans", sans-serif;
}
因为fonts.googleapis.com在国外,加载过程会很慢,因此可以采用Google字体中国站,但是引用地址不是googlefonts.cn,所以很容易错把网站地址当作引用地址而出现错误。其引用地址是https://fonts.font.im。上面的引入地址可以调整为:
<link href="https://fonts.font.im/css2?family=Noto+Sans:ital,wght@0,100..900;1,100..900&display=swap" rel="stylesheet">
当然也可以将自己的字体文件和字体样式文件存放在github仓库,作为静态资源通过jsDelivr进行加速访问。详情查看使用jsDelivr+Github 实现静态资源免费CDN加速教程,本博客中的字体就是采用此方法进行引入加载。下面是详细使用方式:
引入字体样式文件,此文件通过@font-face定义了需要的字体和字体文件引用源
<link rel="stylesheet" type="text/css" href="https://gcore.jsdelivr.net/gh/AnyFork/Resource/fonts/division/Warick/warick.css">
然后项目中直接使用字体:
body, html {
font-family: warick;
}
在使用自定义字体时,有时候字体文件比较大,导致网页加载字体文件需要很长时间,影响站点体验,下面便讲讲如何优化。
unicode-range 是 CSS @font-face 规则中的一个属性,用于指定字体文件需要包含的 Unicode 字符范围,以优化字体加载效率。unicode-range 通过指定 Unicode 编码范围来控制字体加载,可显著减少字体文件体积和加载时间,使用这个特性可以优化字体文件加载,实现类似按需加载的效果。
当我们加载网站页面时,页面上展示的文字类型和文字数量都是有限的,比如:对于我的博客而言,主要涉及简体中文和西文,不涉及其他复杂的语种,而且页面上展示的汉字或者西文并非全部的Unicode 字符范围,因此我们只需要加载页面上包含的Unicode字符即可,不需要将整个字体文件加载进来,这样就可以将大的字体文件转变为小的字体文件进行加载。
中文网字计划站点提供了一个在线分包的工具,核心功能是将大的字体文件中包含的不同语种字体的 Unicode 字符,进行智能地分包,将不同语种字体按照 Unicode 字符范围进行拆分为多个小的字体文件。页面加载时,根据unicode-range自动加载所需的字体文件。这样可以明显提示字体加载速度,本站便是采用这种方法。
对于允许商用的字体,网站上可以任意使用,不存在字体侵权问题。
使用 font-family 的属性引用不可商用的字体,并且网页中也能显示这种字体,不会构成侵权问题,也不需要进行额外的授权许可。因为能够用 font-family 引用成功的字体是用户系统内本身就存在的字体。比如常见的苹方字体,只要我们系统中为引入苹方字体文件,只是应用苹方字体名,不存在侵权。
使用 @font-face 需要将字体文件下载后上传项目或服务器引用,使页面显示字体不再依赖用户系统自带字体,这时如要使用到不可商用的字体,需要购买字体版权,否则就属于侵权。
更多字体站点,点击前往