【发布时间】:2014-04-20 14:28:28
【问题描述】:
我有以下 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 parent 是 b 时,它不会有 -- 语法,反之,当他的 parent 是 m 时,它将有 @987654331 @ 语法,这样我可以决定两种上下文使用什么语法。
我没有找到将父选择器作为字符串的方法,我认为这是不可能的,有没有办法让它工作?
更新 我发现一个不是很简单的解决方案可以正常工作,它在元素 mixin 中使用上下文参数:
=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;}
【问题讨论】:
-
+1 -- 我正要问这个问题。