この記事は僕のポエムであり、夢です。
温かい目で見守ってください。
BEMのModifierの(僕が感じている)問題
BEMについての説明は省きます。詳しくはこことかを参考にお願いします。
簡単な例を上げます。
.navigation {
// ...
&__item {
// ...
&#{&}_selected {
// ...
}
}
}
こんな感じにscss
を書いたとしましょう。
そうするとHTML
は
<div class="navigation">
<div class="navigation__item">Menu1</div>
<div class="navigation__item">Menu2</div>
<div class="navigation__item">Menu3</div>
<div class="navigation__item navigation__item_selected">Menu4</div>
</div>
こんな感じになるでしょうね。
それで僕の不満な点は、
navigation__item navigation__item_selected
この部分です。
何故不満なのか。
- 長い。読みづらい。
-
__
と_
の違いを常に意識していないと、element
かmodifier
なのかわからなくなる。
といったところでしょうか。
長い。読みづらい点について
selected
というmodifier
を付けたいためだけに、block__element
をもう一度書かないといけなくなります。
b_等のBEMのクラス名をいい感じに構築するものもありますが、結局ほとんど同じように記述しないといけません。
またただクラス名を構築するためだけにJSを実行させるのも少し癪です。
しかもその殆どのクラス名は動的に変わることは無いはずです(上の例だとほとんどが動的に変わる可能性がありますが・・・)。
上の例はコード自体が少ないのでまだ見通しがいいのですが、
もっと長いものがたくさん出てくるかと思います。
またもしかしたらmodifier
が複数個付く場合…
考えるだけであれですね…
element
かmodifier
なのかわからなくなる点について
block
自体にmodifier
がついた場合、パット見でわからなくなるかと思います。
実際自分がやっている仕事や、個人的なものでも自分が命名規則を決めて、管理しているにもかかわらずどっちがどっちかわからなくなることがあります。
これは__
,_
を工夫することで回避できることですが、**そもそもそこを工夫しないといけないってなんだよ!!!**と思います。
ではどうするべきか
modifier
の表現はカスタムデータ属性を使えばいいのでは。という考えに行き着きました。
.navigation {
// ...
&__item {
// ...
&[data-selected] {
// ...
}
}
}
<div class="navigation">
<div class="navigation__item">Menu1</div>
<div class="navigation__item">Menu2</div>
<div class="navigation__item">Menu3</div>
<div class="navigation__item" data-selected>Menu4</div>
</div>
modifier
はカスタムデータ属性に押し込み、class
はelement
またはblock
に集中することができます。
こうすることで、同じ名前をn回書いたりしてなが~いclass
を書くこともなくなり、また__
?_
?どっちだっけなんだっけ?みたいなことも起きなくなります。
それ以上にこれの利点は、
-
class
には表示されるもの、block
またはelement
が記述されるところ。 - カスタムデータ属性には、状態・少しの見栄えの違い、
modifier
を記述するところ。
と考え方を分けることができることだと思います。
まとめ
BEM自体は僕は好きですし、とても良い考えだと思ってます。
ですが、融通が利かないというか煩わしい思いもすることがあります。
BEMはあくまで設計手法、命名規則なのでそこから少し外れて、こうするといいのでは!と思うところはどんどん改善していくといいのかなぁ。とこれを考えながら思いました。
まぁBEMに限らず言えることだと思いますが…
これで終わりにしたいと思います。
ここまで読んでいただきましてありがとうございます。
またこういうふうに書いたほうがもっといいよ!という意見がありましたら、教えていただけますとありがたいです