【发布时间】:2017-11-11 00:49:42
【问题描述】:
SASS + BEM 在大多数情况下几乎是天作之合,但我的一个常见难题是了解如何在使用 SASS 父选择器时在影响其子元素的元素上最好地定义 BEM 修饰符。
我在 SASS 中使用 BEM 样式语法定义了以下组件:
.card {
background-color: #FFF;
&__value {
font-size: 2em;
color: #000;
}
}
由于 SASS 的父选择器,这很有效。它使相关代码井井有条且自成体系。
但是当我需要添加一个使用父选择器改变子元素的修饰符时,这个想法很快就崩溃了:
.card {
padding: 2em;
&__value {
font-size: 1.5em;
color: #000;
}
&--big {
padding: 2.5em;
&__value { // Is this going to work?
font-size: 3em;
}
}
}
不。它会生成这个:
.card {
padding: 2em;
}
.card__value {
font-size: 1.5em;
color: #000;
}
.card--big {
padding: 2.5em;
}
.card--big__value { // Wrong
font-size: 3em;
}
以某种方式获得这个选择器会更有意义:
.card--big .card__value {
font-size: 3em;
}
这样做的原因是,您可以简单地将修饰符添加到顶级元素并使其影响任何或所有子元素。
我尝试了几种方法:
使用两个结构
.card {
padding: 2em;
&__value {
font-size: 1.5em;
color: #000;
}
}
.card--big {
padding: 2.5em;
&__value {
font-size: 3em;
}
}
这很有效(尤其是在这个简化的演示中),但是在具有许多修饰符的更复杂的组件集合中,这可能是维护和保持无错误的潜在痛苦。此外,如果可能的话,最好继续使用 SASS 父选择器。
为元素使用变量
.card {
$component: &; // Set the variable here
padding: 2em;
&__value {
font-size: 1.5em;
color: #000;
}
&--big {
padding: 2.5em;
#{$component}__value { // Use it here
font-size: 3em;
}
}
}
这很好用。但是将元素定义为变量似乎有点愚蠢。也许这是做到这一点的唯一真正方法......我不确定。有没有更好的选择来构建它?
【问题讨论】:
-
好点!这是最干净的嵌套方式,而不是使用一百个 mixin。我认为您的问题是自我回答的。
-
可以用一个字符
&--big {变成&--big & {- 查看我的答案了解详情。希望对将来遇到此问题的人有用