为什么BEM经常使用两个下划线而不是一个用于修饰符?

Gil*_*man 20 css bem

在BEM,据我所知,使用修改器,两个破折号是有道理的,这样就可以在区分修改my-block-my-modifiermy-block--my-modifier.

为什么用block__element而不是block_element

Imr*_*hio 39

Double Underscore用于定义块的子元素.

即:

<nav class="main-nav">
    <a class="main-nav__item" href="#">Text</a>
</nav>
Run Code Online (Sandbox Code Playgroud)

main-nav块在哪里&main-nav__item是子元素.

这样做是因为有些人可能会像这样命名他们的块main_nav,这会产生与单下划线的混淆,如下所示:main_nav_item

因此,双下划线将澄清这样的东西:main_nav__item.


小智 9

我要回到第二个@Imran Bughio的回答,但我正在努力进一步澄清这个问题.

标准 BEM样式中,单个下划线保留用于修改器.此外,它们通常代表键/值对的组合.例如

.block_align_vertical
.block_align_horizontal
.block__element_size_big
.block__element_size_small
Run Code Online (Sandbox Code Playgroud)

这与由inuit.css支持的修改的 BEM语法形成对比,例如,它是布尔值.

.block--vertical
.block--horizontal
.block__element--big
.block__element--small
Run Code Online (Sandbox Code Playgroud)

根据我使用修改后的语法的经验,您很快就会遇到表达式限制.例如,如果你愿意写

.block--align-vertical
.block--align-horizontal
.block__element--size-big
.block__element--size-small
Run Code Online (Sandbox Code Playgroud)

键/值关系不是唯一的,如果你试图描述一个键,例如background-attachment哪个键会导致

.block__element--background-attachment-fixed
Run Code Online (Sandbox Code Playgroud)

另一个额外的好处是,您可以使用基于标准命名约定的库来提高工作流程的工作效率:


Col*_*con 6

还值得一提的是,BEM语法不是强加给我们的,如果你发现另一种你发现更具可读性的语法,那么一定要用它.重要的是一致性,确保其他开发人员使用相同的语法.

使用替代语法的一个例子是Nicolas Gallagher的SUIT CSS.其中使用以下语法.

ComponentName
ComponentName--modifierName
ComponentName-elementName
ComponentName.is-stateOfComponent
Run Code Online (Sandbox Code Playgroud)

您可以在这里阅读更多SUIT CSS命名约定