SCSS + BEM 样式子结构当父有修饰符时

SCSS + BEM style children structure when parent has modificator

请问可以为 --rounded 内的元素设置 scss 吗?我不想使用 .box__something,但我需要修改依赖于父修饰符

的子项
<div class="box">
    <div class="box__something">Hello</div>
</div>
<div class="box box--rounded">
    <div class="box__something">Hi</div>
</div>

.box {
    &__something {
        background: blue;
    }
    &--rounded {
        background: green;

        .box__something { // <<< Is some better selector?
            background: pink;
        }
    }
}

不要在父元素和子元素上使用修饰符.box__something

如果我正确理解你的问题,我能感受到你的痛苦!一旦嵌套嵌套 属性 & 更改为父项。

但是您可以像这样将原始 class 名称缓存为变量:

$box: box;

.#{$box} {
    .#{$box}__something {
        background: blue;
    }
    .#{$box}--rounded {
        background: green;

        .#{$box}__something { // <<< Is some better selector?
            background: pink;
        }
    }
}

上述方法的唯一问题是您最终会得到更大的编译量 CSS。这呈现为:

.box .box__something {
  background: blue;
}
.box .box--rounded {
  background: green;
}
.box .box--rounded .box__something {
  background: pink;
}

要减小输出的大小,您可以将 & 与变量方法结合使用,如下所示:

.box {
  $box: &;
    &__something {
        background: blue;
    }
    &--rounded {
        background: green;

        #{$box}__something {
            background: pink;
        }
    }
}

这呈现为:

.box__something {
  background: blue;
}
.box--rounded {
  background: green;
}
.box--rounded .box__something {
  background: pink;
}

这样你可以更改变量中的 class 名称,所有内容都会更新,我也认为它读起来更好一些。

Sass 没有任何很好的内置解决方案来解决您的问题,这是一个已经探索过很多次的问题。但是,您可以通过使用 & 助手加入您希望加入的 classes,以稍微不优雅的方式获得您想要的结果。我收录了一个直播 example here.

虽然这确实有效,但你必须意识到,如果你想直接设置 .box--rounded class 的样式,你必须将它放在它自己的 class 中,如下所示,你不能使用它与我们放置 &__something 的尾随 & class。

我建议你尝试一下我的 sassmeister 要点,看看你能得出什么结果。

.box {
    &__something {
      background: blue;
    }
    &--rounded {
      background: green;
    }
    &--rounded & {
      &__something {
        background: pink;
    }
  }
}

希望这已经解决了您的问题。