我有以下 mixin 可以轻松使用 BEM 语法和sass 3.3.2
代码:
=b($name)
.#{$name}
@content
=e($name)
&__#{$name}
@content
=m($name)
&--#{$name}
@content
+b(menu)
+e(item)
color: grey
+e(item)
+m(alert)
color: red
这给了我想要的结果:
.menu__item {color: grey;}
.menu__item--alert {color: red;}
所以这对元素级修饰符非常有效,但是当我想要块级修饰符时,问题就开始了:
+b(menu)
+m(theme-1)
+e(item)
color: blue
css输出:
.menu--theme-1__item {color: blue;}
当我真正想要的是:
.menu--theme-1 .menu__item {color: blue;}
所以我需要一种方法来检查元素的上下文是什么,当上下文是块时没有问题,但当是修饰符时语法失败。我尝试在 e mixin 中将父选择器作为字符串,所以当父选择器e
没有b
语法--
时,反之,当父选择器m
有--
语法时,我可以决定两个上下文使用什么语法。我没有找到将父选择器作为字符串的方法,我认为这是不可能的,有没有办法让它工作?
更新 我发现一个不是很简单的解决方案可以正常工作,它在元素混合中使用上下文参数:
=e($name, $context:null)
@if $context
&
+b($context)
&__#{$name}
@content
@else
&__#{$name}
@content
现在我可以按如下方式调用mixin:
+b(menu)
+m(theme-1)
+e(item, nav)
color: blue
得到:
.menu--theme-1 .menu__item {color: blue;}