В BEM я понимаю, что с помощью модификаторов две тире имеют смысл, так что вы можете отличить модификатор в my-block-my-modifier
с помощью my-block--my-modifier
.
Но зачем использовать block__element
вместо block_element
?
В BEM я понимаю, что с помощью модификаторов две тире имеют смысл, так что вы можете отличить модификатор в my-block-my-modifier
с помощью my-block--my-modifier
.
Но зачем использовать block__element
вместо block_element
?
Double Underscore используется для определения подэлемента блока.
то есть:
<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
.
Я собираюсь ответить на второй ответ @Imran Bughio, но я пытаюсь прояснить эту проблему.
В стандартном стиле BEM отдельные символы подчеркивания зарезервированы для модификаторов. Кроме того, они обычно представляют собой комбинацию пар ключ/значение. Например.
.block_align_vertical
.block_align_horizontal
.block__element_size_big
.block__element_size_small
Это в отличие от модифицированного синтаксиса BEM, защищенного inuit.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
Другим дополнительным преимуществом является то, что вы можете использовать библиотеки на основе стандартного соглашения об именах для повышения производительности в рабочем процессе:
Стоит также упомянуть, что синтаксис БЭМ нам не навязан, и если вы найдете другой синтаксис, который вы найдете более читабельным, тогда непременно сделайте это. Важная вещь - последовательность, гарантирующая, что другие разработчики работают с тем же синтаксисом.
Примером использования альтернативного синтаксиса в SUIT CSS является Николас Галлахер. Который использует следующий синтаксис.
ComponentName
ComponentName--modifierName
ComponentName-elementName
ComponentName.is-stateOfComponent
Вы можете прочитать больше здесь SUIT CSS именования
Поскольку блоки могут быть дефисными или нижними символами, например:
.site-search {} /* Block */
.site-search__field {} /* Element */
.site-search--full {} /* Modifier */
или
.site_search {} /* Block */
.site_search__field {} /* Element */
.site_search--full {} /* Modifier */
В соответствии с соглашением об именах БЭМ, одно подчеркивание имеет два других использования,
- Имя модификатора отделяется от имени блока или элемента одним подчеркиванием (_).
- Значение модификатора отделяется от имени модификатора одним подчеркиванием (_).
Так что для ветки имени элемента от имени блока делается двойное подчеркивание.
Имя элемента отделяется от имени блока двойным подчеркиванием (__).