:not(:first-child)只匹配父元素首个子节点之后的同级元素,易受注释、空格等文本节点干扰;稳定方案是:nth-of-type(n+2),它仅统计同类元素序号,忽略其他标签。

直接用 :not(:first-child) 就行,但得注意它只匹配「同级中第一个」,不是「父容器里第一个 div」或「第一个带某 class 的元素」——这点容易误判。
为什么 :not(:first-child) 有时不生效
它判断的是元素是否为其父元素的「首个子节点」,和标签名、class 无关。比如:
- A
- C
B
这里第二个 <li> 是第 3 个子节点,li:not(:first-child) 会选中它;但若把 <p></p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/code/12093" title="CSS婚礼策划服务机构宣传网站模板"><img
src="https://img.php.cn/upload/webcode/000/000/018/178607072210981.jpg" alt="CSS婚礼策划服务机构宣传网站模板" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/code/12093" title="CSS婚礼策划服务机构宣传网站模板" class="overflowclass">CSS婚礼策划服务机构宣传网站模板</a>
<p class="overflowclass">CSS婚礼策划服务机构宣传网站模板是一款适合提供婚礼策划和婚庆服务机构宣传网站模板下载。提示:本模板调用到谷歌字体库,可能会出现页面打开比较缓慢。</p>
</div>
<a rel="nofollow" href="/xiazai/code/12093" title="CSS婚礼策划服务机构宣传网站模板" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div> 换成注释或文本节点(如空格换行),:first-child 可能被那个节点占位,导致第一个 <li> 也不再匹配 :first-child,整个逻辑就乱了。
- 确保目标元素确实是其父元素的直接子元素,且没有前置兄弟(包括文本节点)
- 如果结构不可控,优先改用
:nth-child(n+2)或:nth-of-type(n+2) -
:nth-of-type(n+2)更安全:它只数同类型元素,忽略其他标签
:nth-child(n+2) 和 :nth-of-type(n+2) 的区别
两者都从第 2 个开始匹配,但计数逻辑不同:
-
div:nth-child(n+2):要求该div是父元素的第 2、3、4… 个子元素(不管前面是什么) -
div:nth-of-type(n+2):只要它是父元素中第 2 个及以后的div,前面有p、span都不影响 - 若父容器混排多种标签,且你只想跳过第一个
div,用:nth-of-type - 若必须严格按 DOM 顺序(比如网格布局中位置即序号),用
:nth-child
用兄弟选择器快速跳过第一个
相邻兄弟选择器 + 和通用兄弟选择器 ~ 也能达成类似效果,但适用场景更窄:
-
.item + .item:只选紧挨在第一个.item后面的那个,不是全部 -
.item ~ .item:选第一个.item后面所有同级.item,但前提是第一个.item必须存在且是直接前驱 - 它们不依赖索引,对动态增删元素更鲁棒,但无法处理「第一个元素被
display: none」的情况——因为被隐藏的元素不参与兄弟关系匹配
最常踩的坑是以为 :not(:first-child) 能跨类型“找第一个同类”,其实不能;真正稳定的做法是明确使用 :nth-of-type(n+2),尤其当父容器内有混合节点时。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










