应优先用text-indent: 2ch实现两个中文字符缩进,因其基于“0”字宽更接近汉字宽度;若需兼容IE,则回退text-indent: 2em并锁定字体与字号。

text-indent: 2em 为什么缩进不是刚好两个中文字符?
因为 em 是相对单位,取决于当前字体的 font-size 和字体本身的度量设计。多数中文字体里,一个汉字的宽度 ≈ 1em,但并非绝对——比如在 font-size: 16px 下,SimSun 可能接近 16px 宽,而 Microsoft YaHei 或 Noto Sans CJK 因字重、字宽差异,实际宽度可能略大于或小于 1em。所以 text-indent: 2em 在多数场景下“看起来像两个汉字”,但不保证像素级精准。
想严格缩进两个中文字符,该用什么值?
最稳妥的方式是用 ch 单位(character width),它基于 “0” 字符的宽度,在等宽字体中等于一个汉字宽;但在非等宽中文字体中,ch 仍较接近汉字平均宽度,实测兼容性与准确性优于 em:
p {
text-indent: 2ch;
}
注意:ch 在 IE 中完全不支持,如需兼容 IE,可回退到 em 并配合字体锁定:
- 强制指定一个已知表现稳定的中文字体,如
font-family: "Microsoft YaHei", sans-serif; - 固定
font-size(避免继承缩放干扰) - 再设
text-indent: 2em,此时缩进偏差通常在 ±0.1em 内,肉眼难辨
text-indent 对 inline 元素或 flex 子项无效?
text-indent 只作用于块级容器(display: block、table-cell 等)的**第一行文本**。以下情况会失效:
立即学习“前端免费学习笔记(深入)”;
- 元素是
display: inline或inline-block—— 需先设display: block - 父容器是
display: flex且子项未显式设宽/换行,文本可能被压缩或溢出,导致首行不可见 - 段落内含
<span></span>或图标等inline元素顶格写,可能“吃掉”缩进空间(浏览器渲染时把缩进应用在第一个 inline 盒子前,但若该盒子有 margin/padding,视觉上就偏了)
缩进后行尾文字被截断或换行异常?
这是 text-indent 和 white-space、word-break 协同问题。常见诱因:
-
white-space: nowrap强制单行,缩进后内容超容器宽度直接溢出 -
word-break: keep-all+ 英文长单词,可能让首行撑宽,缩进显得“不够” - 容器
width过小,且未设box-sizing: border-box,padding/border 挤占可用宽度,加剧换行错乱
建议检查并统一设置:
p {
text-indent: 2ch;
word-break: break-word;
overflow-wrap: break-word;
box-sizing: border-box;
}
真正难处理的是混排场景:一段里既有中文、英文、数字、Emoji,又用了变体字体或 WebFont 加载延迟——这时缩进的“两个字符”感知会浮动,得靠视觉回归测试,而不是依赖某个固定数值。


















