CSS选择第二个子元素


CSS选择器:https://www.runoob.com/cssref/css-selectors.html

 

有以下<div>,类名class="abc",想要选择第二个子元素 <p>修改样式

(下面样式都是以修改背景颜色为例)

<body>
<div class="abc"> <span>aaaaa</span> <p>bbbbb</p> <div>ccccc</div> <ul> <li>ddddd</li> <li>eeeee</li> </ul> </div>
</body>

 

CSS类选择器的写法是在类名class前面加 点号(.),类名class="abc"的选择器就是  .abc

CSS可以使用伪类 :nth-child() 选择子元素,:nth-child()从1开始计数,所以第二个子元素就是:nth-child(2)

两个选择器之间加  空格(后代选择器)  代表后面的选择器是前面的后代(子代,孙代.....)

初步判断,要选择class="abc"的第二个子元素对应的选择器为 .abc :nth-child(2)   

注意: .abc与:nth-child(2)之间有空格

<style>
    .abc :nth-child(2){ 
        background-color:yellow;
    }
</style>

 

CSS效果如下图,和预期效果不一样,不但<div>的第二个子元素变了,而且其中<ul>的第二个子元素<li>也变了

 

因为后代选择器(空格)不光选择了子代中的第二个<p>bbbbb</p>

还选择了孙代中的第二个<li>eeeee</li>

 

修改方法1. 当前为后代选择器(空格),此处我们要指定标签名,因为选择<p>标签,加上标签名写为 p:nth-child()  

CSS选择器变为 .abc p:nth-child(2)  

注意: .abc与p:nth-child(2)之间有空格

<style>
    .abc p:nth-child(2){
        background-color:yellow;
    }
</style>

 

修改方法2. 后代选择器(空格)修改为子代选择器(>),这样就会只选子代了,不会选到孙代。

CSS选择器变为 .abc>:nth-child(2)  

注意: .abc与:nth-child(2)之间是子代选择器(>)

<style>
    .abc>:nth-child(2){
        background-color:yellow;
    }
</style>

 

CSS效果如下图

 

是不是这样就完美解决了呢?

并不是,class是可以重复的,如果两个<div>有相同的class

( <hr/>是水平线,便于分辨两个<div> )

<body>
<div class="abc"> <span>aaaaa</span> <p>bbbbb</p> <div>ccccc</div> <ul> <li>ddddd</li> <li>eeeee</li> </ul> </div>
<hr/>
<div class="abc"> <span>aaaaa</span> <p>bbbbb</p> <div>ccccc</div> <ul> <li>ddddd</li> <li>eeeee</li> </ul> </div>
</body>

 

CSS效果如下图,两个相同class元素的第二个子元素都变了

 

 

如何修改呢?比如我想选择第二个class="abc"元素的第二个子元素

那么就要用伪类 :nth-of-type() 来选择是第几个父元素,:nth-of-type()从1开始计数,所以第二个父元素就是:nth-of-type(2)

CSS选择器变为 .abc:nth-of-type(2)>:nth-child(2)

 

<style>
    .abc:nth-of-type(2)>:nth-child(2){
        background-color:yellow;
    }
</style>

 

CSS效果如下图

 

 

现在仍不完美,因为伪类 :nth-of-type() 是按相同标签来计数的,如果有相同类名,但是标签不同就会出错。

比如下面有两个<div>,类名都是class="abc";还有两个<ul>,类名也都是class="abc"

<body>
<div class="abc"> <span>aaaaa</span> <p>bbbbb</p> <div>ccccc</div> <ul> <li>ddddd</li> <li>eeeee</li> </ul> </div>
<hr/>
<div class="abc"> <span>aaaaa</span> <p>bbbbb</p> <div>ccccc</div> <ul> <li>ddddd</li> <li>eeeee</li> </ul> </div>
<hr/>
<ul class="abc"> <span>aaaaa</span> <p>bbbbb</p> <div>ccccc</div> <ul> <li>ddddd</li> <li>eeeee</li> </ul> </ul>
<hr/>
<ul class="abc"> <span>aaaaa</span> <p>bbbbb</p> <div>ccccc</div> <ul> <li>ddddd</li> <li>eeeee</li> </ul> </ul>
</body>

 

按照 .abc:nth-of-type(2)>:nth-child(2) 

因为两个<div>和两个<ul>的类名都是class="abc",而:nth-of-type(2)是根据标签计数,div标签数第二个,ul标签数第二个

所以第二个<div>的第二个子元素和第二个<ul>的第二个子元素都变了,效果如下图

 

 

如何修改呢?

指定父元素标签名,在 :nth-of-type() 前面加标签名。此处我们要选择<div>父标签,所以在前面加上标签名div

CSS选择器变为 div.abc:nth-of-type(2)>:nth-child(2)   

<style>
    div.abc:nth-of-type(2)>:nth-child(2){
        background-color:yellow;
    }
</style>

 

CSS效果如下图。至此,可以说比较完善的解决了

 

 

附:

原生JS:

 

jQuery:

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM