CSS 与布局 / 字体里的隐藏开关 / 数字的对齐与字形:font-variant-numeric 待审核 3 / 18
数字 · font-variant-numeric

数字的对齐与字形:font-variant-numeric

做财务报表、价格列、排行榜、倒计时,数字列往往无法对齐——因为不少字体默认用比例宽度(proportional)数字:1 窄、0 宽,每行宽度都不一样。到底哪种是默认得看字体:用 canvas 量 100px 下 0–9 的 advance(Chrome 151 / macOS,核对于 2026-08),Arial、Helvetica、Verdana、Times New Roman 的十个数字宽度完全相同,tabular-nums 在它们身上看不出变化;Georgia(42.97~61.38px)、系统 UI 字体(44.34~61.72px)与 PingFang SC(40.1~60px)才是比例宽度。font-variant-numeric: tabular-nums 一条声明就把所有数字换成等宽字形,列随之对齐,而且这是字体里现成的另一套字形,并非用 letter-spacing 强行调整。

图 1-1 · 逐项拨动 font-variant-numeric 的取值,观察同一组数字的字形与列对齐实时变化。

1 · 各取值与适用场景

取值 底层 tag 作用 适用场景
tabular-nums tnum 每个数字等宽,列对齐 报表 / 价格列 / 倒计时 / 排行榜
proportional-nums pnum 每个数字按自身宽度 正文里夹的数字,读起来更自然
lining-nums lnum 全部数字坐在 baseline 上、等高 和大写字母 / UI 数字并排
oldstyle-nums onum 有升降部的「老式数字」,像小写字母 长篇正文,融进文字更柔和
slashed-zero zero 0 划一道斜杠 编号 / 序列号,防 0O
diagonal-fractions frac 1/2 排成真分数 配方、尺码、比分
stacked-fractions afrc 上下叠排的分数 数学与工程排版
ordinal ordn 1st / 2nd 的后缀抬成上标 日期与名次

同一族里 figure(lining / oldstyle)、spacing(tabular / proportional)、fraction(diagonal / stacked)三组各自互斥,跨组可组合,如 font-variant-numeric: tabular-nums slashed-zero。字体侧还有一层限制:OpenType 注册表写明 zero 只作用于 lining figures,与 onum 互斥,因此 oldstyle-nums slashed-zero 虽然 CSS 语法合法,多数字体不会同时生效。效果取决于字体是否含对应字形——本页样本用 OpenType 表齐全的 Inter。

关键:tabular-nums 是字体内置的「等宽数字字形」,和 letter-spacing 或等宽字体(monospace)完全不同——它只让数字等宽,字母照旧按比例排,既对齐又不牺牲正文可读性。

2 · 相关链接

  • font-variant-numeric · MDN——developer.mozilla.org。各取值的精确定义:figure(lining/oldstyle)、spacing(tabular/proportional)、fraction、ordinal、slashed-zero,以及可组合写法。
  • tabular-nums · Can I use——caniuse.com。font-variant-numeric: tabular-nums 的浏览器支持情况——现代浏览器普遍支持,可放心用于报表对齐。