行数尺寸与 lh 单位
min-block-size: calc(var(--textarea-rows, 5) * 1lh) 是配方里唯一一条把排版概念直接写成长度的声明。它依赖 lh 单位,也与 <textarea> 自带的 rows 属性正面相遇。
1 · lh 等于一行
1lh 的定义是元素自身的 used line-height。显式写了 line-height: 1.5 且字号 16px 时它是 24px,calc(5 * 1lh) 就是 120px,与五行文字严丝合缝。
未显式声明 line-height 时它退回 normal,由字体的度量决定,且逐字体不同:16px 的 system-ui 量得 1lh = 18px,同样 16px 的 monospace 是 19px(实测 Chrome 152,核对于 2026-09)。行数尺寸因此对字体选择敏感——换一款字体,同一条
5lh 会得到不同的像素高度。这不是缺陷,恰恰是这个单位存在的理由:五行就该随字体一起变,变的是像素数,不变的是行数。
替代写法都做不到这一点。5em 只与字号挂钩,行高 1.5 时它是 80px,比五行少 40px;5 * 1.5em 把行高硬编码成字面量 1.5,行高一改就错。
1lh 的实测值与 min-block-size 的落点。可切换 line-height 观察 1lh 随字体度量变化,并调 rows 属性观察它与下限的胜负。2 · rows 属性并未失效
配方在这条声明旁注明「rows 属性会失效」。实测不支持这个说法。min-block-size 给的是下限,而 rows 给的是控件的固有高度,两者相遇时取较大值。同样的 min-block-size: calc(5 * 1lh)(120px)、padding: 1em、1px 边框:
rows |
固有高度 | 实测边框盒高 | 谁决定 |
|---|---|---|---|
| 2 | 2 行 = 48px | 154px | 下限 120px + 34px |
| 5 | 5 行 = 120px | 154px | 两者相等 |
| 10 | 10 行 = 240px | 274px | rows |
rows="10" 的控件仍然是十行高。注释描述的情形只在 rows 不超过 --textarea-rows 时成立,而默认值恰好是 rows="2" 对 5lh——配方作者多半只在默认值上验过。
真正让 rows 彻底失效的是配方最后一条 field-sizing: content:它把控件的固有高度从「rows 行」改成「内容有多少行」,rows="10" 配一行内容实测只有 58px。这条修正与它的实测见 @supports 里的三条声明 §2。
注 · 同族的 rlh 取根元素的 line-height,适合跨组件对齐到同一套基线网格。<textarea> 的行高通常与正文不同,配方用 lh 而非 rlh 是对的:要的是「这个控件的五行」,不是「页面的五行」。lh 与 rlh 自
Chromium 109(2023-01)、Firefox 120(2023-11)、Safari 16.4(2023-03)起可用(兼容性据 MDN BCD,核对于 2026-09)。