You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

CSS nth-child选择器:在容器内部如何生效?

CSS :nth-child()选择器的工作原理详解

嘿,我来给你把:nth-child()的逻辑讲得明明白白——这个选择器的规则很容易被误解,咱们结合你给的代码一步步拆解:

核心逻辑:先看父容器的子元素位置,再匹配选择器

:nth-child(an+b)(比如你用的odd,等价于2n+1)的工作步骤是:

  1. 找到当前元素的直接父容器,然后对父容器里的**所有子元素(不管是什么标签、有没有类)**进行顺序计数(从1开始)。
  2. 筛选出父容器中位置符合an+b规则的子元素。
  3. 最后检查这些筛选出来的元素,是否同时匹配前面的选择器(比如你的.zebra类),两个条件都满足才会应用样式。

结合你的代码逐个分析

咱们把你的代码贴出来先:

<!DOCTYPE html>
<html>
<head>
<style>
.zebra:nth-child(odd) { background: red; }
</style>
</head>
<body>
<p class="zebra">Paragraph</p> <!-- 1 -->
<p class="zebra">Paragraph</p> <!-- 2 -->
<p class="zebra">Paragraph</p> <!-- 3 -->
<div>
  <p class="zebra">Paragraph Inside</p> <!-- 4-1 -->
  <p class="zebra">Paragraph Inside</p> <!-- 4-2 -->
</div>
<p class="zebra">Paragraph</p> <!-- 5 -->
<p class="zebra">Paragraph</p> <!-- 6 -->
<p class="zebra">...</p> <!-- 7 -->
</body>
</html>

现在逐个看哪些元素会变红:

  • 第1个<p class="zebra">:它是<body>的第1个子元素(奇数位),同时有.zebra类 → 背景变红。
  • 第2个<p class="zebra">:是<body>的第2个子元素(偶数位)→ 不满足odd规则,不变红。
  • 第3个<p class="zebra">:是<body>的第3个子元素(奇数位)→ 变红。
  • <div>里的第一个<p class="zebra">:它的父容器是<div>,是<div>的第1个子元素(奇数位),且有.zebra类 → 变红。
  • <div>里的第二个<p class="zebra">:是<div>的第2个子元素(偶数位)→ 不变红。
  • 第5个<p class="zebra">:是<body>的第5个子元素(奇数位)→ 变红。
  • 第6个<p class="zebra">:是<body>的第6个子元素(偶数位)→ 不变红。
  • 第7个<p class="zebra">:是<body>的第7个子元素(奇数位)→ 变红。

常见误区提醒

很多人误以为.zebra:nth-child(odd)是“选中所有.zebra元素里的奇数个”,但这完全不对!它的计数范围是父容器的所有子元素,而不是仅匹配.zebra的元素。如果想要实现“仅针对.zebra元素自身排序选奇数”,纯CSS做不到(因为CSS没有“类元素计数”的逻辑),需要借助JavaScript;如果是同类型元素(比如都是<p>),可以用:nth-of-type(odd),但它是按标签类型计数,不是按类。

内容的提问来源于stack exchange,提问作者simpleProgrammer

火山引擎 最新活动