CSS选择器,nth-child 与 nth-of-type 选择器详解

nth-child 与 nth-of-type 都是CSS3的伪类选择器,两者都是用于 “子代元素”,两者之间的功能差不多,却也存在着一些差异;

例:

<table >
    <tr>
        <th>
            <p>1111111111111111111111111111</p>
            <p>2222222222222222222222222222</p>
            <p>3333333333333333333333333333</p>
            <p>4444444444444444444444444444</p>
            <p>5555555555555555555555555555</p>
            <p>6666666666666666666666666666</p>
            <p>7777777777777777777777777777</p>
            <p>8888888888888888888888888888</p>
            <p>9999999999999999999999999999</p>
        </th>
    </tr>
</table>

修改第二个P标签的背景颜色为红色;

两个选择器的写法:

table tr th p:nth-child(2){
    background-color: red;
}


table tr th p:nth-of-type(2){
    background-color: red;
}

上述两种选择器都能实现 第二个P标签的背景颜色为红色:
这里写图片描述

*这里要注意:IE8 以及更早版本的浏览器是不支持这个属性的,所以不会出现效果,使用的时候应该注意浏览器的版本;


虽然这两个选择器都实现了相同的效果,但是这两个选择器还是存在着一定的差异;

我们将DOM结构稍稍做一下改变在来观察:

<table >
    <tr>
        <th>
            <span>XXXXXXXXXXXXXXXXXXXXXXX</span>
            <p>1111111111111111111111111111</p>
            <p>2222222222222222222222222222</p>
            <p>3333333333333333333333333333</p>
            <p>4444444444444444444444444444</p>
            <p>5555555555555555555555555555</p>
            <p>6666666666666666666666666666</p>
            <p>7777777777777777777777777777</p>
            <p>8888888888888888888888888888</p>
            <p>9999999999999999999999999999</p>
        </th>
    </tr>
</table>

这个时候我们发现,神奇的事情发生了;

nth-child将第一个P标签的背景颜色渲染成了红色,

table tr th p:nth-child(2){
    background-color: red;
}

这里写图片描述

而 nth-of-type 则正确的将第二个P标签的背景颜色渲染成了红色;

table tr th p:nth-of-type(2){
    background-color: red;
}

这里写图片描述


这里我们将DOM再改变一下,来观察:

<table >
    <tr>
        <th>
            <span>YYYYYYYYYYYYYYYYYYYYYYY</span>
            <span>XXXXXXXXXXXXXXXXXXXXXXX</span>
            <p>1111111111111111111111111111</p>
            <p>2222222222222222222222222222</p>
            <p>3333333333333333333333333333</p>
            <p>4444444444444444444444444444</p>
            <p>5555555555555555555555555555</p>
            <p>6666666666666666666666666666</p>
            <p>7777777777777777777777777777</p>
            <p>8888888888888888888888888888</p>
            <p>9999999999999999999999999999</p>
        </th>
    </tr>
</table>

你会发现,神奇的事情又发生了;

nth-child没有渲染任何标签:

table tr th p:nth-child(2){
    background-color: red;
}

这里写图片描述

而 nth-of-type 则正确的将第二个P标签的背景颜色渲染成了红色;

table tr th p:nth-of-type(2){
    background-color: red;
}

这里写图片描述


结论:
p:nth-child(2) 选择的是 第二个子元素(元素的位置位于第二个) 并且 类型要为P 才能被正确的选取
p:nth-of-type(2) 选择的是 第二个类型为P的子元素,至于这个P元素,是不是位于第二个并不重要;

知道了nth-child 与 nth-of-type 的区别,再以后子元素的选取过程中,就能够根据实际情况选择更恰当的选择器,避免造成滥用的情况;

感谢阅读,欢迎纠错,转载请注明出处。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值