BEMでは、修飾子を使用すると、my-block-my-modifier
の修飾子とmy-block--my-modifier
を区別できるように、2つのダッシュが意味を持つことを理解しています。
しかしなぜblock__element
の代わりにblock_element
を使用するのですか?
二重下線は、ブロックのサブ要素を定義するために使用されます。
つまり:
<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
。
2番目の@ImranBughioの回答に行きますが、問題をさらに明確にしようとしています。
standardBEM style では、単一の下線は修飾子用に予約されています。また、これらは通常、キーと値のペアの組み合わせを表します。例えば。
.block_align_vertical
.block_align_horizontal
.block__element_size_big
.block__element_size_small
これは、たとえばブール値である inuit.css によって支持されるmodifiedBEM構文とは対照的です。
.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
もう1つの追加の利点は、ワークフローの生産性を高めるために、標準命名規則に基づいてライブラリを使用できることです。
また、BEM構文が強制されていないことにも言及する価値があります。読みやすい別の構文を見つけた場合は、必ずそれを使用してください。重要なのは一貫性であり、他の開発者が同じ構文で作業できるようにします。
使用される代替構文の例は、Nicolas Gallagherによる 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 */
BEM命名規則 によると、単一のアンダースコアには他に2つの使用法があります。
- 修飾子名は、単一の下線(_)でブロック名または要素名から区切られます。
- 修飾子の値は、1つのアンダースコア(_)で修飾子名から区切られます。
したがって、要素名をブロック名から分離するために、二重下線が付けられます。
要素名は、二重下線(__)でブロック名と区切られています。