ch单位通过以“0”字符宽度为基准限制容器宽度,在等宽字体下近似实现每行N字符效果;需配合max-width、box-sizing及font-family显式声明以确保稳定。

ch 单位不能真正“精准统计”每行字符数,但它能以极高一致性限制容器宽度,从而让浏览器在该宽度下自动换行——效果上接近控制每行显示约 N 个字符,尤其在等宽字体下几乎等价。
为什么 ch 能近似实现“每行 N 字”效果
1ch 等于当前 font-family 和 font-size 下数字 "0" 的宽度。等宽字体(如 monospace)中,"0" 宽 ≈ 每个 ASCII 字符宽,所以 width: 45ch 基本容纳 45 个英文/数字字符;非等宽字体下是平均估算,但对阅读宽度约束足够稳定。
- 它随
font-size缩放,天然适配用户字号偏好、系统缩放、无障碍设置 - 中英文混排时,
"0"宽仍可测且稳定,比用em或px更鲁棒 - 不依赖视口尺寸,避免
vw在窄屏下过窄、宽屏下过宽的问题
实际写法:用 width + max-width + box-sizing
仅设 width: 45ch 不够——若父容器更窄,元素会被压缩变形;若内容含长单词或超宽字符(如某些 emoji),可能溢出。必须组合使用:
article {
width: 100%;
max-width: 65ch; /* 主要限制 */
margin: 0 auto;
box-sizing: border-box;
}
-
width: 100%保证在小屏下占满可用空间 -
max-width: 65ch是关键:在中大屏上封顶为约 65 字宽度,提升可读性 - 务必加
box-sizing: border-box,否则 padding/border 会额外增加总宽 - 避免和
vw混用(如max-width: calc(80vw - 20ch)),计算逻辑易失控且无必要
常见翻车点:字体、空格与全角字符
ch 的值完全由当前生效的 font-family 决定,以下情况会导致“标称 50ch,实际撑不满或溢出”:
- 未显式声明
font-family,浏览器回退到默认字体(如 macOS 的 San Francisco、Windows 的 Segoe UI),"0"宽差异可达 ±15% - 文本含大量中文/日文/韩文:全角字符通常 ≈ 2ch 宽,所以
50ch容器实际只能塞约 25 个汉字 - 段首缩进用
text-indent: 2ch时,若字体加载失败回退,缩进会突变 - 空元素或纯空格内容下,
ch计算可能失准——确保有真实文本锚点(哪怕)
配合 calc() 做弹性侧边栏或留白
ch 和 calc() 是绝配,适合构建“固定字符宽度 + 弹性剩余空间”的布局:
.sidebar { width: 20ch; }
.main { width: calc(100% - 20ch); }
- 比写死
200px更健壮:字号放大时,侧边栏文字不挤、主区不破版 - 注意:不要在
calc()中混用单位类型(如calc(100% - 20px)可以,但calc(100% - 20ch - 1em)易因字体加载顺序导致重绘抖动) - 多语言站点建议把
ch值存为 CSS 变量,方便按语种微调:--line-width: 55ch;→max-width: var(--line-width);
真正难控的从来不是 ch 的计算逻辑,而是你没意识到:它只管“0”的宽度,不管“我”想塞什么字。中英混排、字体加载时机、用户自定义样式表——这些才是让 65ch 有时像 50、有时像 80 的真实变量。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











