我对nth-of-type伪类有点困惑,以及它应该如何工作 - 特别是与nth-child类相比。
也许我有错误的想法,但考虑到这个结构
<div class="row">
<div class="icon">A</div>
<div class="icon">B</div>
<div class="label">1</div>
<div class="label">2</div>
<div class="label">3</div>
</div>
..第三个子元素(第一个带有类标签)应该(可能?)可以用
选择.row .label:nth-of-type(1) {
/* some rules */
}
但是,至少在Chrome中,它不会选择它。只有当它是行中的第一个子节点时才会起作用,这与nth-child相同 - 因此,它与nth-of-type有什么区别?
答案 0 :(得分:33)
nth-child
伪类引用“第N个匹配的子元素”,这意味着如果您有如下结构:
<div>
<h1>Hello</h1>
<p>Paragraph</p>
<p>Target</p>
</div>
然后p:nth-child(2)
将选择第二个也是p的子项(即带有“段落”的p
)。
p:nth-of-type
将选择第二个匹配的p
元素,(即我们的目标p
)。
<强> Here's a great article on the subject by Chris Coyier @ CSS-Tricks.com 强>
你的休息原因是因为type指的是元素的类型(即div
),但是第一个div与你提到的规则(.row .label
)不匹配,因此规则没有不适用。
原因是, CSS is parsed right to left ,这意味着浏览器首先查看:nth-of-type(1)
,确定它搜索的是div
类型的元素,也是第一个与.row
元素和第一个.icon
元素匹配的类型。然后它会读取该元素应该具有.label
类,它与上述内容不匹配。
如果要选择第一个标签元素,您需要将所有标签包装在自己的容器中,或者只使用nth-of-type(3)
(假设总有2个图标)。
另一个选择,(遗憾地)是使用......等待它...... jQuery:
$(function () {
$('.row .label:first')
.css({
backgroundColor:"blue"
});
});
答案 1 :(得分:7)
.label:nth-of-type(1)
“type”这里指的是元素的类型。在这种情况下,div
,而不是课程。这并不意味着第一个元素是.label
,而是指其类型的第一个元素,它也有一个label
类。
没有label
类的元素属于其类型的索引1
。
答案 2 :(得分:5)
图片中添加了10个元素,其中8个是
<p>
,2个是<i>
,两个阴影部分元素表示<i>
剩下的8个是<p>
页面的css在这里:
<style>
* {
padding: 0;
margin:0;
}
section p {
width: 20px;
height: 20px;
border:solid 1px black;
border-radius: 15px;
margin:20px;
float: left;
}
section i {
width: 20px;
height: 20px;
border:solid 1px black;
border-radius: 15px;
margin:20px;
float: left;
}
section p:nth-child(1) {
background-color: green; /*first-child of p in the flow*/
}
section i:nth-child(1) {
background-color: red; /*[first-child of i in the flow]NO */
}
section i:nth-of-type(1) {
background-color: blue; /*the type i of first child in the flow*/
}
</style>
</head>
<body>
<section>
<p></p>
<p></p>
<p></p>
<p></p>
<i></i>
<p></p>
<i></i>
<p></p>
<p></p>
<p></p>
</section>
</body>
第一个绿色灯泡表示
section p:nth-child(1) {
background-color: green; /*first-child of p in the flow*/
}
并且代码中的第二个红色灯泡不起作用,因为我不是流程中的第一个元素
section i:nth-child(1) {
background-color: red; /*[first-child of i in the flow]NO */
}
并且图片中的蓝色灯泡表示流程中第一种类型的i
section i:nth-of-type(1) {
background-color: blue; /*the type i of first child in the flow*/
}
答案 3 :(得分:1)
Heres是一个简单的例子,它显示了nth-child与nth-of-type之间的区别。
<div>
<p>I am first</p>
<div>I am secong</div>
<p>I am 3rd</p>
</div>
p:nth-of-child(2){
background:red;
}
红色背景将应用于div内的第二个p元素。
这是因为nth-of-child基本上意味着在容器内找到第n个p标签(在这种情况下是第2个p标签)
p:nth-child(2){
background:red;
}
这里没有应用css。
这是因为nth-child基本上意味着在容器内找到第n个标签(在这种情况下,第二个标签是div)并检查它是否是p标签
答案 4 :(得分:1)
以下是一个例子:
<div>
<div >0</div>
<div >1</div>
<div >2</div>
<div >3</div>
<div >4</div>
<div >5</div>
</div>
这个选择器:div div:nth-child(1)
将选择div的第一个子节点,但另一个条件是child必须是div。
这里的第一个孩子是<div>0</div>
,但如果第一个孩子是段p
:<p>0</p>
,则此选择器不会影响该页面,因为第一个孩子没有第一个孩子div
是p
。
但是这个选择器:div div:nth-of-type(1)
如果第一个孩子是<div>0</div>
会影响它,但如果第一个孩子现在是<p>0</p>
,他将影响第二个孩子<div>1</div>
因为它是他的div
类型的第一个孩子。
答案 5 :(得分:0)
:nth-of-type
用于选择特定类型的兄弟。
类型我指的是<li>
,<img>
,<div>
等中的一种标记。
:nth-child
用于选择特定父标记的子级而不考虑类型
:nth-of-type
HMTL:
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
<li>Item 4</li>
<li>Item 5</li>
<li>Item 6</li>
<li>Item 7</li>
<li>Item 8</li>
<li>Item 9</li>
<li>Item 10</li>
<li>Item 11</li>
<li>Item 12</li>
<li>Item 13</li>
<li>Item 14</li>
<li>Item 15</li>
<li>Item 16</li>
</ul>
CSS:
请注意,<li>
标记与伪类nth-of-type
之间没有空格。
li:nth-of-type(odd) { background-color: #ccc; }
结果: https://jsfiddle.net/79t7y24x/
:nth-child
HTML:
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
<li>Item 4</li>
<li>Item 5</li>
<li>Item 6</li>
<li>Item 7</li>
<li>Item 8</li>
<li>Item 9</li>
<li>Item 10</li>
<li>Item 11</li>
<li>Item 12</li>
<li>Item 13</li>
<li>Item 14</li>
<li>Item 15</li>
<li>Item 16</li>
</ul>
CSS:
请注意<ul>
标记和:nth-child
伪类
ul :nth-child(even) { background-color: red }
答案 6 :(得分:0)
element:nth-of-type(p) //p=integer , basically return the DOM Element with respect of body.
Let us understand this with an example
<html>
<head>
</head>
<body>
<div>
<p> This is paragraph in first div</p>
<input type="text" placeholder="Enter something"/>
<p>This is a paragraph </p>
</div>
<div>
<p>This is paragraph in second div</p>
<ul>
<li>First Item</li>
<li>Second Item</li>
<li>
<label> This is label <strong>inside Unordered List</strong></label>
</li>
</ul>
</div>
</body>
</html>
**This above html will look like this.**
Now suppose We have to style Second Item in UnOrderd list.
In this case we can use nth-of-type(index) selector wrt DOM body.
we can achieve styling like this
<style type="text/css">
div:nth-of-type(2) li:nth-of-type(2){
color: red;
font-weight: bold;
}
</style>
explanation : div:nth-of-type(2) by this we are trying to tell find the second div in html body,after that we have second div accessible ,now we can dig inside div using same nth-of-type selector,next we are using li:nth-of-type(2) so now we can find second list inside second div and styling it .
Final Code :
<html>
<head>
<style type="text/css">
div:nth-of-type(2) li:nth-of-type(2){
color: red;
font-weight: bold;
}
</style>
</head>
<body>
<div>
<p> This is paragraph in first div</p>
<input type="text" placeholder="Enter something"/>
<p>This is a paragraph </p>
</div>
<div>
<p>This is paragraph in second div</p>
<ul>
<li>First Item</li>
<li>Second Item</li>
<li>
<label> This is label <strong>inside Unordered List</strong></label>
</li>
</ul>
</div>
</body>
</html>
**And Final output will look like this**