应使用 p:nth-of-type(2n) 选偶数段落,因其仅统计 p 元素自身序号,不受其他兄弟元素干扰;text-indent 推荐用 em 单位以适配字体大小,奇偶对齐还需统筹 margin、line-height 及结构容错,必要时回退至类名方案。

用 :nth-child(2n) 选偶数段落,但得小心父容器干扰
直接写 p:nth-child(2n) 看似合理,实际常失效——因为 :nth-child 是按父元素下所有子元素统一编号的。如果 <p></p> 前面有 <h2></h2>、<div> 或注释节点,段落序号就错乱了。
<p>稳妥做法是确保 <code><p></p> 是父容器内**连续、无间断**的子元素;否则改用 :nth-of-type:
p:nth-of-type(2n) {
text-indent: 2em;
}
p:nth-of-type(2n-1) {
text-indent: 0;
}
这样只统计 <p></p> 标签本身,不受其他兄弟元素影响。
text-indent 缩进值别硬写固定像素
缩进量要适配字体大小和阅读节奏,用相对单位更健壮:
- 优先用
em:比如text-indent: 2em,表示缩进两个当前字号宽度 - 避免
px:响应式场景下字号变化时,像素缩进会显得过小或过大 - 慎用
rem:除非你明确希望缩进跟随根字号而非段落自身字号
如果需要精确控制(如对齐到网格),可结合 ch 单位:text-indent: 4ch 表示缩进约 4 个 “0” 字符宽,适合等宽字体排版。
奇偶段落对齐 ≠ 仅靠 text-indent
“对齐排版”常被误解为只是首行缩进差异,其实还涉及行高、间距、边距一致性:
- 奇数段落虽不缩进,但需确认
margin-top是否被重置(尤其在 CMS 输出中,段落自带默认外边距) - 偶数段落缩进后,若内容含列表或代码块,可能因
text-indent影响子元素布局——它只作用于第一行,不影响内部<ul></ul>或<pre class="brush:php;toolbar:false;"></pre> - 如需整体右移(非仅首行),该用
padding-left或margin-left,而非text-indent
真正干净的奇偶区分,往往要配合类名控制:<p class="para-even"></p> 比纯 CSS 选择器更可控,尤其当 HTML 结构不可控时。
IE 不支持 :nth-of-type?那就退到类名方案
:nth-of-type 在 IE9+ 支持,但 IE8 及更早版本完全不识别。如果必须兼容老 IE:
- 服务端渲染时动态加
class="odd"/class="even" - 前端用 JS 补充(仅针对老浏览器):
document.querySelectorAll('p').forEach((p, i) => p.classList.add(i % 2 === 0 ? 'odd' : 'even')) - CSS 写成
.odd { text-indent: 0; } .even { text-indent: 2em; }
纯 CSS 方案在现代浏览器里很稳,但一旦涉及 CMS、富文本编辑器或第三方嵌入内容,结构不确定性就会暴露——这时候类名不是妥协,是预留的逃生通道。











