BEM的重点是区分元素(类名中以__为前缀)和修饰符(以--为前缀):
元素
没有独立意义的块的一部分,并且是
在语义上与其块相关联。
修饰符
块或元素上的标志。使用它们来改变外观
或行为。
在您的示例中,--heading、--subheading 和 --author 都不是元素的修饰符 - 它们是元素。如果出于某种原因,您决定对这些元素应用实际的修饰符(例如 highlighted 或 clickable),您最终要么完全重写类名 - 要么像 article__textbox--heading--clickable 这样有一些怪异。
现在,我在这里看到的真正问题是“好吧,这不是修饰符,但是我应该如何处理位于其他元素中的元素?”换句话说,哪些类名应该应用于嵌套在其他元素中的元素?这个问题其实是在BEM FAQ回答的:
问:如果我的块具有复杂的结构及其元素,我该怎么办
是嵌套的? CSS 类,如 block__elem1__elem2__elem3 看起来很吓人。
A:根据BEM方法,块结构应该是扁平化的;你做
不需要反映块的嵌套DOM结构。所以,班级
这种情况的名称是:
.block {}
.block__elem1 {}
.block__elem2 {}
.block__elem3 {}
...而块的 DOM 表示可能是嵌套的:
<div class='block'>
<div class='block__elem1'>
<div class='block__elem2'>
<div class='block__elem3'></div>
</div>
</div>
</div>
除了类看起来更好之外,它使元素只依赖于块。因此,在对界面进行更改时,您可以轻松地将它们移动到整个块中。块 DOM 结构的变化不需要对 CSS 代码进行相应的更改。
因此,在您的情况下,将它们设置为这样的样式可能会更好:
<div className="article">
<div className="article__textbox">
<h1 className="article__heading"></h1>
<p className="article__subheading"></p>
<span className="article__author"></span>
</div>
</div>
this article 中介绍的另一种方法是将文本框视为一个单独的块,并将其所有内容视为自己的元素:
<div className="article">
<div className="textbox">
<h1 className="textbox__heading"></h1>
<p className="textbox__subheading"></p>
<span className="textbox__author"></span>
</div>
</div>
请记住,这完全是关于 DRY:如果该文本框打算在其他块中重用,请将其视为块。引用同一篇文章:
当你不确定某件事是否是一个障碍时,问问自己:“可以
我将要添加到块中的这个 BEM 元素将用作
网站的其他区域?”