:first-child精准匹配父元素的第一个子元素,要求必须是或的首个子节点;若存在注释、空格文本节点或其他标签则失效;与:nth-child(1)效果一致但语义更明确。

用 :first-child 设置列表第一项样式最直接
只要第一项确实是父元素的第一个子元素,:first-child 就能精准命中。常见于 或 下紧接 的结构。
注意:它匹配的是「第一个子元素」,不是「第一个 在标准列表中, 单独加粗、变色、去点、加图标都可直接写。关键是别漏掉选择器权重或继承干扰。 立即学习“前端免费学习笔记(深入)”; 最常见的原因是 DOM 结构不符合预期。打开浏览器开发者工具,逐层检查元素的「实际子节点」列表,看第一个是不是你认为的 li」。如果列表前面有注释、空格文本节点(在 HTML 中通常被忽略),或意外插入了其他标签(比如 :first-child 就会失效。
是 或 的第一个子节点 前写 HTML 注释或换行导致的空白文本节点(现代浏览器大多忽略纯空白,但保险起见可删掉):first-of-type 替代——它按标签类型匹配,虽更宽松,但语义不如 :first-child 明确
:first-child 和 :nth-child(1) 有区别吗li:first-child 和 li:nth-child(1) 效果完全一致,都只选中第一个 子元素。但底层逻辑不同:
:first-child 是 :nth-child(1) 的语法糖,性能无差异:nth-child(2n) 更连贯 + :nth-child(1) 仍只看位置,和 :first-child 行为一致;真正需要区分时得用 :nth-of-type()
实际 CSS 写法和容易忽略的细节
ul li:first-child {
font-weight: bold;
color: #2563eb;
list-style-type: none;
}
ul li:first-child::before {
content: "★ ";
color: #f59e0b;
}
list-style: none 全局重置,:first-child 里再设 list-style-type: disc 不会恢复原点——因为已被父级覆盖,需用 list-style: inherit 或显式还原::before 插入内容时,注意 display 默认是 inline,若想垂直居中,需配合 line-height 或 vertical-align
:first-child 依然有效,但若用 order 属性调整了渲染顺序,伪类仍按 DOM 顺序匹配,不是视觉顺序当
:first-child 不生效时先查什么。
CSS 伪类看似简单,但 → 查看其父节点的 childNodes(在 Console 中输入 $0.parentNode.childNodes)Text)、注释节点(Comment)或服务端注入的占位符v-if / 条件渲染导致第一个 li 实际上不是首个子节点ul *:first-child { outline: 2px solid red; },看红框套在谁身上:first-child 的“第一”永远绑定在 DOM 树结构上,而不是你肉眼看到的渲染结果。结构一变,样式就断——这点比 JS 逻辑更容易被忽略。










