BEM:允许修改哪些修饰符?

Posted

技术标签:

【中文标题】BEM:允许修改哪些修饰符?【英文标题】:BEM: What are modifiers allowed to modify? 【发布时间】:2017-03-07 16:20:31 【问题描述】:

假设我有以下 CSS 用于通用列表组件,使用 BEM 和 SCSS:

.list 
  &__item 
    &:not(:last-child) 
      margin-right: .3em;
    
  

我想添加一个可以使列表垂直的修饰符,如下所示:

.list--vertical 
  display: flex;
  flex-direction: column;

当我想到 list__item 元素的边距时,我的问题就出现了。对于垂直列表,我希望我的边距位于底部,而不是每个项目的右侧。如果我对BEM的理解正确,我不能根据list的修饰符来修改list__item的样式,对吗?

更准确地说,这是我想做的:

.list--vertical 
  display: flex;
  flex-direction: column;

  .list__item 
    &:not(:last-child) 
      margin-bottom: .3em;
      margin-right: 0;
    
  

使用 BEM 处理此问题的公认方法是什么? list__item 的另一个修饰符处理边距?另一个完全用于垂直列表的块?

【问题讨论】:

【参考方案1】:

使用 BEM 处理此问题的公认方法是什么?

取决于您使用的 BEM 版本。我用a variant of the pre-spec concept of BEM,意思是关注bem.info会有不同的答案。


修饰符应该附加到它们修改的元素上。但是,修改块允许子元素继承修饰符:

<div class="foo foo--example">
  <div class="foo__bar foo--example__bar">...</div>
<div>

当子元素也有修饰符时,这会变得很混乱:

<div class="foo foo--example">
  <div class="
    foo__bar
    foo--example__bar
    foo__bar--another-example
    foo--example__bar--another-example">...</div>
<div>

这种形式的 BEM 语法非常冗长。最好用于生成的代码。


我使用 LESS 进行 CSS 预处理,所以我的 BEM 代码通常如下所示:

.foo 
  ...

  &__bar 
    ...
  

加上修饰符就变成了:

.foo 
  ...

  &__bar 
    ...
  

  &--example 
    ...

    &__bar 
      ...
    
  

这会强制级联处于正确的顺序,并且所有选择器都继续拥有一个类。

【讨论】:

谢谢!只是为了确定:您会考虑我发布的最后一个示例代码“有效”吗? @Malax,使用后代选择器是有效的,但我绝对建议尽可能避免使用它们。有时,避免将额外的修饰符类添加到每个单独的子元素会快得多。但我遇到过它后来又咬我的情况。因为 LESS 和 Sass 使继承变得如此简单,所以请考虑您是否希望拥有一个 vertical-list 块和一个 horizontal-list 块,每个块都从基本 list 块继承。

以上是关于BEM:允许修改哪些修饰符?的主要内容,如果未能解决你的问题,请参考以下文章

markdown 块元素修饰符(BEM)

html BEM - 块元素修饰符

css CSS BEM - 块,元素,修饰符

使用BEM修饰符类

C# 可以修改MVC匿名类型的访问修饰符吗

浅析Vue中的 .sync 修饰符