chapter[4] · part 1 / 鉴赏的基础

文字:字体排印的隐形艺术

印刷应该是隐形的:像一只水晶酒杯,它存在的全部意义是盛放美酒,而不是让人欣赏杯子。 比阿特丽斯·沃德(Beatrice Warde),《水晶酒杯》,1930

本章讨论一种你正在使用的艺术。此刻你眼前的这页书:字号 18px、行高 2 倍、每行约 36 个汉字、衬线字体——这些决定如果做对了,你根本不会注意到它们,只会觉得"读起来很顺"。字体排印(typography)是唯一以隐形为最高成就的视觉艺术。

它也是对程序员性价比最高的一章。界面设计师 Oliver Reichenstein 有句广为流传的断言:"Web 设计 95% 是字体排印。"看看你做的产品:除去图片,屏幕上剩下的几乎全是字。把字排好,一个界面就好了一大半;字没排好,再贵的插画也救不回来。

4.1衬线与无衬线:两千年前的笔触化石

字体的第一个分类轴:笔画末端有没有那个小小的"脚"。有,叫衬线体(serif);没有,叫无衬线体(sans-serif)。这个"脚"不是装饰发明,是一块化石——它保存着两千年前罗马石匠的凿痕:

图拉真柱基座铭文
图拉真柱基座铭文 · 罗马 · 公元 113 年 · 公有领域 图拉真碑文 —— 全部西文衬线大写字母的共同祖先。 ① 看任何一个笔画的端点:先用平头笔刷写样、再以凿子刻石,收笔处自然张开形成小喇叭口——这就是衬线的起源;② 看笔画粗细:竖画粗、横画细(O 的轴线还是斜的),这是平头笔固有的角度留下的痕迹,今天 Times、Georgia 的粗细对比直接继承自它;③ 注意整体气质:庄严、永恒、纪念碑性。两千年后,电影海报想要"史诗感"时用的 Trajan 字体,就是把这块石头数字化的产物。字体的"气质"不是玄学,是它的制造工具与时代留在形状里的记忆。

无衬线体则是工业革命的孩子:十九世纪的广告招贴需要在远处一眼可读的粗壮字形,衬线这种"手工痕迹"被砍掉,只剩功能性的骨架。所以两大家族的语义分工至今仍带着出身的印记——衬线 = 传统、人文、权威、长文阅读;无衬线 = 现代、中性、工业、界面与标识。本书正文用衬线(像一本书),图注和导航用无衬线(像一套界面),就是在使用这套两百年的语义协议。

程序员视角

还有第三个家族是你的老朋友:等宽字体(monospace)。它的出身同样决定气质——打字机和终端机的机械限制要求每个字符同宽。于是"等宽"在视觉语义里 = 机器、精确、未经修饰的原始数据。这就是为什么 code 用等宽显示会让人觉得"这是真实的代码",也是为什么本书的章节编号用 JetBrains Mono——它在悄悄说:"这本书的作者是个工程师。"

4.2排版的诞生:古腾堡的栅格

字体是字母的形状,排印是把它们组织到页面上的系统。这个系统的第一个工业级实现,是 1455 年的古腾堡圣经:

古腾堡圣经,纽约公共图书馆藏本
Gutenberg Bible · 1455 年 · 纽约公共图书馆 Lenox 藏本 · 公有领域 《古腾堡圣经》 —— 第一个被大规模复制的版面设计系统。 忽略你读不懂的拉丁文,只看版面工程:① 双栏——每栏行长被控制在舒适的扫读宽度内(单栏排满会让眼睛在换行时迷路,这就是第〇章"行长"规则的五百年前实现);② 每栏 42 行,行行对齐,左右两栏的基线完全同步——这是"基线网格"的鼻祖;③ 文字块在页面上的位置不对称:内边距窄、外边距宽、下边距最宽,这套"页边距比例"让左右两页摊开时形成一个稳定的整体。栅格系统不是 CSS 发明的,它比印刷术本身还要早熟。

古腾堡圣经确立了排印的本质:排版是工程,不是书法。它把"美"从抄写员的手艺转移到了一套可复制的参数里——字号、行长、行距、边距。五百年后,这些参数一个不少地出现在你的 CSS 里。

4.3四个参数决定可读性

排印参数很多,但决定长文可读性的主要是四个,全部可以量化:

参数CSS长文经验值做错的症状
字号font-size正文 16–21px,移动端不小于 16px太小:费力;太大:像儿童读物
行高line-height西文 1.5–1.7,中文 1.8–2.1太挤:串行;太松:段落散架
行长max-width西文 45–75 字符,中文 25–40 字太长:换行迷路;太短:视线频繁折返
段距margin约一个行高,且明显大于行距段距≈行距时,段落结构消失

注意中文行高显著高于西文。原因在字形结构:拉丁字母有升部降部(b、p 的出头),字行之间天然有"锯齿状"空隙;汉字是顶天立地的方块,行与行之间若不主动留空,会糊成一片墙。中文排版的一切参数,都要为"方块字密度更高"这个事实买单——这也是为什么直接套用英文模板的中文网站总显得喘不过气。

行长失控 · 行距太挤

行顶到边、行距贴着字高:一堵字墙。读者的眼睛在第三行就开始打滑。这是默认 HTML 不加任何 CSS 的样子——浏览器默认值是为 1995 年的屏幕定的。

收窄行长 · 放松行距

同样的内容:两侧留白收住行长,行距放松到字高的两倍左右,段距明显大于行距。没有换任何字体,没有加任何颜色——可读性的提升几乎全部来自空间,而不是字体本身。

核心概念

新手以为排版的关键是"选个好字体",内行知道:排印之美 80% 来自空间参数(字号、行高、行长、段距),20% 才来自字体选择。用系统默认字体 + 正确的四参数,胜过用昂贵字体 + 默认参数。这是整本书里最容易立刻兑现的一条。

4.4层级:两种字号、两种字重,解决一切

正文之外,界面文字的核心问题是层级(hierarchy):让用户不读内容就能看出"什么是标题、什么是正文、什么可以忽略"。建立层级的工具按副作用从小到大排序:字重 → 字号 → 颜色(明度)→ 换字体。新手常犯的错是反着用:标题换三种字体、五种颜色,层级反而消失——因为处处不同等于处处相同。

一个可靠的下限配方:两种字号 + 两种字重的 2×2 矩阵,足以表达四级层级(大粗=标题,大细=副题,小粗=强调,小细=正文)。本书的图注就只用了这个配方。先把 2×2 用到极限,不够再扩展——几乎从来不需要扩展。

4.5中文的另一条传统:当文字本身就是艺术

西方把"写字"与"排字"分成书法与排印两门手艺,中文传统里两者的边界要模糊得多——因为汉字本身的造型空间大得多。看一眼中文书写传统的最高峰:

王羲之《兰亭集序》神龙本
王羲之 · 兰亭集序(神龙本摹本,冯承素摹)· 原作 353 年 · 北京故宫博物院 · 公有领域 《兰亭集序》 —— "天下第一行书",也是一份未经清稿的草稿。 不必识读内容,用前几章的工具看:① 节奏(第二章)——字有大小、笔画有粗细枯润,行与行疏密不一,像呼吸一样起伏,这正是"行气";对比古腾堡圣经的机械均匀,你能看到两种传统对"美"的不同押注:复制的精确 vs 书写的生命;② 重复与变化——全文二十多个"之"字,每个写法都不同,刻意避免雷同:在"同一字形"建立的预期上做微变化,正是 2.4 节的切分音;③ 注意涂改痕迹(多处补字、改字)——它是草稿,而后世认为正是即兴的松弛成就了它,誊清版反而失去神采。这给鉴赏者一个深刻的提示:完美的均匀不是美的上限。
程序员视角

今天做中文界面,你同时站在这两条传统的下游:排印传统给你网格、字阶和参数表;书法传统提醒你方块字的特殊约束——没有斜体(CSS font-style: italic 对汉字只是机械倾斜,传统排印用楷体或着重号表强调)、没有大小写(西文用 ALL CAPS 做的事,中文用字重和字号做)、标点占一个全角位(行首行尾需要标点挤压规则,成熟排版引擎才处理得好)。直接翻译英文设计稿的字体规范,就像直接翻译它的文案一样不可靠。

4.6认字体:一张气质速查地图

4.1 把字体分成衬线与无衬线两大族,但每一族内部还有光谱,而光谱上的位置直接决定了字体的"气质"。你不需要记住几百种字体的名字,只需要学会看出一个字体落在光谱的哪一段——这和鉴赏画作一样,是模式识别。下面这张字样表用的是你设备上很可能装着的字体,请直接盯着字形本身看,而不是看名字:

衬线族 · 横轴 = 笔画粗细对比(contrast)从低到高 Rag Old Style(Baskerville/Garamond) 粗细对比小、衬线带弧度、应力倾斜。 气质:温暖、人文、可信 → 长文/书籍/报刊 Rag Didone 现代衬线(Didot/Bodoni) 粗细对比极端、衬线细如发丝、应力垂直。 气质:优雅、高冷、奢侈 → 时尚/美妆/标题 无衬线族 · 横轴 = 从中性几何到带书写感(humanist) Rag Grotesque(Helvetica/Arial) 中性、紧凑、几乎无表情。 气质:客观、企业、安全 → 系统 UI/标识 Rag Geometric(Futura) 由正圆与直线构成、o 接近完美圆。 气质:现代、理性、克制 → 科技/建筑/潮牌 Rag Humanist(Gill Sans/Frutiger) 保留手写笔画的开口与比例变化。 气质:友好、易读、亲切 → 导视/教育/医疗
图 4-2 · 字体气质光谱(字样由你的系统字体即时渲染,不同设备略有差异)· 本书排布 看字形,不看名字 练一个具体的眼力:盯着每个字母 g 的下半部,和小写 a 的形状。Old Style 的笔画粗细差别小、收尾带圆弧(像钢笔写出来的);Didone 的竖画极粗、横画细到几乎消失(像刻出来的);Helvetica 的字母口子收得很窄、表情中性;Futura 的 a 是个简单的圆加一竖;Gill Sans 的字母开口大、像有人在快速书写。一旦你能从字形读出制造方式(4.1 说的"工具的化石"),你就能给任何字体在这张光谱上定位,也就能判断它配不配得上你产品的气质。

这张地图给出一条实用的配字原则:配对要"够不同,才不打架"。同一族里挑两个气质相近的字体(比如两个都中性的无衬线),它们的差异小到只会让人觉得"哪里怪怪的"——又是那个"羞怯的差异"(第七章会正式命名)。安全且高级的经典组合是跨族搭配:一个有性格的衬线做标题 + 一个中性的无衬线做正文(或反过来),靠族的差异拉开层级,靠各自的克制保持和谐。本书自己就是这个套路:思源宋体做正文的"声音",思源黑体做标签的"旁白",JetBrains Mono 做代码的"机器音"——三个声部,各有分工(回看第〇章 0.2 节)。

程序员视角 · 被忽略的微排版

选对字体之后,还有一层几乎没人做、但做了立刻显专业的细节,叫微排版(microtypography),而且大多是 CSS 一行的事:text-wrap: balance 让多行标题每行长度均衡(不再出现"标题最后孤零零掉下来一个字");hanging-punctuation 让段首的引号悬挂到文本框外,左边缘才真正齐平;font-feature-settings: "tnum" 给表格里的数字开等宽数字(回链 9.3 节的数据对齐);中文排版还要处理标点挤压与避头尾。这些都是"隐形的"——做对了没人夸,做错了所有人下意识觉得"不够精致"。微排版是排印里的最后 1%,也是业余和专业的分界线。

鉴赏练习 4

三道题。① 测量:打开一个你觉得"读起来很舒服"的网站(推荐任何一家严肃媒体的文章页),用开发者工具量出正文的四参数:font-sizeline-height、一行大约多少字、段距与行距之比。对照 4.3 的表格——它们几乎一定落在经验区间内。② 动手:找一段你自己项目里的长文本(README、帮助页、设置说明),什么字体都不换,只调四参数到经验值。前后截图对比。这十五分钟可能是你整个职业生涯里"投入产出比"最高的一次界面改动。③ 定位:找出你最近用过的三个 App 的标题字体,对照图 4-2 把它们放到光谱上——它们的气质和产品想传达的气质一致吗?一个主打"温暖陪伴"的 App 用了冷峻的 Didone,就是一处气质错配。