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

Sass中&符号解析及相关DOM、语法疑问解答

关于Sass选择器与DOM结构的疑问解答

嘿,这几个问题都是刚开始用Sass时很容易踩的坑,我来逐一给你拆解清楚:

1. 为什么你想的父子DOM结构是错误的?

你之前以为Sass里的嵌套会生成父子元素选择器,但实际上Sass中的&是当前选择器的完全引用,不是用来生成子选择器的。

看你的Sass代码:

.contract-icon {
  &.ic-rise_fall {
    &:before { ... }
  }
}

这段代码编译后的CSS是:

.contract-icon.ic-rise_fall:before {
  content: url('../images/trading_app/contracts/rise_fall.svg');
}

它对应的DOM是同一个元素同时拥有两个类:<i class="contract-icon ic-rise_fall" />,也就是你一开始写的那个DOM结构才是正确的。

如果要生成你想的父子DOM结构(<div class="contract-icon"><div class="ic-rise_fall"></div></div>),Sass里不需要用&,直接写子选择器就行:

.contract-icon {
  .ic-rise_fall { /* 这里没有&,表示子元素 */
    &:before { ... }
  }
}

编译后是:

.contract-icon .ic-rise_fall:before { ... }

2. 同元素多类和父子元素结构的区别

  • 样式作用对象不同:同元素多类的样式是直接作用在那个同时拥有两个类的元素上(比如你的<i>标签);父子结构的样式是作用在子元素上,父元素和子元素的样式是相互独立的。
  • CSS权重不同:同元素多类的选择器权重是两个类选择器的叠加(权重值:0,0,2,0),而父子选择器是父类+子类的权重(同样是0,0,2,0,但作用对象不同)。
  • DOM结构复杂度不同:同元素多类不需要额外嵌套DOM,更简洁;父子结构需要多一层元素,适合需要单独控制子元素布局的场景。

在你的场景里,图标是通过伪元素:before来实现的,伪元素必须依附在某个真实元素上,所以直接把类都加在同一个<i>标签上是最合理的写法。

3. &--invert:before的具体含义

这是结合了Sass嵌套和BEM命名规范的写法:

  • &在这里代表的是上层的选择器.contract-icon.ic-rise_fall
  • --invert是BEM里的「修饰符(Modifier)」,用来表示元素的一种特殊状态(这里是“反转”状态)

所以这段Sass代码:

.contract-icon {
  &.ic-rise_fall {
    &--invert:before {
      content: url('../images/trading_app/contracts/invert/rise_fall.svg');
    }
  }
}

编译后的CSS是:

.contract-icon.ic-rise_fall--invert:before {
  content: url('../images/trading_app/contracts/invert/rise_fall.svg');
}

对应的DOM应该是<i class="contract-icon ic-rise_fall--invert" />,当元素有这个类时,伪元素就会加载反转版本的SVG图标。

内容的提问来源于stack exchange,提问作者merry-go-round

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:00:53