行高需随字号与行长共同调整
别名: 行距 · line-height · 行间
概念解释
界面里最常见的行高做法是写死一个无单位倍数,比如处处 1.5,然后指望它在 12 像素的辅助说明和 32 像素的标题上同样合适。行高(leading)不是字体的固定配件,它是字号和行长(measure)的函数:字变大、行变长,行与行之间需要的空隙都会改。单独锁死任一端,另一端一动,行高就错位。
行高在这里指行框的垂直节奏,不是「看起来疏一点就好」。它要同时服务两件事:让一行内部的字面待在稳定的水平带里,以及让眼睛从行尾折回行首时落在下一行,而不是落回本行或跳两行。
机制
折返扫视需要一条可瞄准的「下一行」。行越长,起点和终点在视野里离得越远,瞄准误差越大,行间就必须留出更宽的空带,把相邻两行分成两条可捕获的轨道。行短时,这条空带可以收窄,过宽反而把一段话拆成一串孤立的短句。
字号的作用方向相反。字变大,同样倍数下的绝对空隙已经在长;再沿用给小字准备的 1.5,标题行会散成一条一条,段落的块面感消失。小字则相反:绝对空隙不够,倍数需要更高,才能在字面之间挤出同样可瞄准的空带。所以「全站一个 line-height」在数学上整齐,在阅读上总是迁就了其中一档、牺牲另一档。
这就是为什么行高必须和字号、行长一起改:三者是同一条阅读轨道的三个旋钮。只改字号不改行高,等于把轨道间距留在旧设备上;只改栏宽不改行高,等于让折返去瞄一条已经不够宽的缝。
怎么研究
Tinker 的印刷易读性实验把行高、字号、行长当作一组联合自变量,而不是三个分开的美学选择。因变量通常是阅读速度、理解,以及主观的「挤 / 散」评分。屏幕上的后续工作(包括 Dyson 对行长的研究)沿用这个联合逻辑:单独报告一个「最佳行高倍数」而不同时报告字号和每行字符数,结果无法被复用。
界面里可操作的测量:固定字体与字重,系统变化字号和栏宽,记录折返是否落到正确的下一行(可用眼动看行首着陆点,也可用出声阅读时的串行、漏行次数作近似)。自变量是字号、每行字符数、行高倍数;因变量是串行率、阅读速度、主观拥挤。
边界
单行文本——按钮、输入框标签、导航——没有折返,行高退化成垂直居中和点击高度的问题,不再跟行长联动。诗词、代码、表格单元格各有自己的垂直惯例,不能拿正文段落的倍数去套。用户放大字号之后,若行高仍是固定像素而不是相对倍数,空隙会被字面吃掉;若倍数过大,放大后段落会变成稀疏的清单。联动在动态字号下仍然成立,只是要用相对单位来做。
怎么落地
- 把行高写成随正文字号和栏宽变化的关系,而不是一条全局 1.5。栏变宽时加行间,标题档降低倍数。
- 在断点上同时检查三件事:字号、每行大约字符数、行间。只改栏宽不改行高,等于没改完。
- 正文用相对行高;不要把段落行高写成固定像素,否则用户一放大字,行间先死。
- 验证:把同一段文排成窄栏和宽栏、小字和大字四种组合。出现串行、漏行或「标题一行一行往下掉」,就是那一组的行高没有跟着另外两个旋钮走。