ch单位等于当前字体和字号下数字“0”的宽度,等宽字体中约等于一个英文或数字宽,但中文或比例字体中不精确;它用于布局控制而非字符计数。

ch 单位不能精确统计每行字符数,只能近似控制行宽;它不是计数工具,而是基于“0”字宽度的布局单位。
ch 单位到底等于什么
1ch 永远等于当前 font-family 和 font-size 下数字 "0" 的宽度(不是高度,也不是平均字符宽)。在等宽字体(如 monospace、Consolas)中,1ch ≈ 1 个英文/数字宽度;但遇到中文、全角符号或比例字体(如 system-ui),1ch 可能只够塞下半个汉字,或能并排 2 个细字母。
常见误判点:
- 以为
max-width: 40ch就能保证每行正好 40 个字符——实际取决于内容字符的字形宽度分布 - 在
font-family: "PingFang SC", sans-serif下用 ch 做打字动画,结果跳帧错位——因为中文比例字体里"0"宽 ≠"我"宽 - 设了
width: 10ch但容器内只放空格,渲染出的宽度可能异常小——ch 计算依赖字体度量,空内容时浏览器可能 fallback 到默认字体度量
什么时候该用 ch,什么时候不该用
适合场景:
- 给代码块、终端输出、日志列表设固定视觉宽度:
max-width: 80ch+font-family: monospace - 做打字动画,且文本纯英文/数字:
width: 0ch → 24ch+steps(24, end) - 响应式表单标签对齐,避免换行错乱:
label { min-width: 12ch; }
不适合场景:
- 需要精确截断或统计每行中文字符数(比如做「每行 28 字」的新闻摘要)
- 内容混合中英文、emoji、全角标点,又要求严格等宽显示
- 父容器
font-size动态变化(如通过 JS 切换主题字号),但未同步重算 ch 值
ch 配合 overflow 和 white-space 的关键组合
单独设 width: 30ch 不会自动换行,必须配合文本换行逻辑:
- 要让文字自然折行:确保没写
white-space: nowrap,且容器有明确宽度(max-width: 30ch更安全) - 要隐藏溢出文字并加省略号:
overflow: hidden+text-overflow: ellipsis+white-space: nowrap——但此时 ch 控制的是整行总宽,不是“每行” - 打字动画必须加
overflow: hidden,否则未动画到的字符会直接撑开容器 - 别把
ch和clip-path混用:Safari 对clip-path+ch支持极差,动画会失效
兼容性与动态内容的坑
现代浏览器(Chrome 50+、Firefox 41+、Safari 9.1+、Edge 79+)都支持 ch,但要注意:
- IE 完全不支持,如果项目需兼容 IE11,得用 JS 回退方案(如测
"0"实际像素宽再换算) - 用 JS 动态插入文本后,若字符数变化,
steps(N, end)中的N必须同步更新——硬编码steps(15, end)会导致新文本动画卡顿或漏字 - 服务端渲染(SSR)页面若初始无字体加载完成,ch 计算可能按 fallback 字体执行,导致首屏布局偏移(FOIT/FOUT 影响)
最常被忽略的一点:ch 的精度完全绑定于字体度量,而字体加载是异步的。如果你在 @font-face 加载完成前就依赖 ch 做宽度判断或动画启动,结果大概率不准。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











