【问题标题】:How to modify multiple elements of a block with BEM CSS如何使用 BEM CSS 修改块的多个元素
【发布时间】:2015-06-10 10:34:12
【问题描述】:

假设我有以下设置,

.block
  .block__header
  .block__content
  .block__footer

现在我想显示这个块的活动状态。假设块本身有一个绿色背景,元素 2 和 3 应该有粗体文本。据我了解 BEM 的理念,不应该使用子选择器来保持尽可能低的特异性。

所以这真的是这样做的方法吗?

.block.block--active
  .block__header
  .block__content.block__content--active
  .block__footer.block__footer--active

更新:我将如何在 SASS 中编写该解决方案(对它来说非常新)?到目前为止,这是我的设置...如果我可以使用嵌套选择器,这里的最佳做法是什么?

.block {
  &--active {

  }
  &__header {

  }
  &__content {
    // active modifier of content
    &--active {
      font-weight: bold;
    }
    // would be the same as
    .block--active & {
      font-weight: bold;        
    }
    // but can i reference the active block somehow else in sass? 
    // & is a parent selector but i would need the parent of the parent here...
  }
  &__footer {
    &--active {

    }
  }
}

【问题讨论】:

  • 你确定这三个元素不同吗?如果你给出一些更具体的例子答案会更有帮助。
  • 是的,我确定 :) 编辑代码只是为了清楚......
  • 我发现了一些非常有用的东西:stackoverflow.com/a/28499176/1358484

标签: css block element modifier bem


【解决方案1】:

BEM 的理念是保持块上下文无关。低特异性只是一种好的做法,而不是黄金法则。我在下面给出三个有效的解决方案。

如果您确定块本身不能递归包含,则可以使用简单的级联:

.block--active {
    background-color: green;
}
.block--active .block__element-2,
.block--active .block__element-3 {
    font-weight: bold;
}

如果元素直接位于块中,则子选择器有效:

.block--active {
    background-color: green;
}
.block--active > .block__element-2,
.block--active > .block__element-3 {
    font-weight: bold;
}

或平面解决方案(但不是 DRY):

.block--active {
    background-color: green;
}
.block__element-2--active,
.block__element-3--active {
    font-weight: bold;
}

使用 SCSS,有几种方法可以编写第一个解决方案。这是我使用的:

.block {
    &--active {
        background-color: green;
    }
    &--active &__element-2,
    &--active &__element-3 {
        font-weight: bold;
    }
}

another solution here

【讨论】:

    猜你喜欢
    • 2019-09-30
    • 2020-01-02
    • 2020-09-25
    • 2017-11-11
    • 2015-08-16
    • 2020-04-11
    • 2012-02-03
    • 1970-01-01
    • 2015-12-29
    相关资源
    最近更新 更多