我们说我有以下设置,
.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 {
}
}
}
答案 0 :(得分: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;
}
}