F4.03.3characters per line设计

行长应以字符数而非像素约束

别名: 每行字符数 · cpl · ch unit

概念解释

栏宽若写成 600 像素,字号一改、字体一换、用户一放大,这 600 像素里能放下的字数就变了。过长、过短谈的都是眼睛和语言单位,两者真正的尺度是每行字符数(characters per line),不是屏幕上的像素宽度。像素约束的是盒子,字符数约束的是一次折返要走多远、一个短语会不会被切断。

西文习惯用每行字母数或词数,中文用每行汉字数。CSS 的 ch 是相对「0」这个字形宽度的单位,对近似等宽的汉字比像素诚实,对比例西文只是近似。不论哪一种,意图都是:行长跟着文字走,不跟着画板走。

机制

同一像素栏,12 像素字可以塞进七十几个西文字符,18 像素可能只剩四十出头。前者已经滑向过长,后者可能刚好。若产品用像素把栏钉死,字号阶梯、动态字体、语言切换都会在用户看不见的地方改写有效行长:英文界面还在舒适带,德文词更长、中文每字更宽,同一盒子立刻过挤或过空。

字体的宽度特征同样改写字符数。紧缩的标题黑体和偏宽的正文宋体,在同一像素里放下的字差一截;等宽数字、全角标点又会再吃掉格子。所以「我们正文栏 680px」作为实现细节可以存在,作为设计意图不行——意图必须说「正文大约每行多少字」,像素只是某一种字体、某一档字号下的投影。

用户放大字号时,若栏宽仍是像素而字在长,每行字符数下降,段落从舒适带滑向过短,频繁折行开始打断。若栏宽用字符单位或随字号等比放大,字符数大致稳定,过长过短的判断才还成立。

边界

图片、视频、地图这些非文字栏本来就按像素或视口比例排,不必改成 ch。按钮、标签、单行输入的宽度由控件和触达决定,不是散文行长。等宽代码用字符数约束反而最自然,但数字往往来自语言惯例(如每行 80 或 100),不是阅读折返的舒适带。混合栏——左边图、右边说明——说明文的字符数会被图的像素宽度牵着走,这时要在断点上改布局(图上文下)来救字符数,而不是假装像素上限等于阅读上限。

极端窄屏上,物理像素不够放下目标字符数。此时字符数是诊断工具:它告诉你已经过短,接下来的选择是减字号、减边距、或接受短行并改行高,而不是继续宣称「我们是 680px 所以没问题」。

怎么落地

  • 把正文栏的设计意图写成每行字符数(西文与中文分开给),实现可以用 chem 或「字号 × 系数」去逼近,不要只在视觉稿上标像素。
  • 在字号阶梯的每一档、在系统字号放大后,重新数每行实际字符,而不是假定像素栏宽仍然等于原来的阅读行长。
  • 中英切换时分别验收:同一像素盒子里中文字符数更少、德文词更长,过长过短的阈值会搬家。
  • 验证:在默认字号和最大常用放大档各复制一段正文,数第一行到第三行的字符。三档都落在同一字符数区间,约束才是跟字走的;只有像素对得上、字符数在跳,栏宽就是钉在画板上的。

延伸

  • 同组F4.03.1 行长过长导致换行时找不到下一行 · F4.03.2 行长过短导致频繁换行打断阅读
  • 相邻F4.01 字号阶梯 · F4.09 动态字体
  • 站内检索characters per line · ch unit · measure · cpl

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/F4.03.3