text-indent仅作用于块级元素首行,实现悬挂缩进需组合padding-left与负text-indent(如padding-left: 2em; text-indent: -2em)或用p::first-line重置首行缩进。

用 text-indent 只对第一行生效,不是你想要的
很多人试过 text-indent,发现它只缩进第一行,后续换行依然顶格——这是 CSS 的标准行为,text-indent 本意就是「段首缩进」,不是「从第二行起缩进」。真要实现第二行开始缩进,得绕开这个语义限制。
用 padding-left + text-indent 负值组合实现
核心思路:先整体左移第一行(用负 text-indent),再用 padding-left 把整个段落拉回来,这样第一行被抵消掉,而第二行及以后就自然露出缩进效果。
示例:
p {
padding-left: 2em;
text-indent: -2em;
}
注意点:
-
padding-left和text-indent绝对值必须相等,否则会错位或留白异常 - 如果段落内有
<span></span>或其他内联元素,它们也会被一起左移,需额外重置margin-left或position - 在 flex 或 grid 容器中,
text-indent可能失效,此时得改用::first-line伪元素覆盖
用 ::first-line 伪元素把第一行「拉回原位」
更干净的做法:默认让所有行缩进,再单独把第一行设为不缩进。
示例:
p {
text-indent: 2em;
}
p::first-line {
text-indent: 0;
}
但要注意:
-
::first-line只作用于视觉上的第一行,如果第一行被br或换行符提前截断,它仍按渲染后的首行匹配 - 不能给
::first-line设display、margin、padding等布局属性,仅支持字体、颜色、文本装饰类样式 - 某些旧版 Safari 对长单词折行时的
::first-line行判定不稳定
遇到中文排版要特别小心字宽和换行
中文字体没有固定字宽,浏览器换行逻辑受 word-break、white-space 影响极大。比如:
- 默认
white-space: normal下,标点可能被挤到行首,导致「第二行」实际是半句话,缩进位置看起来偏移 - 若用了
word-break: break-all,英文单词会被硬切,第一行变短,::first-line缩进容易误判 - 推荐加一句
line-height: 1.6;配合缩进,避免行高过小让缩进视觉上被压缩
真正难的不是写那两行 CSS,而是缩进后要不要对齐标点悬挂、要不要适配不同字号下的 em 计算精度、以及是否要兼容屏幕阅读器对缩进内容的朗读逻辑——这些细节往往在验收时才冒出来。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











