🔥应吾皇催更 - 简单说说 :nth-child() 选择器!

先裱起来!



在使用CSS的过程中,我们几乎都用到过 nth-child() 选择器,它主要是根据父元素内的所有兄弟元素的位置来选择子元素。

其基本用法相信大佬们都有实践过或者见到过,在这里也提一嘴 (怕内容太少

0) 基础结构与样式

为方便演示效果,附加一下基本的HTML结构如下

<article>
  <p>这是第 1 个段落</p>
  <p>这是第 2 个段落</p>
  <p>这是第 3 个段落</p>
  <p>这是第 4 个段落</p>
  <p>这是第 5 个段落</p>
  <p>这是第 6 个段落</p>
  <p>这是第 7 个段落</p>
  <p>这是第 8 个段落</p>
  <p>这是第 9 个段落</p>
  <p>这是第 10 个段落</p>
</article>

:bulb:如果你需要在开发中输入类似有相同结构的html时,你可以使用 emmet 的快速输入哦!以vscode为例,你只需要在编辑器中输入 article>p*10{这是第 $ 个段落 } ,然后回车即可。

之前分享的cheatsheet

默认颜色为 darkcyan

p {
  color: darkcyan;
}

1) :grin: 单个选择

这个是最常使用的,直接写入需要选择的次第即可,如选择第5个:

p:nth-child(5) {
  color: deeppink;
}

效果见下图1。

2) :blush: 奇偶选择

奇偶选择的实用性也相对频繁。

  • 使用关键字 odd 表示奇数选择;
  • 使用关键字 even 表示偶数选择。
p:nth-child(odd) {
  color: deeppink;
}

:bulb:如果你容易将这两个单词所代表的含义混淆,那么就直接看它的字母个数就行!是不是瞬间就记住啦~

效果见下图2。以奇数为例。

3) :sweat_smile: 前x个 后x个

这个的使用程度上,或许比奇偶还频繁,规律如下:

  • 前5个:-n+5;
  • 后5个:n+5。
p:nth-child(-n+5) {
  color: deeppink;
}

:warning:注意:n必须在前面,不要试图将 -n+5 写成 5-n,正数同理。

另外,这里后5个中的 n+5 代表的含义是 从第5个开始选,不是代表个数! 因为例子中总计10个,以免引起歧义,作下说明。

效果见下图3。以前5个为例。



4) :open_mouth: 分组选择与倒序选择

适用于一些特殊需求场景。例如每3个选择一个,每4个选择一个等。

这类的选择相对来说较为复杂一点,大鹅在这里根据自己使用的经验做几点简单总结:

  1. 将系数看作是一个组的容量,若无加数,则选择每组最后一个;
  2. 将后面的加数看作是选择当前组中的第x个;
  3. 后面数字为负数的话,可以看成是倒序数(从0开始);
  4. 若后面加数大于系数,可以看成是从第 (加数/系数) 向上取整的组开始选以及 这些组第 (加数/系数) 余数部分的次序;
  5. 若是加数为负且大于系数,那就是在组内倒数循环,可将其加数简化为 (加数/系数)所得余数,然后规则同 3。

关于上述几点,我以下列代码来说明:

p:nth-child(3n+2){
  color: deeppink;
}
  1. 这里就是以 3 个为一组,没有系数的话,就选择最后一个。见下图1;
  2. 加数为 2 ,所以我们选择的就是每3个一组中的第2个,见下图2;
  3. 如果是 3n-1 那就是选每一组倒数第二个(从0开始数);
  4. 如果后面加数大于系数,例如 3n+5,那就是 (7/3)=2.333=2···1。意味着从 第 3 组开始选择,选每一组的第 1 个。再例如 3n+6,这是能除尽的,余数为0则选择的是最后一个,那么这个就是从第2组开始,每组最后一个。见下图4。
  5. 如果是 3n-5,那就可以看成是 3n-2,然后按照第3条规则,就是选择每组倒数第 3 个。

:fire:前面3条倒是还好,最后两个其实我们都是可以用前面的方法代替,没必要硬来把自己绕晕,例如 3n+5,那我们就直接将5个编组不就行了嘛!3n-1 也可以转为 3n+2 呀~ 干嘛非要去玩倒数来秀晕自己捏~

在这里列举出来,主要是因为我真见过这么做的,把自己绕晕然后来问我的,在此作个补充说明!



5) :frowning_with_open_mouth: 区间选择

区间选择通常是用来选择某个区间内的元素,例如:我们需要选择 第2个到第9个之间的元素,使用我们之前的几种,好像都不太好操作,因此我们需要用到本节所介绍的范围选择!

先上代码,再做解释。

p:nth-child(-n+9):nth-child(n+2){
  color: deeppink;
}

以从2到9为例,既然是选择一个范围,那我们可以分为三步走:

  1. 先选择前面9个;
  2. 再从第二个开始选;
  3. 取交集 ∩

那么上述代码也就容易理解了。

这里我们使用串联两个选择器来取交集哦!

:bulb: 因为取的是交集∩,所以串联的顺序不影响结果!

额外拓展一下:

我们也可以使用 :not() 选择器来排除。

本例中,我们也可以选择前9个,然后排除掉第1个,代码如下:

p:nth-child(-n+9):not(:nth-child(1)){
  color: deeppink;
}

效果见下图1。

6) :scream: 区间内过滤

上述区间选择中,我们选择了从第2个到第9个。现在你的老板灵光一闪,说在这个基础上,我不要第5个!于是你 桌子一拍 脑门一拍,想起了大鹅说了可以使用 :not() 选择器来嵌套!你就写出了如下代码:

p:nth-child(-n+9):nth-child(n+2):not(:nth-child(5)){
  color: deeppink;
}

效果如下图2。

你的老板微微一笑,吃完午饭,他又觉得不对劲,他其实是不想要其中的 第5个到第7个!

他来到你工位前,把你脑门一拍,于是你 反手一拳 也脑门一拍,瞬间打通了任督二脉,想起了大鹅不仅讲了区间选择器,还讲了能用not来排除,你快速地把大鹅之前说的进行了神奇的组合,写出了如下代码:

p:nth-child(-n+9):nth-child(n+2):not(:nth-child(-n+7):nth-child(n+5)){
  color: deeppink;
}

效果见下图3。

老板满意的离开了。你正高兴呢,老板似乎想起了什么了不得的东西,急速狂飙到你工位前,温和地跟你说:原来第6个是我想要的!从第2个到第9个之间,把5到7排除,然后把6留着!

你再也忍不住了,于是你 抄起菜刀 猛的站起来又缓缓坐了下去,你疯狂整理思绪,又想起了大鹅讲的东西,你思索着:既然not可以嵌套,那可不可以再套一次呢?你尝试着写了下去:

p:nth-child(-n+9):nth-child(n+2):not(:nth-child(-n+7):nth-child(n+5):not(:nth-child(6))){
  color: deeppink;
}

当效果(见下图4)出来的那一刻,你老板连忙凑过来,说道:对对对!就是这样!这个字再大点

你嘴角微微一提,一脸风轻云淡地等着老板再出招!



确认老板没有新的灵感后,你又把前面的知识点过了一遍,发现这个6其实不就是偶数吗?如果他不要的的是某个区间内的偶数,那直接用 even 就行了嘛!你直夸自己聪明,能够举一反三,灵活应用。

然后回来给大鹅点了个赞 :bili_069: :bili_069: :bili_069:


往期选择器相关:


CSS

60 个赞

学起来!

2 个赞

非常好教程,使我的列表旋转!

10 个赞

今天要吃个鸡腿补一补 :tieba_087:

2 个赞

感谢分享大佬厉害啊

3 个赞

鹅佬太nb了 :tieba_087:

3 个赞

太强了鹅老师

3 个赞

这是真正的学习资料,记下来 :+1:

2 个赞

太强了鹅老师

2 个赞

强,还可以有这么多种用法啊

2 个赞

如果再与其它的联动,会有更多 :tieba_087:

2 个赞

感谢分享

4 个赞

学习了 :call_me_hand: :call_me_hand:

4 个赞

我记得有个像玩游戏一样打怪升级的 css 教学网站

3 个赞

鹅佬开始发力了
加油加油:tieba_087::tieba_087::tieba_087:

2 个赞

是关于flex和grid的么

2 个赞

冲冲冲 :bili_069:

2 个赞

好像是,不太记得了,久远的记忆

2 个赞

太强了!!认真学习下 :smiling_face_with_three_hearts:

2 个赞

你已经休息一个小时了!继续更新啊佬

3 个赞