Sass BEM:当元素在修饰符内时避免修饰符重复
Sass BEM: avoid modifier duplication when element is inside a modifier
我能否以某种方式重构以下代码片段以摆脱 双重修饰符声明?
.block {
&__element {
rule: value;
}
&--modifier {
rule: value;
}
&--modifier & {
&__element {
rule: value;
}
}
}
想要的输出:
.block {
property: value;
}
.block--modifier {
property: value;
}
.block--modifier .block__element {
property: value;
}
您可以像这样将块放在 &--modifier
选择器中,使用块的 class 名称而不是 &
来定位它。
.block {
&__element {
rule: value;
}
&--modifier {
rule: value;
.block {
&__element {
rule: value;
}
}
}
}
但是,这可能不是最好的 BEM 解决方案,您应该考虑将嵌套块重命名为包含块的元素,例如 .block__another-element
或完全创建一个新块。
在修饰符中嵌套元素是一个已知问题。有很多解决方法。
可变方式
将块元素存储在变量中。
并在修饰符内创建元素时使用它进行插值。
.block {
$block: &;
&__element {
property: value;
}
&--modifier {
property: value;
#{$block}__element {
property: value;
}
}
}
See output below.
函数方式
1。创建一个 return 块元素的函数。
它将获取父选择器并剪切 --
之前的单词(这是块)。看起来很老套,但这是最简单的方法。
@function block() {
$selector: str-slice(inspect(&), 2, -2);
$index: str-index($selector, '--') - 1;
@return str-slice($selector, 0, $index);
}
2。使用插值函数。
这将 return 块的名称,因此您不必重复它。
.block {
property: value;
&--modifier {
property: value;
#{block()}__element {
property: value;
}
}
}
See output below.
两种方式都会输出到:
.block {
property: value;
}
.block--modifier {
property: value;
}
.block--modifier .block__element {
property: value;
}
您可以在修饰符旁边添加 &
,以获得类似于 Toni 的解决方案。
.block {
&__element {
rule: value;
}
&--modifier & {
rule: value;
&__element {
rule: value;
}
}
}
然而,这需要 .block
成为根选择器,而不是嵌套在任何其他选择器中。
只是另一种可能的解决方案。尽管在大多数情况下,我仍然更喜欢 Toni 的解决方案。
如果有人用得少,这对你有帮助!
@block:.parent;
@{block}{
backgroung:red;
&--modifier{
backgroung:blue;
}
&__child{
font-size:20px;
@{block}--modifier & {
font-size:40px;
}
}
}
我能否以某种方式重构以下代码片段以摆脱 双重修饰符声明?
.block {
&__element {
rule: value;
}
&--modifier {
rule: value;
}
&--modifier & {
&__element {
rule: value;
}
}
}
想要的输出:
.block {
property: value;
}
.block--modifier {
property: value;
}
.block--modifier .block__element {
property: value;
}
您可以像这样将块放在 &--modifier
选择器中,使用块的 class 名称而不是 &
来定位它。
.block {
&__element {
rule: value;
}
&--modifier {
rule: value;
.block {
&__element {
rule: value;
}
}
}
}
但是,这可能不是最好的 BEM 解决方案,您应该考虑将嵌套块重命名为包含块的元素,例如 .block__another-element
或完全创建一个新块。
在修饰符中嵌套元素是一个已知问题。有很多解决方法。
可变方式
将块元素存储在变量中。
并在修饰符内创建元素时使用它进行插值。
.block {
$block: &;
&__element {
property: value;
}
&--modifier {
property: value;
#{$block}__element {
property: value;
}
}
}
See output below.
函数方式
1。创建一个 return 块元素的函数。
它将获取父选择器并剪切 --
之前的单词(这是块)。看起来很老套,但这是最简单的方法。
@function block() {
$selector: str-slice(inspect(&), 2, -2);
$index: str-index($selector, '--') - 1;
@return str-slice($selector, 0, $index);
}
2。使用插值函数。
这将 return 块的名称,因此您不必重复它。
.block {
property: value;
&--modifier {
property: value;
#{block()}__element {
property: value;
}
}
}
See output below.
两种方式都会输出到:
.block {
property: value;
}
.block--modifier {
property: value;
}
.block--modifier .block__element {
property: value;
}
您可以在修饰符旁边添加 &
,以获得类似于 Toni 的解决方案。
.block {
&__element {
rule: value;
}
&--modifier & {
rule: value;
&__element {
rule: value;
}
}
}
然而,这需要 .block
成为根选择器,而不是嵌套在任何其他选择器中。
只是另一种可能的解决方案。尽管在大多数情况下,我仍然更喜欢 Toni 的解决方案。
如果有人用得少,这对你有帮助!
@block:.parent;
@{block}{
backgroung:red;
&--modifier{
backgroung:blue;
}
&__child{
font-size:20px;
@{block}--modifier & {
font-size:40px;
}
}
}