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

SASS嵌套选择器优先级疑问:双&引用为何不符合预期?

SASS选择器优先级疑问解析

核心原因:你误解了SASS中&的替换逻辑

&不是提取父选择器的“基础类名”,而是完全继承当前层级的父选择器上下文,不同的嵌套结构会导致完全不同的编译结果。

具体场景拆解

  1. 符合预期的正确嵌套结构:
    当你在父选择器(比如.div)的直接嵌套中写&__main &__example a,编译结果和优先级都会符合预期:

    .div {
      &__main &__example a {
        // 编译结果:.div__main .div__example a
        // 优先级:(0,2,1)(两个类选择器+一个元素选择器)
      }
    }
    
  2. 导致优先级异常的常见错误场景:

    • 全局作用域使用&:如果没有父选择器直接写&__main &__example a,&会被解析为空,编译后变成__main __example a——这两个都是无效选择器,浏览器只会识别a,所以优先级是(0,0,1)。
    • 嵌套层级错误:如果你的代码写在&__main的嵌套里,&会继承.div__main这个上下文,而不是最初的.div:
      .div {
        &__main {
          &__example a {
            // 编译结果:.div__main__example a
            // 优先级:(0,1,1)(一个复合类选择器+一个元素选择器)
          }
        }
      }
      
      这种情况下生成的是复合类,而非两个独立的BEM类,自然优先级不符合预期。
  3. 为什么&__main .div__example a能得到预期优先级?
    因为.div__example是你明确指定的类选择器,不管&__main的上下文如何,只要它是有效的类选择器,最终就会生成两个独立的类选择器组合,优先级自然正确。

正确写法参考

如果需要在&__main的嵌套里生成.div__main .div__example a,可以用@at-root跳出当前上下文:

.div {
  &__main {
    @at-root #{&}__example a {
      // 编译结果:.div__main .div__example a
    }
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 23:20:39