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

为何CSS嵌套在伪选择器内的追加嵌套选择器不生效?SCSS却正常

原生CSS和SCSS中嵌套选择器html &的行为差异

现象说明

  • 用原生CSS时,带.regular类的div文字能变红,但带.pseudo类的div的:before伪元素文字没反应
  • 换成SCSS预处理器后,两个元素的文字都会变成红色

用到的代码

CSS/SCSS代码

.regular {
  html & {
    color: red;
  }
}

.pseudo:before {
  content: '(pseudo) style me red';

  html & {
    color: red;
  }
}

HTML代码

<div class="regular">(regular) style me red</div>

<div class="pseudo"></div>

为什么会有这种差异?

核心在于原生CSS和SCSS对&这个符号的处理逻辑完全不一样:

1. SCSS的处理方式

SCSS是预处理器,会在编译成原生CSS的时候直接做字符串替换:

  • 对于.regular里的html &,它会把&直接换成父选择器.regular,最终生成合法的CSS:html .regular { color: red; },浏览器能正常识别。
  • 对于.pseudo:before里的html &,它同样把&换成完整的父选择器.pseudo:before,生成html .pseudo:before { color: red; },这也是合法的选择器,伪元素的样式自然生效。

2. 原生CSS的处理方式

原生CSS虽然现在支持嵌套选择器,但它对&的理解是当前匹配的元素(包括伪元素)本身,不是简单的字符串替换:

  • 对于.regular里的html &,原生CSS会理解成“匹配.regular元素,且这个元素是html的后代”,等价于html .regular,所以样式能生效。
  • 但对于.pseudo:before里的html &,这里的&指的是:before伪元素本身。而伪元素是依附在.pseudo元素上的,原生CSS不允许通过&把伪元素的选择器和html层级拼接——因为伪元素根本不是html的直接后代,这种写法在原生CSS里是无效的,浏览器识别不了,所以样式没效果。

说白了,SCSS不管语义,直接拼出合法选择器;原生CSS讲逻辑,这种跨层级的伪元素嵌套写法不符合它的规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 04:47:13