2017-01-09 39 views
0

我使用的是青菜和我用BEM的符号重复父选择,例如,重复的类名 -使用BEM +萨斯家长选择到目标修饰的子元素无

.c-block { 
background:red; 
&__element {font-size:14px;} 
&--modifier {background:blue;} 
} 

此输出 -

.c-block { 
    background: red; 
} 
.c-block__element { 
    font-size: 14px; 
} 
.c-block--modifier { 
    background: blue; 
} 

这使得将来更新班级名称更加简单 - 在一个地方更改并排序!

现在事情变得与修饰更复杂和定位自己的孩子:

.c-block { 
    background:red; 
    &__element {font-size:14px;} 
    &--modifier {background:blue; 
    .c-block__element {font-size:20px;}  
    } 
} 

注意如何我不得不重复类名“.C-块”。有什么办法可以避免这种情况?我只想拥有一个类名声明,它可以在我的样式中引用,并且很容易在一个地方进行更改。

是否使用变量避免类名称重复的唯一方法?例如 -

.c-block { 
    $class: c-block; 

    background:red; 
    &__element {font-size:14px;} 
    &--modifier {background:blue; 
    & .#{$class}__element {font-size:20px;} 
    // the above line = .c-block--modifier .c-block__element 
    } 
} 

我一直在想,必须有一些更好的sass + BEM方法来做到这一点,而不是使用变量。

+0

您最多可以嵌套4层,这是推荐的。如果你想嵌套超过4个级别,请使用变量。 – Raviteja

+1

也许相关:http://stackoverflow.com/questions/41181012/scss-bem-style-children-structure-when-parent-has-modificator – Paleo

回答

2

作为与SASS一起使用BEM的人,您的问题让我感到好奇,并且在快速谷歌后发现了以下文章(关于CSS技巧),here是它的链接。而不是使用变量,我们可以创建混入,以帮助实现你想要什么,就像这样:

/// Block Element 
/// @access public 
/// @param {String} $element - Element's name 
@mixin element($element) { 
    &__#{$element} { 
     @content; 
    } 
} 

/// Block Modifier 
/// @access public 
/// @param {String} $modifier - Modifier's name 
@mixin modifier($modifier) { 
    &--#{$modifier} { 
     @content; 
    } 
} 

然后,您可以像输出你的SASS这样:

.block { 
    /* CSS declarations for `.block` */ 

    @include element(element) { 
     /* CSS declarations for `.block__element` */ 
    } 

    @include modifier(modifier) { 
     /* CSS declarations for `.block--modifier` */ 

     @include element(element) { 
      /* CSS declarations for `.block--modifier__element` */ 
     } 
    } 
} 

希望这有助于以某种方式!

+0

这将工作,但我会建议使用'@ at-root'规则,因为这会造成BEM旨在解决的疯狂重复。看看这篇文章:http://alwaystwisted.com/articles/2014-02-27-even-easier-bem-ing-with-sass-33。请注意,“@ at-root”规则仅适用于版本3.3。 – DevNebulae

+1

感谢Neelam的回复!但可悲的是,这并没有解决引用修饰符的子元素的问题,这些修饰符具有正常的非修饰符名称。 在您的示例中,子元素具有父修饰符名称,我希望它保留为其默认元素名称,例如 - .c-block - 修饰符.c-block__element {/ * styles * /}。我实际上选择了一个子元素(添加特异性)。 对不起,如果我没有解释得很好!感谢mixin! – Ash