Почему BEM часто использует два подчеркивания вместо одного для модификаторов?

в BEM я понимаю, что с модификаторами два тире имеет смысл, чтобы вы могли различать модификатор в my-block-my-modifier с my-block--my-modifier.

но зачем использовать block__element вместо block_element?

4 ответов


двойное подчеркивание используется для определения подэлемента блока.

Я.е:

<nav class="main-nav">
    <a class="main-nav__item" href="#">Text</a>
</nav>

здесь main-nav блок & main-nav__item - это вспомогательный элемент.

это делается потому, что некоторые люди могут назвать свой блок так main_nav что создаст путаницу с одним подчеркиванием, как это:main_nav_item

поэтому двойное подчеркивание прояснит такие вещи: main_nav__item.


Я собираюсь ответить 2nd @Imran Bughio, но я пытаюсь еще больше прояснить проблему.

на стандартный стиль БЭМ, одиночные подчеркивания зарезервированы для модификаторы. Кроме того, они обычно представляют собой комбинацию пар ключ/значение. Е. Г.

.block_align_vertical
.block_align_horizontal
.block__element_size_big
.block__element_size_small

это в отличие от изменен синтаксис BEM отстаивается инуитов.в CSS например, которые являются логическими.

.block--vertical
.block--horizontal
.block__element--big
.block__element--small

из моего опыта при использовании измененного синтаксиса вы быстро сталкиваетесь с ограничениями выражения. Е. Г. если вы хотели написать

.block--align-vertical
.block--align-horizontal
.block__element--size-big
.block__element--size-small

отношение ключ/значение не будет уникальным, если вы попытаетесь описать ключ, такой как background-attachment что привело бы к

.block__element--background-attachment-fixed

еще одним дополнительным преимуществом является то, что вы можете использовать библиотеки на основе стандартный соглашение об именах для дополнительной производительности в рабочем процессе:


также стоит упомянуть, что синтаксис BEM не навязывается нам, и если вы найдете другой синтаксис, который вы найдете более читаемым, то непременно идите с этим. Важно непротиворечивость, обеспечивающая работу других разработчиков с тем же синтаксисом.

пример альтернативного синтаксиса используется в КОСТЮМ CSS Николас Галлахер. Который использует следующий синтаксис.

ComponentName
ComponentName--modifierName
ComponentName-elementName
ComponentName.is-stateOfComponent

вы можете прочитать больше здесь костюм CSS именования условности


потому что чьи блоки могут быть дефисом или подчеркиванием, например:

.site-search {} /* Block */
.site-search__field {} /* Element */
.site-search--full {} /* Modifier */

или

.site_search {} /* Block */
.site_search__field {} /* Element */
.site_search--full {} /* Modifier */