text-indent默认值为0,无天然缩进;失效主因是元素非块级(如inline)、父容器为flex/grid、首行含内联替换元素、white-space干扰或高权重样式覆盖,推荐用2em单位并用开发者工具验证computed值。

HTML段落本身没有“默认缩进”,text-indent 默认值是 0;你看到的所谓“缩进”其实是视觉错觉或外部样式干扰,真正要改的是你主动加上的那个 text-indent 值。
为什么改了 text-indent 却没反应
不是代码写错了,而是浏览器压根没按你预期渲染首行:
-
display被设成inline或inline-block——text-indent只对块级盒(display: block)生效 - 父容器用了
display: flex或display: grid,且没触发 BFC,导致子<p>的块级行为被降级 - 段落开头是
<img>、<svg>这类内联替换元素,缩进发生在它左边,看起来像“没动” - 某处样式写了
p { text-indent: 0 !important }(富文本编辑器输出常见) -
white-space: nowrap或white-space: pre破坏了换行,“首行”概念失效
最快验证方式:打开开发者工具 → 找到目标 <p> → 切到 Computed 标签页 → 看 display 是不是 block,且 text-indent 最终计算值不是 0。
text-indent 单位选错会导致“缩进不对劲”
单位决定缩进是否随字体/缩放自适应,选错就等于白调:
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
立即学习“前端免费学习笔记(深入)”;
- 用
2em:最稳妥。1em = 当前font-size,缩进始终≈两个汉字宽,系统放大、DPI 变化时仍自然 - 用
2ch:语义更准(1ch ≈ 字符 “0” 宽度),但 IE 不支持,且多数中文字体里 1ch 远小于一个汉字 - 避免
32px或20px:固定像素,在高 DPI 屏或用户 zoom 到 150% 时,缩进会明显变窄 - 别用
2%:按父容器宽度算,窄屏下可能只剩几像素,完全不够两格 - 慎用
2rem:若项目用 JS 动态改html { font-size }(比如夜间模式),缩进会意外跳变
表格里 <td> 的 text-indent 经常失效
<td> 默认是 display: table-cell,浏览器对它的首行盒生成很保守,尤其在单行未换行时:
- 直接加
padding-left: 2em更可靠 —— 不依赖“首行”概念,所有浏览器都认 - 如果必须保留语义(比如导出 PDF 需要首行缩进),就包一层
<div>:<td><div style="text-indent: 2em">内容</div></td> - 注意
text-align: center或right会把缩进后的文字再拉回,看起来像没缩进
首段不缩进怎么安全跳过
导语、标题后第一段通常需要视觉起始感,硬写全局 text-indent: 0 容易漏掉或冲突:
-
p:first-of-type { text-indent: 0; }:适合结构固定、首段总在最前的页面(如博客正文) -
.intro p:first-child { text-indent: 0; }:更精准,只作用于特定容器下的第一个<p> - 别只清
text-indent,顺手把顶边距也去掉:p:first-of-type { text-indent: 0; margin-top: 0; },避免顶部多出空白
真正难的不是设数值,而是确认这个值在各种布局、字体、缩放和设备下都稳定生效——text-indent 表面简单,背后全是渲染条件博弈。


















