引子

趁着暑假,我又搭建了一个自己的个人博客,不同于以往,这次用的是较新的博客系统 Ghost。

因为 Ghost 的主题和 UI 实在是太好看了。

而且易用性也很好,比起臃肿的 WordPress 和 折腾人的 Hexo,Ghost 正中我意。

不过作为一个年轻的、国外开发者主导的博客系统,它似乎还没有考虑到中文显示这种东西。

Windows 平台下,Ghost 的中文默认显示为宋体,实在是辣眼睛。

于是就有了这次的探索,中文网页设计中,特别是文字较多的博客类,用那种字体更为合适呢?

例子

先来看看大公司网站所用的字体:

知乎

body {
    font-family: -apple-system,BlinkMacSystemFont,Helvetica Neue,PingFang SC,Microsoft YaHei,Source Han Sans SC,Noto Sans CJK SC,WenQuanYi Micro Hei,sans-serif;
    font-size: 15px;
    color: #121212;
}

简书

body {
    line-height: 1.42857;
    color: #404040;
    background-color: #fff;
    font-family: -apple-system,BlinkMacSystemFont,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Segoe UI","PingFang SC","Hiragino Sans GB","Microsoft YaHei","Helvetica Neue",Helvetica,Arial,sans-serif;
    font-feature-settings: "tnum";
    font-variant: tabular-nums;
}

GitHub


body {
    font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji;
    font-size: 14px;
    line-height: 1.5;
}

code {
    margin-top: 0;
    margin-bottom: 0;
    font-family: ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;
    font-size: 12px;
}

苹果

body {
    font-size: 17px;
    line-height: 1.5294717647;
    font-weight: 400;
    letter-spacing: -0.021em;
    font-family: "SF Pro Text","SF Pro Icons","Helvetica Neue","Helvetica","Arial",sans-serif;
    background-color: white;
    color: #333;
    font-style: normal;
}

小米

body {
    font: 14px/1.5 Helvetica Neue,Helvetica,Arial,Microsoft Yahei,Hiragino Sans GB,Heiti SC,WenQuanYi Micro Hei,sans-serif;
    color: #333;
    background-color: #fff;
    min-width: 1226px;
}

哔哩哔哩

2022 年 1 月 17 日更新

/* 新版首页 */
body {
    font-family: PingFang SC,HarmonyOS_Regular,Helvetica Neue,Microsoft YaHei,sans-serif!important;
    font-weight: 400;
    overflow-x: auto;
}

/* 旧版 */
body {
    margin: 0;
    font-family: -apple-system,BlinkMacSystemFont,Helvetica Neue,Helvetica,Arial,PingFang SC,Hiragino Sans GB,Microsoft YaHei,sans-serif;
    font-size: 12px;
    line-height: 1.5;
    color: #222;
    background-color: #fff;
}

锤子

html {
    font-family: Helvetica Neue,PingFang SC,Hiragino Sans GB,Heiti SC,Microsoft YaHei,WenQuanYi Micro Hei,sans-serif;
}

字体的分类

非衬线字体(Sans-Serif)

非衬线字体适用于屏幕显示,代表字体是黑体。可以用在较理性的技术类文章。

衬线字体(Serif)

衬线字体适用于印刷出版,代表字体是宋体。可以用在较感性的生活随笔类文章中。

等宽字体(Monospace)

等宽字体的每个字符具有相同的宽度,这使得英文字符和标点总是工整地排列,这些字体还专门为一些字母和符号做了优化,让你一眼就可以区别出 O0 / 1ilIL,代表字体 Source Code Pro

例如这一段就是等宽字体 Source Code Pro 的效果
<link href="https://fonts.googleapis.com/css?family=Source+Code+Pro&display=swap" rel="stylesheet">

常见的字体

2022 年 1 月 17 日更新

等线字体 Sans-serif

字体用途
system-ui默认系统字体
-apple-system, BlinkMacSystemFontmacOS, iOS
Segoe UIMicrosoft Windows, Xbox, etc.
Roboto较新版本的 Android
OxygenLinux / KDE
UbuntuLinux / Ubuntu
CantarellLinux / GNOME 3
Fira SansFirefox OS
Droid Sans旧版本的 Android
Helvetica NeueOSX
Arial, sans-serif备胎

Helvetica :被评为设计师最爱的字体,Realist 风格,简洁现代的线条,非常受到追捧。在 Mac 下面被认为是最佳的网页字体,在 Windows 下由于 Hinting 的原因显示很糟糕。 Arial :Helvetica 的「克隆」,和 Helvetica 非常像,细节上比如 R 和 G 有小小差别。如果字号太小,文字太多,看起来会有些累眼。Win 和 Mac 显示都正常 Lucida Family :Lucida Grande 是 Mac OS UI 的标准字体,属于 humanist 风格,稍微活泼一点。Mac 下的显示要比 Win 下好。 Verdana :专门为了屏显而设计的字体,humanist 风格,在小字号下仍可以清楚显示,但是字体细节缺失严重,最好别做标题。 Tahoma :也是 humanist 风格,字体和 Verdana 有点像,但是略窄一些,counter 略小,曾经是 Windows 的标准字体,Mac 10.5 之后默认也有安装。 Trebuchet MS: 为微软设计的一个 humanist 风格字体,个人觉得个性太过突出,用得不好会不搭。

微软雅黑(Microsoft YaHei) :Vista 之后新引入的字体,打开 Cleartype 之后显示效果不错,不开 Cleartype 发虚。微软雅黑的美观度和清晰度都较好,可以作为网页的首选字体。它在 Mac 平台的对应字体是华文细黑(STXihei)。

华文细黑 :Mac 下的默认中文。

Droid Sans和衍生的WenQuanYi Microhei :Andriod 中的中文,也是 Linux 绝大多数发行版本的默认中文,,当然也有用 WenQuanyi Zenhei 的,不过比较少了。

衬线字体 Serif

Georgia :基本上适合正文屏显的衬线字体,非 Georgia 莫属了。笔画粗重,衬线明线,轮廓较大,小字体显示也很清晰,同时细节还算 OK。 Times :Times 是为了报纸而设计的,特点是可以在有限的空间塞进去更多的文字,笔画较弱,小字号正文屏显看起来累眼。曾经 Engadget 改版的时候用了 Times 作为正文,被骂得很惨之后换成了 Georgia。

中易宋体(SimSun) :Win 最常见的字体,小字体点阵,大字体 TrueType,但是大字体并不好看,所以最好别做标题。宋体是最常见的中文字体,如果没有指定字体,操作系统往往选择它来渲染。很多人认为,这种字体并不美观。

仿宋(FangSong) :这种字体是衬线体,比宋体的装饰性更强。如果字号太小,会影响清晰度,所以只有在字号大于 14px 的情况下,才可以考虑这种字体。它在 Mac 平台的对应字体是"华文仿宋"(STFangsong)。 楷体(KaiTi) :楷体也是衬线体,装饰性与仿宋体接近,但是宽度更大,笔画更清楚一些。这种字体也不应该在小于 14px 的情况下使用。它在 Mac 平台的对应字体是"华文楷体"(STKaiti)。

等宽字体 Monospace

ui-monospace:较新的等宽字体声明形式,已在 Safari 13.19 中得到支持。这也是使用 macOS 新的“SF Mono”字体的唯一方法。

Menlo, Monaco:旧版本 macOS / OSX 的默认等宽字体,在支持 .ui-monospace 的 macOS 上不再生效。

Cascadia Code, Segoe UI Mono:Windows 自家的等宽字体,但默认不包含在 Windows 中 ,因为 Windows 根本没有默认的等宽字体(除非算上Courier New)。 但是Segue UI Mono已随一些微软自家的软件一起分发,正在普及中。

Cascadia Mono:是微软正在开发的一种新的等宽字体,随 Windows Terminal 一起提供。

Source Code Pro:知名的等宽字体,GNOME12 中的默认字体,但来自不同的家族,作为默认的可变宽度字体Cantarell

操作系统的预装字体

操作系统决定了开发者可以使用的字体。所以,第一步,我们必须了解操作系统到底提供哪些字体。

可以通过查询各维基百科的这个页面,列出了常见的不同系统自带的日中韩字体:List Of CJK fonts

Windows

  • 宋体:SimSun
  • 新宋体:NSimSun
  • 仿宋:FangSong
  • 楷体:KaiTi
  • 仿宋GB2312:FangSongGB2312
  • 楷体GB2312:KaiTiGB2312
  • Windows XP+: MS Hei 微软黑体
  • Windows Vista+: Microsoft YaHei 微软雅黑

macOS / iOS / iPadOS

详见苹果官网的 macOS Mojave 附带的字体

  • 华文细黑:STHeiti Light(又名 STXihei)
  • 华文楷体:STKaiti
  • 华文宋体:STSong
  • 华文仿宋:STFangsong
  • OSX 10.2+: 华文黑体 STHeiti
  • OSX 10.6+: 黑体 - 简 Heiti SC / 黑体 - 繁 Heiti TC
  • OSX 10.6+: 冬青黑体简体中文 Hiragino Sans GB
  • OSX 10.11+: 苹方 - 简 PingFang SC / 苹方 - 繁 PingFang TC

iOS / iPadOS 使用与 macOS 相同的中文字体。详见苹果官网的 字体列表

但是要注意的是,iOS / iPadOS 系统并不预装 CJK 衬线字体。所以几乎所有的中文网页在 iOS / iPadOS 都是显示为非衬线字体。原因正是前文所说的,黑体在屏幕上的可读性比宋体要高。

Linux

  • Open Source*: WenQuanYi Zen Hei 文泉驿正黑
  • Open Source*: WenQuanYi Micro Hei 文泉驿微米黑
  • Open Source*: Noto Sans CJK / Source Han Sans

Linux 由于发行版众多,比较混乱,一般需要用户自行安装中文字体,常见的有文泉驿、思源等开源字体。

Android 目前使用 Adobe 和 Google 联合开发的思源系列 Source * 字体,不过在 Android 中叫做 Noto *

Microsoft Office

如果用户装了 Microsoft Office ,还会多出一些字体。

  • 隶书:LiSu
  • 幼圆:YouYuan
  • 华文细黑:STXihei
  • 华文楷体:STKaiti
  • 华文宋体:STSong
  • 华文中宋:STZhongsong
  • 华文仿宋:STFangsong
  • 方正舒体:FZShuTi
  • 方正姚体:FZYaoti
  • 华文彩云:STCaiyun
  • 华文琥珀:STHupo
  • 华文隶书:STLiti
  • 华文行楷:STXingkai
  • 华文新魏:STXinwei

字体的使用

系统字体

CSS 的 font-family 命令,指定了网页元素所使用的字体。下面是一个例子。

font-family: Georgia, "Times New Roman", 
          "Microsoft YaHei", "微软雅黑", 
          STXihei, "华文细黑", 
          serif;

它的规则有三条。

(1)优先使用排在前面的字体。

(2)如果找不到该种字体,或者该种字体不包括所要渲染的文字,则使用下一种字体。

(3)如果所列出的字体,都无法满足需要,则让操作系统自行决定使用哪种字体。

根据这些规则,font-family 应该优先指定英文字体,然后再指定中文字体。 否则,中文字体所包含的英文字母,会取代英文字体,这往往很丑陋。

为了保证兼容性,中文字体的中文名称和英文名称,应该都写入font-family 比如,“微软雅黑"的英文名称是Microsoft YaHei

font-family 后面的值最好全部写英文,中文的话在 macOS 下某些版本的浏览器是不支持的,认不出来,还有比"Microsoft YaHei"这种英文写法,更推荐的写法是把汉字转义为 unicode,比如微软雅黑转义之后就是"\5FAE\8F6F\96C5\9ED1",这样能兼容更多平台和各种不同语言的浏览器,兼容性最好。

此外,中文字体的中文名称,以及由多个单词组成的英文名称,应该放在双引号内。

由于 Windows 和 Mac 的中文字体没有交叉,所以应该同时为两个平台指定字体。

常见的做法是,Windows 平台指定"微软雅黑”(Microsoft YaHei),Mac 平台指定"华文细黑"(STXihei)。

Web Fonts

如果是纯英文网页的话,选字体的事情比较好办,因为直接引入 Web Fonts 的成本非常低(文件小),而且现在 Web Fonts 的 [兼容性]("https://caniuse.com/#search=web font") 很好,基本上所有主流浏览器都支持,就能保证各个平台所用的字体的一致性。

对于开源字体,如果能在 Google Fonts 直接找到的话,可以通过他们的 CDN 直接引用到页面上。例如 Source Code Pro

<link href="https://fonts.googleapis.com/css?family=Source+Code+Pro&display=swap" rel="stylesheet">

或者

<style>
@import url('https://fonts.googleapis.com/css?family=Source+Code+Pro&display=swap');
</style>

如果找不到免费的 CDN 的话,也可以下载字体文件部署到自己的服务器上。

然后在 style.css 中加入兼容各个浏览器的 @font-face 定义:

@font-face {
    font-family: "JetBrains Mono";
    src: url("./fonts/JetBrainsMono-Regular.eot");
    src: url("./fonts/JetBrainsMono-Regular.eot?#iefix") format("embedded-opentype"),
        url("./fonts/JetBrainsMono-Regular.woff2") format("woff2"),
        url("./fonts/JetBrainsMono-Regular.woff") format("woff"),
        url("./fonts/JetBrainsMono-Regular.ttf") format("truetype");
    font-weight: 400;
    font-style: normal;
}

之后便可以在 CSS 中使用该字体:

.code {
    font-family: "JetBrains Mono", monospace;
}

这样浏览器就会下载自己能使用的字体文件进行文字渲染了。

总结成果

你现在所看到的这个页面的字体

:root {
  --font-sans-serif: -apple-system, BlinkMacSystemFont, "Apple Color Emoji",
    "Segoe UI Emoji", "Segoe UI Symbol", "Segoe UI", "PingFang SC",
    HarmonyOS_Regular, "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue",
    Helvetica, "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei",
    Arial, sans-serif;
  --font-serif: STZhongsong, STSong, "Noto Serif CJK", "Noto Serif SC", PMingLiu,
    SimSun, "WenQuanYi Bitmap Song", "Times New Roman", Times, serif,
    "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
  --font-mono: ui-monospace, SFMono-Regular, "SF Mono", "Cascadia Code",
    "Segoe UI Mono", "Source Code Pro", Menlo, Consolas, "Liberation Mono",
    monospace;
}

参考文献

木匣子 “中文博客的字体选型"

菜鸟教程 “常用网页字体”

阮一峰的网络日志 “中文字体网页开发指南”

https://qwtel.com/posts/software/the-monospaced-system-ui-css-font-stack/

版权声明

知识共享许可协议 本文由 Jacob 采用 知识共享署名 - 非商业性使用 - 相同方式共享 4.0 国际许可协议 进行许可,首发于 weixiang.github.io