BEMでのCSS設計

CSS
スポンサーリンク

BEMでのCSS設計

少しCSSに慣れてきたので、CSS設計も勉強してみたいな。

web制作会社でBEMやFLOCSSを推奨しているから、必要かな?

ちょっと勉強してみよう!

CSS設計完全ガイド ~詳細解説+実践的モジュール集

CSS設計完全ガイド ~詳細解説+実践的モジュール集

こちらの本の一部を要約して、ブログを書きました。

とてもおすすめされてる方が多く、web制作のお仕事する人は、必読書かもしれません。ただ内容が細かいので、少しcssに慣れてきた人向けかもしれません。

私もまだ全部読めていませんが、頑張って読んでいます♪

CSS設計とは?

そもそもCSS設計とは何なのか?なぜ必要なのか?

CSSは、グローバルスコープ(すべてのスタイルが干渉し合う状態)のため、
ページ数が増えると、CSSが複雑になり管理しにくくなる。

CSS設計は、いかにCSSを管理しやすく保つか、先人の知恵が詰まったもの。

CSS設計の目指すもの

・予測できる

・再利用できる

・保守できる

・拡張できる

BEMとは?

色々ある設計手法のひとつです。(OOCSS, SMACSS, BEM, PRECSSなど)
BEMは、他の設計手法よりも厳格だそうです。

BEMは、Block Element Modifierの略です。

このBlock Element Modifierを、BEMエンティティと呼びます。

Blockの中に、Element、Modifier、Blockを置けます。

Elementは、Blockの中でのみ使います。Elementの中にElementも置けます。

Modifierは、BlockもしくはElementの中でのみ使います。

BEMの基本

詳細度を高めない、詳細度を均一にする。

要素型セレクターやIDセレクターは推奨されていない。

クラスセレクターを基本つかう。

× 要素型セレクター
a {}
a.button {}

× IDセレクター
#button {} 

○ クラスセレクター
.button {}

クラス名は半角英数字の小文字をつかう

・クラス名は半角英数字の小文字をつかう。

・複数の単語の場合、ハイフンを使う。例)blockname

block-name__element-name_modifier-name

blockelementはアンダースコア2つでつなぐ。

modifierはアンダースコア1つでつなぐ。

Blockの基本

「どこでも使い回せる」パーツにする

なので、レイアウトに関するスタイルは避ける

(position, marginなど)

クラス名は「それが何か」を表すものにする

「見た目」での名前は避ける。

例)


× 赤いテキスト
.red-text {}


○ エラーである
.error {}

ブロックの中に、ブロックをネストすることは可能

ブロックの中に、ブロックを設置。

Elementの基本

Blockの中でのみ使えるパーツ

なので、Blockの外では見た目が同じ場合も、使用しない。

Element名の書き方

Element名は、Blockの名前を継承し、かつアンダースコア2つでつなげる。

例)


.menu__item {}

.global-nav__item {}

クラス名は「それが何か」を表すものにする

「見た目」での名前は避ける。

例)

×
.menu__red {}

○
.menu__item {}

Elementをネストした命名は避ける

命名だけであって、ネスト自体は可能。

×
.menu__item__link {}

○
.menu__link {}
.menu__item {}

Modifierの基本

Block、Elementのオプション要素

Block、Elementの見た目や状態をあらわす。

単独で使用しない

Block、Elementのクラス名のある、2つ目のクラス名として使用する。

アンダースコアひとつで繋げる。

例)

Block、Block_Modifier

<a class="button button_size_m"></a>

Block__Element、Block__Element_Modifier

<li class="menu__item menu__item_active"></li>

複数のModifier

ハイフンで繋げる。modifier-name

block-name__element-name_modifier-name

キーと値の場合

アンダースコアで繋げる。

Block_kye_値

.button_size_m

クラス名は「それがどうであるか」を表すものにする

BlockやElementが、「それが何であるか」に対して、

Modifierは、「それがどうであるか」がわかる名前をつけるようにします。

Modifierは、2つのタイプどちらかになる

真偽値(状態をあらわす、一語で完結)

例)_focusedや、_activeなど

.menu__item_focused

.menu__item_active

キーと値のペア(「何がどうであるか」を表す)

キーと値のペアは、アンダースコアでつなぐ。size_mなど

(※複数単語はハイフン。color-themeなど )

例)button_size_m 「サイズがmである」

.button_size_m

Modifierの衝突をさける

ひとつのBlock、Elementに複数のModifierをつけられる。

むしろ切り分けて使う方が、衝突を避けられてよい。

.button_size_m (widthなどの設定のみ)

.button_theme_caution (色などの設定のみ)

※色に関してBEMは「見た目の色」ではなく「どのような意味か」でつける。

× 赤い
button_color_red 

○ 警告
button_theme_caution 

Modifier名は省略しないようにする

長くなってしまうけれど、Block名やElement名を、省略しないようにします。

省略すると、クラス名が衝突してしまいます。

×
.size_m 
.size_s

○
button_size_m

Mixの基本

Mixとは?

「単一のDOMノードに、異なるBEMエンティティが複数付加されたインスタンス」

ひとつの要素に、役割の異なる複数のクラスをつけることを指す。

Mix

(BlockとBlock)

<header class="header text"></header>
<footer class="footer text"></footer>

(BlockとElement)

<div class="head">
  <div class="menu head__menu"></div>
</div>

(ElementとElement)

<div class="head">
  <div class="head__item head__menu"></div>
</div>

Mixは、レイアウトに関するスタイルのときに使う

Modifierを使うか、Mixを使うか迷ったら、

レイアウトに関するスタイルのときに使うようにします(positionやmarginなど)

例)Blockの中に、Blockを配置しているとき

<div class="head">
  <div class="menu"></div>
  <div class="logo"></div>
</div>

Mixを使って、2つめのクラスをつける。(BlockとElementのMix)

<div class="head">
  <div class="menu head__menu"></div>
  <div class="logo head__logo"></div>
</div>

余白をつけるのは、Blockのmenuではなく、 head__menu につける。

複数に切り離すことによって、詳細度を高めず、再利用性が高められる。

Mixは、グループセレクターのかわりにも使える

headerとfooterのフォントやサイズなど、共通で使いたい時、
textというMixを使って設定することもできます。

<header class="header text"></header>
<footer class="footer text"></footer>

まとめ

・CSS設計の目指すところは、①予測できる、②再利用できる、③保守できる、④拡張できる

・BEMは、CSS設計手法のひとつで、Block Element Modifierの略です。

・blockとelementはアンダースコア2つでつなぐ。modifierはアンダースコア1つでつなぐ。(block__element_modifier)

・クラス名は「それが何か」を表すものにする。見た目での命名は避ける。

・詳細度を高めないため、要素型セレクターやIDセレクターは使わない。クラスセレクターを基本つかう。

・Mixは、ひとつの要素に複数のクラス名をつける。スタイルを複数に切り分けて使うことによって、詳細度を高めず、再利用性が高められる。

タイトルとURLをコピーしました