line-height 的四种值
最后更新 2026-11-02
EN中文
本页目录
line-height 决定一行文字占多高。它的四个取值里,有三个看起来差不多,但在继承时行为完全不同——这是 CSS 里最常被踩的一个坑。
四种值
| 值 | 例子 | 含义 |
|---|---|---|
normal |
line-height: normal |
由浏览器按字体度量给一个值,通常约 1.2 倍字号 |
| 数字 | line-height: 1.5 |
字号的倍数,计算时乘当前 font-size |
| 长度 | line-height: 24px |
固定高度,与字号无关 |
| 百分比 | line-height: 150% |
当前 font-size 的百分比,计算成固定值 |
继承上的差别才是重点
假设父元素:
.parent {
font-size: 16px;
line-height: 1.5; /* 或 24px,或 150% */
}
.child {
font-size: 32px;
}
| 父级写法 | 子元素继承到的 | 子元素最终行高 |
|---|---|---|
1.5(数字) |
数字 1.5 本身 |
32 × 1.5 = 48px |
24px(长度) |
24px | 24px(比字号还小,会挤在一起) |
150%(百分比) |
已算好的 24px | 24px(同上) |
也就是说:只有无单位数字是「按比例」传下去的,长度与百分比在父元素那里就被算成了绝对值,再原样继承。
这就是「父级写 line-height: 1.5,标题放大字号后行距却不对」的两种成因:要么父级写的是 150% / 1.5em,要么标题自己又设了一个固定值。
行框是怎么搭出来的
一行文字的高度不是字形的实际高度,而是一个行框(line box):
- 取字体的上伸与下伸,得到内容的自然高度;
- 用
line-height减掉这个高度,剩下的空隙上下各分一半(叫 half-leading); - 所有行内盒按
vertical-align对齐到基线上,行框取最高者。
所以 line-height 变大时,文字是上下各撑开一点,而不是只往下推——这也是为什么两个不同字体混排时,即使 line-height 相同,视觉上的行距也可能不同:它们的分母(字体上伸下伸)不一样。
normal 到底是什么
normal 不是「1.2」,而是「由浏览器按字体度量算一个值」。规范给的是一个推荐算法(用字体的升部、降部与 lineGap),具体数值因浏览器与字体而异。
所以别把 normal 当常量:同一份 CSS 在 Chrome、Safari、Firefox 上可能得到不同的行距;换字体也会变。
实践写法
:root {
--leading-tight: 1.25;
--leading-normal: 1.6;
}
body {
font-size: 1rem;
line-height: var(--leading-normal);
}
h1,
h2,
h3 {
line-height: var(--leading-tight);
}
- 根元素用无单位数字,全站比例一致;
- 大标题单独给一个更紧的倍数(字号越大,需要的相对行距越小);
- 需要精确对齐网格时(比如设计稿要求每行 24px),才用长度,并且要在所有影响字号的层上一起算。
和字体的关系
字体文件里的 hhea.ascender / descender / lineGap(以及 OS/2 里的两组度量)决定了「1 倍行高」的自然高度。想弄清为什么某个字体在高行高下显得松散,看 head / hhea / post。
延伸阅读
- MDN:
line-height - CSS Inline Layout 规范:行框与 half-leading