BEMブロック、ネーミング&ネスト
質問
BEM の命名規則について理解しようとしています。私はこれで立ち往生しています。私は何かを誤解しているかもしれません、見てみましょう。
私はサイドバーナビとコンテンツナビを持っています。
私のサイドバーナビは次のようになります。
<div class="sidebar">
<ul class="sidebar__nav">
<li class="nav__item"><a href="#" class="nav__link">LINK</a></li>
<li class="nav__item"><a href="#" class="nav__link">LINK</a></li>
</ul>
</div>
そして、コンテンツナビは以下のようになります。
<div class="content">
<ul class="content__nav">
<li class="nav__item"><a href="#" class="nav__link">LINK</a></li>
<li class="nav__item"><a href="#" class="nav__link">LINK</a></li>
</ul>
</div>
今、私は.nav__itemをスタイルする場合、問題に遭遇するでしょう、それらは私の両方のナビゲーションに発生し、同じスタイルを持ってはいけません。ここでネストすべきなのか、それともブロックや要素の命名が間違っているのでしょうか?
CSSでの入れ子の例です。
.content__nav .nav__item { background: Red; }
それともこんな名前にすればいいのかな。
<li class="content__nav__item"><a href="#" class="content__nav__link">LINK</a></li>
助けてくれますか?
どのように解決するのですか?
BEMクラスの書き方には多くのバリエーションがあり、複数の規格が競合していることに注意してください。これは、緩やかなガイドラインとして始まりました。この回答を投稿して以来 Yandexは公式規格を大幅に見直しました。 (を大幅に見直しました(かなり改善されています)。私が使用しているBEMのバージョンは、以下のものに大きく基づいています。 Nicolas Gallagherによる記事 .
このとき、私は アトミックOOBEMITLESS" これは、クラスがモジュール化され、名前空間があり、セレクタが低い特異性を持ち、状態がクラスで切り替えられ、CSS が拡大縮小できることを示すもので、CSS プリプロセッサの上に乗って、コードをより簡潔で表現豊かにしています。
以上のことから、私は以下の BEM 標準を使用することにします。
-
ハイフン付きのクラス名をブロックとして使用します。
foo-bar
-
ブロック名の後に
__
の後に要素のためのハイフンされたクラス名が続きます。
foo-bar__fizz-buzz
-
ブロック名や要素名の後に
--
の後に、修飾子としてハイフンで繋がれたクラス名が続きます。
foo-bar--baz
,foo-bar--baz__fizz-buzz
,foo-bar__fizz-buzz--qux
BEMの短縮形。
block-name__element-name--modifier-name
サンプルには3種類のブロックがありますね。
-
sidebar
を持つsidebar__nav
要素で構成されます。 -
content
を持ち、その中にcontent__nav
要素で構成されます。 -
nav
を持つnav__item
とnav__link
要素
を使用した
sidebar
と
content
のブロックは、同じブロックのバリエーションのように見え、次のように表すことができます。
.region.region--sidebar
と
.region.region--content
.
は
nav
ブロックは、暗黙のうちに
ul
要素で暗黙的に定義されているため、明示的に定義する必要があります。
<ul class="nav"><!-- could be content__nav or sidebar__nav as well if you choose -->
<li class="nav__item"><a href="#" class="nav__link">LINK</a></li>
<li class="nav__item"><a href="#" class="nav__link">LINK</a></li>
</ul>
を指定したら
ul
要素が
nav
ブロックの中にあるのであれば、それは理にかなっています。
nav
ブロックが修正されます。
<ul class="nav nav--content">
<li class="nav__item nav--content__item"><a href="#" class="nav__link nav--content__link">LINK</a></li>
<li class="nav__item nav--content__item"><a href="#" class="nav__link nav--content__link">LINK</a></li>
</ul>
CSSのクラスが設定できたら、スタイリングの
全て
nav__item
の要素は単純に
.nav__item {
...styles here...
}
で、これらのスタイルをコンテンツに上書きする
nav__item
の要素は
.nav--content__item {
...styles here...
}
関連
-
[解決済み] 画像の横のテキストを縦に揃える?
-
[解決済み] div' コンテナに合わせて画像を自動リサイズするにはどうしたらいいですか?
-
[解決済み] CSSでdivのアスペクト比を維持する
-
[解決済み] inline/inline-block要素間のスペースを削除するにはどうすればよいですか?
-
[解決済み] divブロック内のテキストを(水平方向と垂直方向に)センタリングするにはどうすればよいですか?
-
[解決済み] mailto:を使ってメールの件名や内容を設定することはできますか?
-
[解決済み] フレックスアイテムを右寄せにするには?
-
[解決済み] ラジオボタンをデフォルトで選択するには?[重複しています]
-
[解決済み] localStorage、sessionStorage、session、cookieの違いは何ですか?
-
[解決済み] 残りの幅を埋めるためにdivを展開する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] CSSでcellpaddingとcellspacingを設定する?
-
[解決済み] リンクのように動作するHTMLボタンを作成する方法
-
[解決済み] チェックボックスとそのラベルをクロスブラウザーで一貫して揃える方法
-
[解決済み] Sublime Text 2を使ってHTMLコードを再フォーマットするにはどうしたらいいですか?
-
[解決済み] HTMLにPDFを埋め込むおすすめの方法とは?
-
[解決済み] divの内容を下に揃える方法
-
[解決済み] WebSocketとサーバー送信型イベントの比較/EventSource
-
[解決済み] HTMLでBase64画像を表示する方法
-
[解決済み] HTMLアンカーは'name'と'id'のどちらで作成するのが良いですか?
-
[解決済み] マークダウンにおける相互参照 (名前付きアンカー)