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

为何伪元素不能作为:has()伪类的参数?请举对应循环示例

伪元素作为:has()参数引发循环问题的示例

注:伪元素通常被排除在:has()之外,因为其中许多伪元素的存在取决于其祖先元素的样式,允许查询它们会引入循环或循环查询问题。

假设CSS允许伪元素作为:has()的参数,我们来看下面这个会出问题的场景:

HTML代码

<div class="test-box">测试内容</div>

CSS代码(假设允许伪元素入参)

/* 规则1:如果元素有::before伪元素,就给它添加红色背景 */
div:has(::before) {
  background-color: red;
}

/* 规则2:如果元素背景是红色,就显示::before伪元素 */
div[style*="background-color: red"] {
  position: relative;
}
div[style*="background-color: red"]::before {
  content: "伪元素内容";
  position: absolute;
  top: 0;
  left: 0;
}

问题分析

这里出现了典型的循环依赖死局:

  • 浏览器要判断div.test-box是否符合:has(::before)的条件,就得先检查它有没有::before伪元素;
  • 但::before伪元素是否能显示,又取决于这个div有没有红色背景;
  • 而div的红色背景,又需要它满足:has(::before)的条件才能触发。

这种情况下,浏览器陷入了“先有鸡还是先有蛋”的循环,根本无法确定最终该渲染出什么样式——到底是显示红色背景加伪元素,还是都不显示?这就是规范里提到的循环查询问题,也是伪元素被排除在:has()参数之外的核心原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 17:55:57