p标签默认无首行缩进,需用text-indent:2em;但display非block、flex/grid容器、开头有空白或替换元素、!important覆盖、white-space/rtl等会导致失效;td中应改用padding-left。

HTML 的 p 标签本身不带缩进,也不“自带”任何样式 —— 它默认只有浏览器内置的 margin(上下边距),text-indent 为 0。 想要首行缩进两个汉字,必须显式加 CSS:text-indent: 2em。别指望写个 就自动空两格。
为什么直接写 p { text-indent: 2em; } 有时没效果
不是代码错了,是渲染前提被悄悄破坏了:
-
p被设成display: inline或inline-block:浏览器根本不识别“首行”概念 - 父容器是
display: flex或display: grid:flex item 默认不触发块级格式化上下文,text-indent失效 -
p开头有换行、空格或内联替换元素(比如):缩进会作用在这些内容左侧,视觉上等于没动 - 某处写了
p { text-indent: 0 !important; }(常见于富文本编辑器输出) -
white-space: nowrap或direction: rtl:前者让“首行”失去意义,后者会让缩进向右跑
最快验证方式:打开开发者工具 → Computed 面板 → 看 text-indent 最终值是不是 2em,且 display 是 block。
text-indent 在表格单元格(td/th)里不生效怎么办
td 默认是 display: table-cell,它不生成标准“首行盒”,尤其内容短、未换行时,text-indent 基本不可靠。
- 最稳妥方案:
td, th { padding-left: 2em; }—— 不依赖行盒,所有浏览器都认 - 若必须保留语义(比如导出 PDF 要匹配印刷规范):用包裹 ,内容
- 调试技巧:临时给
td加background: #ff0,看文字是否真偏移;如果背景框里文字还贴左,说明text-indent没触发,立刻切到padding-left统一缩进但要排除首段、标题、引用等特殊情况
全局设
p { text-indent: 2em; }很方便,但中文排版中例外极多:- 首段不缩进:
.content p:first-child { text-indent: 0; margin-top: 0; }(注意连margin-top一起清,否则视觉压迫感强) - 引用段落反向缩进:
blockquote p { text-indent: -1em; padding-left: 1em; }(负缩进 + 左内边距防溢出) - 标题类段落(如
):p.title { text-indent: 0; } - 避免用
:not()写复杂选择器 —— CSS 优先级易失控;宁可显式加类,再单独重置
真正难的不是写对那行
text-indent: 2em,而是确认它在所有上下文里都按预期工作:Flex 容器里、富文本输出的 HTML 里、打印预览里……每个环境都可能悄悄绕过这个属性。动手前先盯紧 Computed 面板,比反复试数值管用得多。 - 调试技巧:临时给
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











