2017-01-09 36 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