HTML と CSS を切り離すために BEM 手法を使い始めましたが、ほとんどの場合、うまく機能しています。あくまで個人的な意見ですが、他の人がどう対処しているか知りたいです。
簡単なナビゲーションを構築する必要があるとしましょう。HTML は次のようになります。
<nav class="nav">
<ul class="nav__list">
<li class="nav__item">
<a class="nav__link" href=""></a>
</li>
<li class="nav__item">
<a class="nav__link" href=""></a>
</li>
</ul>
</nav>
「.nav_ item」と「.nav _link」が必要なのか、それとも代わりにこれを使用した方がよいのかわかりません
.nav__list > li { CODE }
しかし、私の本当の問題は、「アクティブな」クラスをどのように処理するかです (ナビゲーションだけでなく、一般的に)。「.nav_ item--active」のような特定の「アクティブな」クラスを使用する方がよいので、CSS ファイル内で単一のクラスを使用できますか、それとも「.is-active」のようなより一般的なクラス名を使用する方がうまくいくでしょうか? ただし、「.nav _item.is-active」または (私にはさらに悪いように見えます)「.nav__list > .is-active」のように、CSS ファイル内でクラスを指定する必要があります。
どの方法にも欠点があります。BEMを使用している場合、2番目の方法は間違っているように見えますが、最初の方法を使用する場合、特定のクラス名をJSに「ハードコード」する必要があるため、JSで「トラブル」に遭遇します
someElement.addClass(".nav__item--active");
そうすれば、あなたの JS は HTML 構造に依存しすぎます (または、これはあまり重要ではありませんか?)。これは変更される可能性があります...そして、これは 2 番目の質問につながります。HTML と CSS だけでなく、HTML と JS もデカップリングするとよいと聞きました。したがって、たとえば、これらの「.js-」クラスを使用して、「スタイリング」クラスを使用してそのようなイベントをトリガーする代わりに、クリックイベントやそのようなすべてのものを要素に追加できます。したがって、使用する代わりに
<button class="btn btn--large"></button> // $(".btn--large") in jQuery
あなたが持っているだろう
<button class="btn btn--large js-dostuff"></button> // $(".js-dostuff") in jQuery
これを HTML5 のデータ属性と組み合わせると、たいていの場合はうまくいくと思いますが、ナビゲーションやアコーディオンなどはどうなるのだろうかと自問自答しています。それらの「.js-」クラスも(アイテムごとに)使用する方が保守性に優れていますか?
<nav class="nav">
<ul class="nav__list">
<li class="nav__item js-open-subnav">
<a class="nav__link" href=""></a>
<ul class="nav__sub">
<!-- ... -->
</ul>
</li>
</ul>
</nav>
または、この場合、JSで $(".nav__item")... を使用する必要がありますか? しかし、そうすると、HTML と JS を実際に切り離すことはできません (少なくとも、このトピックを理解している限り)。ナビゲーションだけでなく、アコーディオンやスライダーなど、あらゆる種類の JavaScript インタラクションが対象です。
皆さんがこれらの質問に対するベスト プラクティスを共有し、私を助けてくれることを願っています。
ありがとう