nth-child 与 nth-of-type
他们两个的作用都是从处于同一父元素下的同级元素中选中指定位置的元素,当这些子元素相同时,二者用起来没区别。但是
在以下情况使用就需要区别
<section>
<h1>Words</h1>
<p>Little</p>
<p>Piggy</p> <!-- 想要匹配这个 -->
</section>
p:nth-child(1) 会找不到匹配的元素
但 p:nth-of-type(1) 会正确找到 <p>Little</p>
原因是:
nth-child是先排序后匹配:先不区分的对所有同级兄弟元素排序,(注意是同级元素)(排序是从1开始)找到第n个之后再看是否匹配;
而nth-of-type是先匹配后排序:只对匹配的同级兄弟元素排序,再从中找到第n个。
他们的语法几乎没有差别
目标元素选择器 :nth-child(N)
目标元素选择器 :nth-of-type(N)
其中
- 目标元素选择器可以是复合选择器
- N代表选中第几个元素:可以是 数字、关键字(odd奇/even偶)、公式an+b
对公式an+b的个人理解:
b是初始值,表示从第b个开始
an是步长,n代表每次+1,-n代表每次-1,3n代表+3
li:nth-child(5) {
color: green;
}
li:nth-child(n+6) {
color: green;
}
li:nth-child(-n+5) {
color: green;
}
li:nth-child(4n+1) {
color: green;
}
一个例子理解何为同一父元素下的同级元素
看一个nth-child的看似复杂的例子:
<nav>
<div class="nav-common">
<div class="nav-items">
<a href="#"></a>
</div>
<div class="nav-items">
<a href="#">abc</a>
<a href="#">abc</a>
</div>
<div class="nav-items">
<a href="#">abc</a>
<a href="#">abc</a>
</div>
</div>
<div class="nav-common">
<div class="nav-items">
<a href="#"></a>
</div>
<div class="nav-items">
<a href="#">abc</a>
<a href="#">abc</a>
</div>
<div class="nav-items">
<a href="#">abc</a>
<a href="#">abc</a>
</div>
</div>
<div class="nav-common">
<div class="nav-items">
<a href="#"></a>
</div>
<div class="nav-items">
<a href="#">abc</a>
<a href="#">abc</a>
</div>
<div class="nav-items">
<a href="#">abc</a>
<a href="#">abc</a>
</div>
</div>
</nav>
实现的效果:
css部分大量用结构伪类设置样式(只展示了想描述的问题相关的样式设置)
/* 添加灰色框线 */
/* .nav-items a 要作为整体来看 */
.nav-items a:nth-child(1) {
border-bottom: 1px solid #ccc;
}
.nav-items:nth-child(n+2) {
border-left: 1px solid #ccc;
}
/* 背景图 */
.nav-items:nth-child(1) a{
/* 巧妙利用了层叠 border-bottom: 1px solid #ccc;*/
border: 0;
background: url(../images/hotel.png) no-repeat bottom center;
background-size: 121px auto;
}