前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
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 :only-child :only-of-type
CSS层叠与选择器

only-child 和 only-of-type 分别在什么条件下匹配?

:only-child 匹配没有任何兄弟元素的子元素,等价于 :first-child:last-child。:only-of-type 放宽了条件,只要求同类型的兄弟里没有第二个就行,可以有其他类型的兄弟。

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

两个伪类各看什么

  1. :only-child父元素只有这一个子元素时匹配
  2. :only-of-type父元素里同类型标签只有它一个时匹配
  3. 等价拆写:only-child = :first-child:last-child

纯文本节点不是元素节点,不影响这两个伪类的判断。一个 <div> 里同时有文本和一个 <span>,这个 <span> 仍然匹配 :only-child。

核心回答

先记住这个答案

:only-child 匹配的是父元素里唯一的子元素。如果有任何兄弟元素,不管什么类型,都不匹配。:only-of-type 宽松一些,只看同标签类型的兄弟,有其他类型的兄弟没关系。比如一个 <div> 里有一个 <span> 和一个 <p>,<span> 不匹配 :only-child(因为有兄弟 <p>),但匹配 span:only-of-type(因为 <span> 类型只有它一个)。

  • :only-child 要求零个兄弟
  • :only-of-type 只看同标签类型
  • :only-child 等价于同时满足首尾
  • 文本节点不算兄弟元素

用一个例子看清区别

假设页面上有一个卡片组件,内容区域有时只有一段文字,有时既有标题又有文字。对单段文字的情况,想让它居中显示;有标题时保持正常排版。这正好用 :only-child。

单个子元素时居中CSS
/* 只有一个子元素时让它居中 */
.card-body > :only-child {
  text-align: center;
  margin: auto;
}

/* 有标题和段落两个子元素时,标题左对齐 */
.card-body > h3 {
  text-align: left;
}

如果 .card-body 里只有一个 <p>,它匹配 :only-child,文字居中。如果同时有 <h3> 和 <p>,两个元素都不是唯一的子元素,:only-child 对谁都不生效。

什么时候该用 only-of-type

:only-of-type 的典型场景是父元素里混了不同标签。比如一个列表项里有图标和文字两部分,图标是 <img>,文字是 <span>。想在没有图标时让文字撑满整行,可以用 span:only-of-type——因为它只看 <span> 类型的兄弟数量,不管有没有 <img>。

没有同类型兄弟时生效CSS
/* 列表项里只有一个 span 时撑满宽度 */
.list-item span:only-of-type {
  display: block;
  width: 100%;
}

即使 .list-item 里还有一个 <img>,只要 <span> 只有一个,这条规则就生效。换成 span:only-child 的话,有 <img> 在就不匹配了。 这里有个容易忽略的点::only-of-type 看的是 HTML 标签类型,不是 CSS 类名。两个 <span> 即使类名不同,也互为同类型兄弟,让 :only-of-type 失效。

回答前,多想一步

容易答错的地方

以为文本节点也算兄弟
一个 <div> 里写了一段文字加一个 <span>,很多人以为 <span> 有个文本兄弟所以不匹配 :only-child。其实文本节点不是元素节点,:only-child 只数元素,所以 <span> 仍然匹配。要判断有没有文本节点在旁边,只能用 JavaScript。
以为 only-of-type 看的是类名
:only-of-type 对比的是标签名,比如 <div>、<span>、<p>,不是 .active、.item 这类类名。两个 <span class="a"> 和 <span class="b">,虽然类名不同但标签相同,:only-of-type 不会匹配其中任何一个。
试着用自己的话回答

面试官还会怎么问?

only-child 等价于哪两个伪类的组合?

:only-child 等价于 :first-child:last-child。只有同时是第一个又是最后一个子元素,才说明没有其他兄弟。同理 :only-of-type 等价于 :first-of-type:last-of-type。

动态增删子元素时,only-child 会实时更新吗?

会。CSS 伪类是根据当前 DOM 状态实时匹配的。如果用 JavaScript 往父元素里插入了一个新的子元素,原来匹配 :only-child 的元素会立刻失去匹配,浏览器会重新计算样式。

怎么选中恰好有两个子元素时的第一个?

用 :first-child:nth-last-child(2) 可以做到。:nth-last-child(2) 表示从末尾数第二个,如果第一个子元素同时也是倒数第二个,说明一共恰好两个。这是结构伪类组合使用的经典技巧。

从一道题,走向一组知识

把知识连起来

层叠与选择器

遇到浏览器不支持的伪类或伪元素怎么降级处理?

:only-child 兼容性好,但老版本 IE 不支持 :only-of-type,需要准备降级写法。

层叠与选择器

indeterminate 伪类什么时候生效?除了复选框还能用在哪?

:indeterminate 也是根据元素状态匹配,和结构伪类的触发方式不同,可以对比理解。

参考资料

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

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

本题目录
  1. 先记住这个答案
  2. 用一个例子看清区别
  3. 什么时候该用 only-of-type
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

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

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