:nth-child(n)匹配父元素下第n个子元素且类型符合,不跳过非目标兄弟;:nth-of-type仅按标签名计数;CSS无原生“第n个某class”选择器,需用data属性、JS或结构优化实现。
很多人写 div:nth-child(2) 是想选中第二个 div,但实际它匹配的是“父元素下第 2 个子元素,且该子元素是 div”。如果第 2 个子元素是 p,那这个选择器就什么也不选中。
常见错误现象:
.item:nth-child(3) { color: red; }结果没生效——因为父容器的第 3 个子节点可能是文本节点、注释,或者一个 span,根本不是 .item。
:nth-of-type(仅适用于有标签名的场景)或 JavaScript 补位:nth-of-type 只认 HTML 标签名(如 div、p),不认 class。所以 .btn:nth-of-type(2) 和 .btn:nth-of-type(1) 都无效——除非你所有 .btn 恰好都是同一标签,比如全是 button,那可以写 button.btn:nth-of-type(2)。
但更常见的情况是混合标签:
A这时
B
C
.tag:nth-of-type(2) 匹配不到 ,因为 是它所在父级的第 1 个 em,不是第 2 个。

:nth-child(An+B of S) 语法(如 :nth-child(2 of .item))目前仅 Safari 15.4+ 和 Chrome 120+(需 flag)支持,无法全平台使用面对“只给第三个 .card 加边框”这种需求,推荐按兼容性从高到低排序:
data-index:然后写
[data-index="3"] { border: 1px solid #ccc; }
document.querySelectorAll('.card').forEach((el, i) => {
el.dataset.nth = i + 1;
});再用 .card[data-nth="3"]
.group,再用 .group:nth-child(n) .card:last-child 等组合定位打开开发者工具 → Elements 面板 → 点击目标元素 → 在 Styles 面板里看对应规则是否被划掉(strikethrough)。如果被划掉,说明选择器没命中;如果没划掉但样式没体现,检查是否被更高优先级规则覆盖。
快速验证技巧:
nth-child 改成 nth-child(1),看第一个子元素是否响应——能则说明语法没问题,问题出在序号逻辑$$('.target-class') 看 NodeList 顺序,再对照 DOM 树数真实位置最常被忽略的一点:伪类选择器对文本节点、注释节点完全透明,但它们会计入 :nth-child 的序号。哪怕只是两行 HTML 之间多了一个换行,也可能让序号偏移 1。