You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在:where()或:is()伪类中使用复杂选择器?实操疑问

问题原因解析

你的问题出在CSS选择器组合器的作用域逻辑上:

当你写main > :where(div, section, ul > li)时,:where()里的每个选择器都是独立单元,会和前面的main >直接组合。这会被解析成三个完全不同的选择器:

  • main > div(正常匹配main的直接子div)
  • main > section(正常匹配main的直接子section)
  • main > (ul > li)(无效,这个选择器要求li是main的直接子元素,同时li的父元素是ul——这显然不可能,li的父元素是ul的话,就不可能是main的直接子元素)

而你原本的main > ul > li是匹配「main的直接子ul的子li」,和上面第三个解析结果完全不是一回事,自然无法选中目标元素。

正确的简化写法

如果想消除main >的冗余,你需要根据选择器的层级逻辑调整写法:

// 写法1:拆分分支,消除部分冗余
document.querySelectorAll('main > :where(div, section), main > ul > li');

// 写法2:用:where()包裹完整选择器,彻底消除冗余
document.querySelectorAll(':where(main > div, main > section, main > ul > li)');

补充说明

:where()和:is()的参数是完整的选择器列表,但外部的组合器(比如这里的>)只会作用到它们内部每个选择器的最左侧节点,不会穿透到内部的组合器逻辑。所以不能把跨层级的选择器(比如ul > li)直接放到main >后面的:where()里,这会完全改变选择器的匹配范围。

内容的提问来源于stack exchange,提问作者Nexus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 05:46:28