教你发现CSS3的"nth-child"和"nth-of-type"的区别!

8,440 阅读2分钟

对于初学者来说,区别"nth-child"和"nth-of-type"是一个比较头疼的问题,为了更好帮助大家区别两者使用方法,特在此加以区分。

首先创建一个HTML结构。

<div class="post">
<p>我是文章的第一个段落</p>
<p>我是文章的第二个段落</p><!** ==我要变成第二个段落== **>
</div>

接下来,使用“:nth-child”和“:nth-of-type”选择段落并改变其文字颜色。

.post>p:nth-child(2){color:red;}
.post>p:nth-of-type(2){color:red;}

上面的代码都把“post”中的第二段文字变成了大红色,是不是代表这两个选择器就是一样的呢?其实不然。“nth-child”仅从字面上来解释,其实包含了两层意思。首先是一个段落元素,而且这个段落是父元素“div”的第二个子元素;而“nth-of-type”从字面上解释是“选择父元素div的段落二”。

上面一段话看起来是不是很晕,有没有更好方法来区分它们呢?~~~ 有的!把上面的HTML结构改变一下,在段落前加一个标题“h1”。

<h1>我是标题</h1>
<p>我是文章的第一个段落</p>
<p>我是文章的第二个段落</p><!** ==我要变成第二个段落== **>

前面的样式不变,但结构却完全不同了。“p:nth-child(2)”并没有选择段落二,而是选择了段落一,从而没有达到需要的效果。

.post>p:nth-child(2){color:red;}/*第一个段落变成红色,不是我们需要的效果*/

“nth-child(2)”选错了段落,但“p:nth-of-type(2)”却正常工作,选择还是段落二,实现了想要的效果。

.post>p:nth-of-type(2){color:red;}/*第二个段落变成红色,是我们需要的效果*/

如果在“h1”标题后面添加一个“h2”标题,此时“p:nth-child(2)”将无法选择任何元素,因为,此时“div”的第二个元素并不是段落一“p”,所以无法选择任何元素。但“p:nth-of-type(2)”仍然能正常工作,因为选择的始终是“div”中第二个段落“p”。

大家只需记住一点:“nth-child”选择的是父元素的子元素,这个子元素并没有指定确切类型,同时满足两个条件时方能有效果:其一是子元素,其二是子元素刚好处在那个位置;“nth-of-type”选择的是某父元素的子元素,而且这个子元素是指定类型。