通用之网

1.2 字号

从固定的 14 磅下限到一套有韧性的系统:以 16px 作为正文下限、尊重用户偏好的 rem 尺寸、WCAG 1.4.4 的调整大小要求,以及使用 clamp() 的流体缩放。

9 min read

本页面借助 AI 辅助翻译。英文原文为权威版本。

2005 年版用一个数字回答了字号问题:无障碍正文最小 14 磅,在 Verdana 中约合 19 像素。就当时而言,这是个站得住脚的数字——传统印刷的 9 磅、10 磅字号显然不适合粗糙的屏幕,而 Verdana 巨大的 x字高让 19 像素读来舒适。但过去二十年更深的教训是:没有任何单一数字能成为答案,因为如今对字号拥有最终决定权的是读者,而不是设计师。设计师的工作已从挑选正确的字号,转变为构建一套经得起读者选择的系统。

自 2005 年以来的变化

三项发展重构了这个问题。

其一,浏览器默认值敲定了下限。所有主流浏览器的默认文本大小都是 16 CSS 像素,用户可以在设置中调高。16 像素成了平台与读者之间事实上的契约:正文不低于默认值即是遵守契约;低于它,则是在推翻用户可能有意设定的偏好。当年 19 像素的 Verdana 数字是在补偿 Verdana 异乎寻常的 x字高和那个时代的渲染水准;在典型的现代正文字体中,16px 的阅读体验与之相当。对 x字高偏小的字体,17 或 18px 才是诚实的等价物——2005 年“x字高比名义字号更重要”的洞见完好无损地延续了下来,CSS 如今甚至用 font-size-adjust 属性将其编码:它把回退字体缩放到一致的 x字高比例,使字体替换无法悄悄缩小文字。

单词 legible 分别以 12、14、16、18、21 像素排出——16 以下的字号被标记为过小,16 为下限,21 为宽裕。

其二,无障碍标准把可测试的要求从字号本身改成了可缩放性。WCAG 成功标准 1.4.4(调整文本大小)要求文本可放大到 200% 而不丢失内容或功能;1.4.10(回流)要求内容在高倍缩放下回流、无需二维滚动。字号固定而慷慨的页面仍可能两项皆败;设为 16px 且布局有韧性的页面则能通过。标准的重心在缩放路径,而非起点。

其三,高密度显示器消除了旧日的上限压力。文字缩放后不再劣化,2005 年对缩放下布局稳定性的焦虑,如今有了工程学而非排版学的答案。

尊重用户:用 rem,不用 px

最应采纳、影响最深远的一项实践,是用 rem 单位设定文字尺寸。rem 相对于根字号,而根字号继承自浏览器默认值——把默认值从 16 调到 20px 的用户,会看到所有以 rem 设定的元素等比放大。以 px 固定的文字则完全无视这一偏好。

常见的辩护——“用 px 的用户还可以缩放”——只对了一半,而这个区别很重要。整页缩放确实会放大 px 文字。但浏览器的文本大小设置——许多低视力用户依赖它,正因为它在所有网站上持续生效、无需逐页调整——对以 px 设定的文字毫无作用。用像素固定文字,等于悄悄禁用了平台上最持久的无障碍机制。同样的逻辑也反对把根元素的 font-size 设为 px 值(老的 "html { font-size: 62.5% }" 技巧因其成比例而可以接受;"html { font-size: 10px }" 则不行)。

行距也属于同一纪律:请使用无单位值(正文 1.5 是稳妥的默认),让它随文字最终的大小缩放,而不是冻结在为设计师视口算出的 px 值上。

流体字号,不失下限

响应式设计带来了新工具,也带来了新的失败模式。clamp() 函数让字号随视口呼吸——clamp(1rem, 0.9rem + 0.5vw, 1.25rem) 设定了下限、流动的中段和上限——这对标题以及应在大屏上放大的正文确实有用。

失败模式是仅用视口单位设定字号。纯 vw 的文字不响应缩放:用户缩放时,视口的 CSS 宽度成比例缩小,文字重新计算后的视觉大小几乎不变,令 WCAG 1.4.4 落空。防线就内建在推荐的写法里:流体表达式中始终包含 rem 项,clamp() 的最小值也基于 rem,让用户偏好和缩放都保有抓力。然后实际缩放到 200%,确认文字确实变成了两倍大。

一套现代字号架构

把各部分拼起来,一套站得住脚的无障碍阅读字号体系是这样的:正文最低 1rem(默认设置下 16px,x字高小的字体应更大),次要文字不低于约 0.875rem 且绝不用于持续阅读,标题按适度的比率、以 rem 表达并可选用 clamp() 流动,而每一处固定的 px 字号都应视为缺陷。2005 年关于小字的指导以更新后的形式依然成立——真正的小字只可容忍于简短的辅助性字符串,绝不可用于连续段落,而且 WCAG 的对比度规则对它更严:小于 18pt 常规(或 14pt 粗体)的文字需要 4.5:1 的对比度,而非大字享有的 3:1——这是对字号与对比度此消彼长关系的明确承认。

对低视力读者而言,这一切都不能取代放大;它们的作用是让放大生效。成功的标准不是页面在 100% 下的模样,而是它在 200% 和 400% 缩放下是否仍是一栏可读的文本。

CSS 实现

html { font-size: 100%; }    /* the reader's choice is the unit */
body { font-size: 1rem; }    /* 16px floor for continuous text */
h1 {
  /* the rem term keeps user settings and zoom in charge */
  font-size: clamp(2rem, 1.2rem + 3vw, 4rem);
}
small { font-size: 0.875rem; }   /* captions only, never body text */

建议

  • 将 16px(1rem)视为正文下限;x字高偏小的字体应再调高。
  • 所有文字以 rem 设定;行距使用无单位值(正文约 1.5)。
  • 绝不用 px 固定正文,也绝不把根字号设为 px 值。
  • 用 clamp() 实现流体字号,且始终包含 rem 分量,使缩放和用户偏好继续生效。
  • 使用 font-size-adjust,让回退字体保持预期的 x字高。
  • 把 200% 缩放(WCAG 1.4.4)与 400% 回流(WCAG 1.4.10)测试列为常规质检。
  • 小于正文的字号只留给简短的辅助文字,并给小字它所要求的更严格的 4.5:1 对比度。

延伸阅读