first-child与first-of-type的区别
first-child 和 first-of-type 是 CSS 中的伪类选择器,用于选择特定位置的元素,但它们的作用机制和选择范围有所不同。以下是它们的详细区别:
:first-child
-
定义:选择父元素中的第一个子元素,且该子元素必须满足选择器的条件。
-
特点:
- 只关注元素在其父元素中的位置,不关心元素类型。
- 如果第一个子元素不满足选择器的条件,则不会匹配任何元素。
-
示例:
<div> <p>第一个子元素(p)</p> <span>第二个子元素(span)</span> <p>第三个子元素(p)</p> </div>p:first-child { color: red; /* 只有当第一个子元素是 <p> 时才会生效 */ }在上面的例子中,如果第一个子元素是
<p>,则其颜色会变为红色;否则,不会生效。
:first-of-type
-
定义:选择父元素中同类型元素的第一个。
-
特点:
- 关注元素的类型,选择同类型元素中的第一个。
- 即使第一个同类型元素不是父元素的第一个子元素,也会被选中。
-
示例:
<div> <span>第一个子元素(span)</span> <p>第二个子元素(p)</p> <p>第三个子元素(p)</p> </div>p:first-of-type { color: blue; /* 选择第一个 <p> 元素 */ }在上面的例子中,第二个子元素是第一个
<p>元素,因此其颜色会变为蓝色。
- 主要区别
| 特性 | :first-child | :first-of-type |
|---|---|---|
| 选择范围 | 父元素的第一个子元素 | 父元素中同类型元素的第一个 |
| 是否关注元素类型 | 不关注元素类型 | 关注元素类型 |
| 匹配条件 | 必须是父元素的第一个子元素 | 只需是同类型元素中的第一个 |
| 示例 | p:first-child:选择第一个子元素且为 <p> | p:first-of-type:选择第一个 <p> 元素 |
- 使用场景对比
:first-child 的使用场景
- 需要选择父元素的第一个子元素,且该子元素必须满足特定条件。
- 适用于严格限制第一个子元素类型的场景。
示例:
ul li:first-child {
font-weight: bold; /* 仅当第一个子元素是 <li> 时生效 */
}
:first-of-type 的使用场景
- 需要选择父元素中同类型元素的第一个。
- 适用于父元素包含多种类型子元素的场景。
示例:
article p:first-of-type {
font-size: 1.2em; /* 选择第一个 <p> 元素 */
}
- 注意事项
- 嵌套结构:在嵌套结构中,
:first-child和:first-of-type的作用范围仅限于当前父元素。 - 兼容性:两者在现代浏览器中支持良好,但在某些旧版本浏览器中可能存在兼容性问题。
- 结合使用:可以结合其他选择器(如类选择器、属性选择器等)实现更精确的选择。
- 示例对比
HTML 结构
<div>
<span>第一个子元素(span)</span>
<p>第二个子元素(p)</p>
<p>第三个子元素(p)</p>
</div>
CSS 样式
/* :first-child */
p:first-child {
color: red; /* 不会生效,因为第一个子元素是 <span> */
}
/* :first-of-type */
p:first-of-type {
color: blue; /* 生效,选择第一个 <p> 元素 */
}
总结
:first-child:选择父元素的第一个子元素,且必须满足选择器条件。:first-of-type:选择父元素中同类型元素的第一个,不关心其在父元素中的位置。
根据具体需求选择合适的伪类,可以更精确地控制样式。
更多vue相关插件及后台管理模板可访问vue admin reference,代码详情请访问github