一篇长文首先是一串排版的决定。字号给多大、行高留多少、栏宽压到多窄——这些参数在读者意识到它们之前,就已经决定了阅读是顺畅还是费力。
好的排版是不被注意的排版。它只负责让内容自己说话。
栏宽与字号
正文的栏宽比字号更影响阅读。栏太宽,视线从行尾跳回行首要穿越整屏;栏太窄,折行又太频繁。这篇走查用的是 760px 的栏宽,配 17px 的正文。
几个基准参数:
- 正文:17px,字重 330,行高 1.65
- 小节标题:24–26px,字重 450
- 段落间距:约 1em,而不是更大——短段落之间留太大空隙会读成碎片
代码与引用
行内代码应该自然地沉在句子里,比如 const spacing = '1em' 这样的片段,底色chip、字号略小一档即可。
块级代码需要自己的容器:
function rhythm(base: number, ratio: number, steps: number) {
return Array.from({ length: steps }, (_, i) =>
Math.round(base * Math.pow(ratio, i) * 100) / 100,
);
}
引用块用衬线是个不错的选择——衬线的气质天然偏向”被引述的话”,和正文的无衬线形成一层无声的层级。
更深一层的标题
第三层标题出现频率低,不需要太强的视觉重量,尺寸只比正文大半档就够了。表格则是另一回事:
| 元素 | 字号 | 字重 | 备注 |
|---|---|---|---|
| 正文 | 17px | 330 | 行高 1.65 |
| 小节标题 | 24px | 450 | tracking-tight |
| 行内代码 | 0.85em | 400 | chip 底色 |
最后
排版走查的终点永远是读起来”没感觉”。任何一处让你注意到参数本身的地方,都是参数还没调对的地方。如果这篇 mock 文章读起来平淡无奇,那它就算完成了任务。