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

nth-child 的 an+b 公式是怎么计算的?

把 n 从 0 开始依次代入公式 An+B,算出来的正整数就是被选中的元素序号。比如 :nth-child(2n+1) 代入 n=0,1,2… 得到 1,3,5…,选中的就是所有奇数位置的子元素。

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

公式里的两个数各管什么

  1. A(周期)每隔几个选一个,2 就是隔一个选一个
  2. B(起点)从第几个开始选,1 就是从第一个开始
  3. n(计数器)自动从 0 递增,代入后算出所有命中的序号

公式算出的序号从 1 开始对应子元素,0 和负数会被忽略。所以 -n+3 并不会选到负数位置,只选 3、2、1。

核心回答

先记住这个答案

:nth-child(An+B) 的计算方式是把 n 从 0 开始逐个代入,算出来的正整数就是被选中的子元素序号。比如 2n+1:n=0 得 1,n=1 得 3,n=2 得 5,所以选中第 1、3、5… 个元素。A 控制周期,B 控制偏移。0 和负数结果直接丢弃,不会报错。

  • n 从 0 开始代入,结果为正才生效
  • 2n 选偶数,2n+1 选奇数
  • -n+3 只选前三个
  • :nth-last-child 从末尾倒着数

最常见的几个公式对应哪些元素

搞清楚公式之前,先记住一件事:子元素的序号从 1 开始,不是从 0 开始。第一个子元素是 1,第二个是 2,以此类推。

偶数、奇数和指定范围CSS
/* 偶数行:n=0→0(忽略) n=1→2 n=2→4 … */
tr:nth-child(2n) { background: #f5f5f5; }

/* 奇数行:等价于 odd */
tr:nth-child(2n+1) { background: #fff; }

/* 第 3 个及之后:n=0→3 n=1→4 n=2→5 … */
li:nth-child(n+3) { color: gray; }

/* 只选前 3 个:n=0→3 n=1→2 n=2→1 n=3→0(停) */
li:nth-child(-n+3) { font-weight: 700; }

2n 可以简写成 even,2n+1 可以简写成 odd,写哪种都行,面试时知道它们等价就够了。 -n+3 是一个很实用的写法。因为 n 每增加 1,结果就减 1,所以从 3 递减到 1 之后就变成 0 和负数,被忽略。效果就是只选中前 3 个元素。想选前 5 个就写 -n+5,以此类推。

负数结果的丢弃规则

很多人第一次看到 -n+3 会疑惑:代入后出现 0 和负数怎么办?答案是直接忽略。浏览器只取公式结果大于 0 的那些序号,其余全部跳过。

这个规则让公式变得很灵活。比如只想选第 5 到第 10 个元素,可以写 :nth-child(n+5):nth-child(-n+10),同时满足两个条件:序号大于等于 5,并且小于等于 10。

组合两个条件圈定范围CSS
/* 选中第 5 到第 10 个 */
li:nth-child(n+5):nth-child(-n+10) {
  background: lightyellow;
}

两个 :nth-child 拼在一起就是交集。第一个保证序号不小于 5,第二个保证不大于 10。这种写法在分页列表高亮当前页范围时特别有用。

按类型数和倒着数

:nth-last-child 和 :nth-child 的公式完全一样,区别只是从最后一个子元素开始往前数。:nth-last-child(1) 就是最后一个,:nth-last-child(-n+3) 就是最后三个。

:nth-of-type 只数同标签类型的元素。比如父元素里有 <h2>、<p>、<p>、<p>,p:nth-of-type(2) 选的是第二个 <p>,不管前面有没有 <h2>。而 p:nth-child(2) 要求它既是 <p> 又是第二个子元素,如果第二个子元素恰好是 <h2>,就什么都选不到。

这两个的区分是面试高频考点。简单记::nth-child 数所有兄弟,:nth-of-type 只数同类型的兄弟。

回答前,多想一步

容易答错的地方

以为 n 从 1 开始
n 是从 0 开始的,这样 2n 才能选到第 2 个元素(n=1 时 2n=2)。如果 n 从 1 开始,2n 得到的是 2、4、6,虽然结果碰巧一样,但 n+3 就会得到 4、5、6,漏掉第 3 个,和实际效果对不上了。
混淆 nth-child 和 nth-of-type
父元素里混了不同标签时,两者结果完全不同。p:nth-child(1) 是「第一个子元素,并且必须是 <p>」,如果第一个子元素是 <h2>,它就不匹配。而 p:nth-of-type(1) 是「第一个 <p> 类型的兄弟」,不管它前面有几个 <h2>。
试着用自己的话回答

面试官还会怎么问?

怎么只选中最后三个元素?

用 :nth-last-child(-n+3)。和 :nth-child(-n+3) 选前三个是同一个思路,只是从末尾开始倒着数。

nth-child(2n of .active) 是什么意思?

这是 CSS Selectors Level 4 的新语法。of .active 表示只在匹配 .active 的子元素里计数,然后从中选偶数个。以前要实现这个效果只能靠 JavaScript,现在一行选择器就够了。不过旧版浏览器不支持 of S 语法,用之前要确认兼容性。

nth-child 和 nth-of-type 在什么情况下结果一样?

当父元素的所有子元素都是同一个标签类型时,两者完全等价。比如 <ul> 里全是 <li>,li:nth-child(2) 和 li:nth-of-type(2) 选的是同一个元素。只有父元素里混了不同标签,结果才会不同。

从一道题,走向一组知识

把知识连起来

层叠与选择器

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

:only-child 等价于 :first-child:last-child,理解了序号计数再看这个会很清楚。

层叠与选择器

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

:nth-child(An+B of S) 是较新语法,旧浏览器不支持时需要降级方案。

参考资料

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

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

本题目录
  1. 先记住这个答案
  2. 最常见的几个公式对应哪些元素
  3. 负数结果的丢弃规则
  4. 按类型数和倒着数
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

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

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