css3 选择器_CSS3伪类选择器 :nthchild() 和 :nthoftype() 避坑

本文通过一个实际问题介绍了CSS3中:nth-child()和:nth-of-type()的区别。 nth-child()在计算时不论元素类型,可能导致预期效果出错,而:nth-of-type()会区分元素类型,确保精准匹配。通过示例代码和解析,解决了因不理解这两个伪类选择器工作原理导致的匹配错误。
摘要由CSDN通过智能技术生成
一、事件背景

今天一个技术群的同学问我,为什么  :nth-child(2n) 匹配到是奇数行元素呢,不是应该匹配的偶数行吗?

二、查找问题

收到他的问题,就直接向他要了代码截图,毕竟看代码是最直接的。代码简化如下:

<div class="pic-list">
    <span class="list-title">图片列表span>
    <div class="pic-item">1div>
    <div class="pic-item">2div>
    <div class="pic-item">3div>
    <div class="pic-item">4div>
div>

.pic-item:nth-child(2n) {
     background-color: #0099CC;
}

上面代码的实际效果如下图:

818ac6a06c108554031afa3defcd5a8d.png

看到上面这段代码和效果图,你是否发现了问题呢?如果你已经发现了问题所在,那么这篇文章你已经不用再往下看了。可是如果你没有发现问题所在,那么就请你再往下看看:)

三、发现问题

上面的问题关键点就在于 图片列表 。对于 :nth-child 伪类有非常重要的一点,也是大家经常踩坑的一点,那就是 :nth-child 伪类匹配元素时是不论元素类型的。什么意思呢?

就是虽然你代码定义的是  div.pic-item:nth-child(2n),但是做运算时,span.list-title 也会参与计算。span.list-title 参与计算是什么意思呢?就是说,计数的时候会把 span.list-title 也算进去。如下图:

ac21294f788b3af126a928f71f3323db.png

也就是说只要是 div.pic-item 的同级兄弟元素,不论元素类型是什么都会参与到计算中。所以 span 标签会加入计算,因此,最开始的问题也就出来了,表面上看好像是匹配到了奇数行元素,实际上呢?是你还没弄明白:nth-child伪类的匹配原理。

四、解决问题

既然已经知道了原因,那么我们要怎么解决它呢?那就是下一位要登场的伪类选择器 :nth-of-type()了。:nth-of-type() 伪类选择器和 :nth-child() 伪类选择器有什么区别呢?

:nth-child() 计算的时候不会区分元素类型,只要是兄弟元素都会参与计算,而 :nth-of-type() 是会区分元素类型的,比如 div.pic-item:nth-of-type(2n) 那么它就只会匹配 div 标签类型的元素,不会匹配其他元素(span)。

修改后的代码如下:

<div class="pic-list">
    <span class="list-title">图片列表span>
    <div class="pic-item">1div>
    <div class="pic-item">2div>
    <div class="pic-item">3div>
    <div class="pic-item">4div>
div>

.pic-item:nth-of-type(2n) {
    background-color: #0099CC;
}

效果图如下:

835fbc23ba2e56ebde0986a74cf9f4fc.png

酱,我们想要的效果出来啦,大家学废了嘛:)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值