:first-child 在 inline 元素上“看似不起作用”实则有效,根本原因是 html 空白符生成的文本节点成为父元素首个子节点,导致 inline 元素无法匹配;可通过开发者工具验证、改用 :first-of-type 或块级包装解决。
为什么 :first-child 在 inline 元素上“看似不起作用”
它其实起作用了,只是你观察的视觉效果没变——:first-child 匹配的是 DOM 树中父元素的第一个子节点,和 display 类型无关。问题常出在:你给一个 <span></span> 或 <a></a> 加了 color: red;,却发现它没变红,而同级前面明明没有其他元素。
真实原因通常是:父容器里存在空白文本节点(换行、缩进、空格)。HTML 解析时,这些空白会生成 Text 节点,成为父元素的第一个子节点,导致你的 inline 元素变成第二个子节点,自然不匹配 :first-child。
验证是否被空白文本节点干扰
打开浏览器开发者工具,选中父元素 → 切到 “Elements” 面板 → 展开看子节点。如果第一个是 #text(内容为空或只含换行符),那这就是元凶。
解决思路不是强行改选择器,而是消除干扰源或调整匹配逻辑:
立即学习“前端免费学习笔记(深入)”;
- 删掉 HTML 中父元素开始标签和第一个子元素之间的换行与空格(不现实,可读性差)
- 用
:first-of-type替代 —— 它只看元素类型,忽略文本节点 - 把 inline 元素包裹进一个块级容器(如
<div>),再对这个容器应用样式逻辑稳定控制样式<h3>用块级包装 + <code>:first-child
这是最可控、语义清晰的做法:把一组 inline 元素统一包进一个块级容器,再让该容器成为父元素的首个子元素。
<nav> <div class="nav-group"> <a href="#">首页</a> <a href="#">关于</a> <a href="#">联系</a> </div> </nav>此时你可以安全地写: