前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库CSS :first-child vs :first-of-type
CSS层叠与选择器

:first-child 和 :first-of-type 选中的元素有什么不同?

:first-child 要求元素是父元素的第一个子节点,不分标签类型。:first-of-type 只看同类型兄弟的排行,前面有其他标签不影响。比如父元素里先放了 <h2> 再放 <p>,用 p:first-child 选不中,但 p:first-of-type 能选中。

前端进阶之旅 · 一题精讲更新于 2026.09.29
CSS#层叠与选择器
先看核心答案读代码示例
理解线索

两种"第一个"的判定逻辑

  1. :first-child在所有兄弟节点中排第一才命中,不管标签类型
  2. :first-of-type在同类型兄弟中排第一就命中,其他类型不参与排名
  3. 组合写法p:first-child 要求既是 <p> 又排第一,两个条件同时满足

:last-child 和 :last-of-type 的区别完全一样,只是看最后一个。面试常考的坑是父元素里第一个子节点不是你期望的标签。

核心回答

先记住这个答案

:first-child 看的是元素在所有兄弟节点中的位置——只有排在第一个的才匹配。:first-of-type 看的是元素在同类型兄弟中的位置——只要是同标签里的第一个就匹配,前面有没有其他类型的元素不影响。这个区别在 HTML 结构里混合了多种标签时最容易暴露。

  • :first-child 看所有兄弟的排行
  • :first-of-type 只看同类型兄弟
  • 前面插不同标签会破坏 :first-child
  • 两者优先级相同,都算一个伪类

混合标签时两者的选择差异

做个实验就清楚了。在一个 <div> 里先放一个 <h2>,再放一个 <p>。因为 <p> 不是父元素的第一个子节点,p:first-child 选不中它;但 <p> 是同类型兄弟里的第一个(前面没有其他 <p>),所以 p:first-of-type 能选中。

同一个父元素里 <h2> 在 <p> 前面HTML
<style>
  /* 选不中:第一个子节点是 h2,不是 p */
  p:first-child { color: red; }
  /* 能选中:p 是第一个 <p> 类型的兄弟 */
  p:first-of-type { background: lightyellow; }
</style>

<div>
  <h2>标题</h2>
  <p>这段文字会有黄色背景,但不会变红</p>
  <p>第二段</p>
</div>

去掉 <h2>,让 <p> 成为第一个子节点,p:first-child 和 p:first-of-type 就同时命中了。所以两者在只有一种标签的结构里表现完全一样,区别只在混合标签时才显现。

实际开发中踩坑最多的场景

CMS 或后端模板经常在列表前面自动插入标题、广告位或隐藏的标记元素。比如你用 li:first-child 给列表第一项加圆角,结果运营在 <ul> 里第一个位置插了一个 <div> 广告,第一个 <li> 不再是 :first-child 了,圆角就丢了。

改用 :first-of-type 更稳
这时换成 li:first-of-type 就安全了,不管前面插了几个其他标签,第一个 <li> 始终能被选中。不过要注意,:first-of-type 是按标签名判断的,不是按 class。同一个父元素下的 .card:first-of-type 实际上匹配的是第一个和 .card 同标签的元素,而不是第一个带 .card 类名的元素。 用 JavaScript 动态插入 DOM 节点时也一样。用 insertBefore 在列表开头插入新节点后,原来匹配 :first-child 的元素立刻失效,而 :first-of-type 只要新插入的不是同类型标签就不受影响。
回答前,多想一步

容易答错的地方

以为 :first-of-type 是按 class 筛选的
.card:first-of-type 不是"第一个 .card",而是"第一个与 .card 元素同标签的元素,并且它还得有 .card 类"。如果父元素下有两个 <div>,第一个没有 .card 类而第二个有,:first-of-type 命中的是第一个 <div>,但它没有 .card 类,所以 .card:first-of-type 谁也选不中。
混淆 :first-child 和 :nth-child(1)
两者完全等价,:first-child 就是 :nth-child(1) 的简写。但 :first-of-type 和 :nth-of-type(1) 才是另一对等价写法,不要把 :nth-child 和 :nth-of-type 搞混了。
试着用自己的话回答

面试官还会怎么问?

怎么选中"第一个带某个 class 的元素"?

纯 CSS 没有"第一个匹配某 class 的元素"这种选择器。:first-of-type 是按标签名分组的,不看 class。一种变通方式是先给所有同 class 元素设默认样式,再用相邻兄弟选择器 .card ~ .card 把第二个及以后的覆盖掉,这样视觉上只有第一个保留特殊样式。

:first-child 在 <table> 里表现如何?

<table> 的直接子元素通常是 <thead> 和 <tbody> 等,不是 <tr>。写 tr:first-child 时,它匹配的是每个 <thead> 或 <tbody> 里的第一个 <tr>,不是整个表格的第一行。

用 :first-child 和 :first-of-type 写出来的选择器优先级一样吗?

一样。两者都是伪类,优先级都算 (0, 1, 0),和一个 class 选择器等权。要区分优先级高低还是得靠 id 选择器或者层叠顺序。

从一道题,走向一组知识

把知识连起来

动画与视觉

动画暂停期间修改了 @keyframes,恢复播放后表现会变吗?

:first-child 的匹配随 DOM 结构变化而变化,动画暂停后改关键帧也是"状态变了结果跟着变"的典型问题。

动画与视觉

animationstart、animationend、animationiteration 这三个事件分别在什么时候触发?

伪类选择器和动画事件都涉及精确的触发条件,理解了 :first-child 的判定规则后可以类比 animationstart 的触发时机。

参考资料

  • CSS:层叠与选择器参考资料

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 混合标签时两者的选择差异
  3. 实际开发中踩坑最多的场景
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑