nth-of-type 使用class 详情

文章讨论了CSS3伪类选择器:nth-of-type的使用误区,解释了它如何根据元素类型选择,并强调了在class+nth-of-type组合时需要注意的选择规则。

nth-of-type是css3的一个结构性伪类选择器,很多人都知道nth-of-type(n)用于匹配父元素下使用同种标签的第n项子元素,但是也有不少人对这个选择器存在着一些误解。先说一个在使用nth-of-type时可能碰到的问题:

1.为什么NTH-OF-TYPE挂了?

在这里给出DOM结构如下:

<div class='box'>
  <p>第一个段落</p>
  <p class='child'>第二个段落</p>
  <p>第三个段落</p>
  <p class='child'>第四个段落</p>
</div>

如果我们希望改变class为.child的第1个段落元素的样式,可能会把css写成下面这样:

.child:nth-of-type(1) {
  background-color: red;
}

但是运行结果却是:

这里写图片描述

.child:nth-of-type(1)的样式没有作用到任何一个段落元素上。为什么这样定义的样式会不生效呢?让我们先看一下nth-of-type的定义。

2.NTH-OF-TYPE的定义

nth-of-type里既然有个type,就表示它是按照元素类型来进行选择的,它的选择范围是父元素下某一种元素类型的集合。
ele:nth-of-type(n)表示选择父元素下的第n个ele元素,其中n可以是正整数、公式或者关键字。
n为正整数,如p:nth-of-type(2)表示选择父元素下的第2个p元素。
n为公式,如p:nth-of-type(2n+1)表示选择父元素下的每一个奇数项的p元素。
n为关键字,有even(偶数,等价于2n)和odd(奇数,等价于2n+1)两种。

举个例子,就拿下面的DOM结构来说,我们分别nth-of-type给它定义不同的样式:

<div class='parent'>
  <p>第一个段落</p>
  <p>第二个段落</p>
  <span>乱入的span标签</span>
  <p>第三个段落</p>
  <p>第四个段落</p>
</div>

CSS代码:

p:nth-of-type(2) {
   background-color: red;
}
p:nth-of-type(2n) {
   background-color: red;
}
p:nth-of-type(odd) {
   background-color: red;
}

运行结果:

这里写图片描述

这里写图片描述

这里写图片描述

由以上运行结果,几个选择器分别选择到了父元素下的第二个p元素、所有偶数项的p元素以及所有奇数项的p元素,这些结果都是没有问题的。可以说,标签名+nth-of-type是一种非常靠谱的使用模式,基本上不会遇到什么问题。那么,当使用class+nth-of-type时,情况就不一样了。

3.NTH-OF-TYPE与CLASS结合使用

1)同种类型元素拥有同一个class

这种就是本文一开始时候提到的情况,让我们回到上面的第一个例子:

<div class='box'>
  <p>第一个段落</p>
  <p class='child'>第二个段落</p>
  <p>第三个段落</p>
  <p class='child'>第四个段落</p>
</div>
.child:nth-of-type(1) {
  background-color: red;
}

运行结果:

这里写图片描述

根据以上nth-of-type的定义可知,nth-of-type这个选择器是根据元素的类型去选择的。
当解析到.child:nth-of-type(1)时,浏览器一开始并不知道要选择的元素类型是什么,它会先找到.child这个类名,找到.child之后得知p元素拥有这个class,所以此时浏览器就知道了它要从p元素里面去匹配,就变成了p.child:nth-of-type(1),找到了第一个p元素之后判断它有没有.child类名,有就匹配到该元素,没有则匹配不到任何元素。

所以,在这里要匹配到第1个拥有.child的p元素,应该将代码改成:

.child:nth-of-type(2) {
  background-color: red;
}

要匹配到第2个拥有.child的p元素,则把代码写成:

.child:nth-of-type(4) {
  background-color: red;
}

2)多种不同类型的元素拥有同一个class

重新修改DOM结构如下:

<div class='box'>
  <p class='child'>第一个段落</p>
  <span class='child'>乱入的span1</span>
  <p class='child'>第二个段落</p>
  <span class='child'>乱入的span2</span>
</div>
 .child:nth-of-type(2) {
   background-color: red;
  }

运行结果:

这里写图片描述

此时.child:nth-of-type(2)同时匹配到了第二个p元素和第二个span元素。浏览器会先去找.child这个class,找到.child后会把拥有.child这个类名的不同类型的标签分别划分到不同的组里面,再从这些组中分别进行选择。

总结下来就是:
.class:nth-of-type(n)会同时选择到所有具有.class的元素类型组中的第n个拥有.class类的元素。
也就是说.class:nth-of-type(n)相当于 *.class:nth-of-type(n),它会匹配到所有拥有.class的 *:nth-of-type(n), *在这里表示所有拥有.class的元素类型。
以上例子中的.child:nth-of-type(2)就相当于p.child:nth-of-type(2),span.child:nth-of-type(2)。也就是拥有.child的所有p:nth-of-type(2), span:nth-of-type(2)。

### CSS `nth-last-of-type` 选择器用法及示例 `nth-last-of-type` 是一种 CSS 伪类选择器,用于选取父元素中特定类型的子元素,从最后一个子元素开始计数。它与 `nth-of-type` 类似,但方向相反,从后往前数[^4]。 #### 语法规则 `nth-last-of-type` 的语法如下: ```css :nth-last-of-type(an+b) ``` - `an+b` 是一个公式,用于指定选取的子元素位置。 - `a` 和 `b` 是整数,`n` 是计数变量。 - 如果仅提供数字(如 `2`),表示选取倒数第 2 个该类型的子元素。 - 如果使用公式(如 `2n+1`),表示选取所有奇数位置的该类型子元素,从后往前数。 #### 示例代码 以下是一个简单的示例,展示如何使用 `nth-last-of-type`: ```html <!DOCTYPE html> <html> <head> <title>nth-last-of-type 示例</title> <style> div p:nth-last-of-type(2) { background-color: yellow; } </style> </head> <body> <div> <p>段落 1</p> <p>段落 2</p> <p>段落 3</p> <p>段落 4</p> </div> </body> </html> ``` 在这个例子中,`nth-last-of-type(2)` 会选择 `<div>` 中倒数第二个 `<p>` 元素,并将其背景颜色设置为黄色[^4]。 #### 使用公式 如果需要更复杂的选取规则,可以使用公式。例如,选择所有偶数位置的 `<p>` 元素(从后往前数): ```css div p:nth-last-of-type(2n) { color: blue; } ``` 这段代码会将 `<div>` 中所有偶数位置的 `<p>` 元素文字颜色设置为蓝色。 #### 注意事项 1. `nth-last-of-type` 只会考虑与目标元素相同类型的兄弟元素。例如,在 `<div>` 中只有 `<p>` 元素会被计入,其他类型的子元素(如 `<span>`)不会影响计数[^1]。 2. 如果父元素中没有符合条件的子元素,则规则不会生效。 3. 配合类选择器或其他选择器时,需注意其作用范围。例如 `.class:nth-last-of-type(i)` 表示同时满足类和位置条件的元素[^2]。 #### 相关选择器对比 - `nth-child`:选取父元素中的第 N 个子元素,无论类型[^4]。 - `nth-of-type`:选取父元素中第 N 个指定类型的子元素,从前向后数[^1]。 - `nth-last-child`:选取父元素中的第 N 个子元素,从后向前数。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时光机上敲代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值