querySelector 的默认作用域与 :scope 伪类

在这篇文章中,我们将系统地回顾如何在 CSS 和 JavaScript 中选中父容器的第 2 个子元素,重点剖析 :nth-child():nth-of-type():scope 三大伪类的差异及其在 querySelector 中的正确用法,并给出最佳实践示例。

摘要


CSS 伪类::nth-child() vs :nth-of-type()

:nth-child() 的工作原理

:nth-of-type() 的优势


querySelector 的默认作用域与 :scope 伪类

querySelector 在 Element 与 Document 上的差异

为什么需要 :scope


实战:选中容器的第 2 个子元素

方法一:纯 CSS(只在样式表中)

1
2
3
4
5
/* 仅在样式表中:选中 parent-container 的第2个 div 直系子元素 */
.parent-container > div:nth-child(2) {
/* 样式规则 */
}

方法二:JavaScript + :scope

1
2
3
4
5
// 获取目标容器
const feed = document.querySelector('[role="feed"]');
// 选中其第2个直系子元素
const secondChild = feed.querySelector(':scope > :nth-child(2)');

方法三:DOM API(最简洁)

1
2
3
4
const feed = document.querySelector('[role="feed"]');
// children 返回仅直系子元素的集合,索引从0开始
const secondChild = feed.children[1];


小结与规范建议

  1. 选中同类型的第 n 个元素:优先使用 :nth-of-type(n)
  2. 选中所有类型的第 n 个子元素:使用 :nth-child(n)
  3. 在 JS 中严格限定父容器范围:在 querySelector 内部请加上 :scope,并使用子选择符 >
  4. 性能和可读性:若仅需获取元素节点,element.children[ index ] 简洁高效。

通过正确理解各伪类计数范围及 querySelector 的作用域,你可以在开发复杂布局或动态脚本时,既保证选择器的准确性,又提升代码可维护性。


querySelector 的默认作用域与 :scope 伪类
https://nanxfu.github.io/2025/05/04/querySelector-的默认作用域与-scope-伪类/
Beitragsautor
nanxfu
Veröffentlicht am
May 4, 2025
Urheberrechtshinweis