2021/10/11 (更新日:2022/9/10)
Sass,scssとBEMでスタイルを定義する書き方、BEMの命名規則とは?【初心者向け】
CSS,SCSSで適したクラス名をつけるのに迷いませんか?
クラス名の命名規則を決めるBEM: Block Element Modifierの考え方を説明します。
BEMと相性が良いSassを使ったスタイルの書き方を説明します。
定義したコードを再利用して理解し易いコードが書けるようになります。
私も、開発が楽なので状況に応じてBEMとSassを使ってコードを書くようになりました。
目次
1.SCSSとBEMでスタイルを定義する書き方、BEMの命名規則とは?
2.BEMでスタイルを定義する考え方、命名規則の基本
3.BEMの命名規則でスタイルを定義する書き方
4.BEMの命名規則に従ってSCSSでスタイルを書いてみる
5.まとめ
【ここでお知らせ】
Sassが、LibSassからDartSassに移行していくことになります。
DartSassでの変更項目をまとめた記事は下記を参照ください。
初心者がLibSassをDartSassに移行する方法【@useと@forwardを使いこなす】
1.SCSSとBEMでスタイルを定義する書き方、BEMの命名規則とは?
BEMとは、
Block(かたまり)、Element(要素)、Modifier(修飾)、の略語です。
class名の命名規則が特徴的なCSS設計方法です。
何故、クラスの命名規則を決めるBEMが使われるのでしょうか?
1-1. CSSでスタイルを充てるときの課題
課題1)CSSでスタイルを充てていて、CSSの指定量が多くなり複雑になってくると「どのCSSがどこのHTMLに対応しているか」わからなくなってきます。
課題2)CSSのスタイルが反映されず、「!important」を多用してしまうことがあります。
スタイルの詳細度が把握できず優先度がわからない為です。
課題3)他人が見たらさっぱりわかりません。
1-2. BEMを利用する目的
課題を解決してBEMを利用する目的は、
目的1)設計時に生じる名前の衝突を避ける。
目的2)頭の中を整理してCSSを設計することで開発スピードを速くする。
目的3)作成したコードがメンテナンスし易く、再利用して効率的に開発する。
目的4)他人も理解し易いコードを書く。
2.BEMでスタイルを定義する考え方、命名規則の基本
2-1. BEMの概念
BEMは、 Block、Element、Modifier、の役割が決まっています。
名前をつけて使います。
(1)Block、は大枠となる独立した要素
HTMLでは、Blockはどこにでも設定でき、Blockを他のBlock内にも設定できます。
CSSでは、BlockをBlockに入れ子にして書きません。
なぜなら、Blockは完全に独立したものです。
Blockを別の場所に移動しても、単体で動作する必要があるからです。
Blockは何度も繰り返し使うことが考えられます。
そのためBlockを識別するためにはid属性を使わずclass属性を利用します。
(2)Elementは、Block中の要素
ElementはBlockの構成要素で、そのElementが属するBlock内でのみ意味を持ちます。
Elementのclass名は、必ず所属するBlock名を含んだclass名にする必要があります。
(3)Modifierは、BlockやElementのスタイル
BlockやElementと目的が違い、スタイルや動作などの違いを示します。
Modifierのclass名は、必ず所属するElement名を含んだclass名にする必要があります。
*混乱するので、Block名を含んだclass名は避けるのをお勧めします。
3.BEMの命名規則でスタイルを定義する書き方
3-1. BEMの命名規則
①Block名
単体の名前
.block
②Element名
blockとelementはアンダースコア2つで区切る
アンダースコア2つ で区切る
.block__element
③Modifier名
Elementとmodifierはハイフン2つで区切る
ハイフン2つ で区切る
.element–modifier
③名前の付け方
block, element, modifierの名前が複数単語の場合、
単語と単語の間はハイフン1つで区切る
= ただの単語の区切り は、ハイフン1つで区切る
1stname-2ndname
3-2. 命名規則の考え方
命名で注意する項目は、明確で、わかりやすく、管理しやすい名前にすることです。
*BEMの詳細は、BEMの公式ドキュメントを参照ください。
4.BEMの命名規則に従ってSCSSでスタイルを書いてみる
4-1. Elementの書き方
Elementは、「&」アンパサンドで親セレクタ名を参照して、ネストして定義する。
HTML
<div class="block-examlpe1">
<div class="block-examlpe1__element-1">
メインコメント1
</div>
</div>
SCSS
.block-examlpe1 {
color:red;
&__element-1 {
font-size: 20px;
}
}
CSS
.block-examlpe1 {
color: red;
}
.block-examlpe1__element-1 {
font-size: 20px;
}
4-2. Element内のElementの書き方
Elementは、blockを親にしてネストして定義する。
HTMLの構造に関係なく、HTMLとSCSSの関係は分離して考える。
HTML
<div class="block-examlpe1">
<div class="block-examlpe1__element-1">
メインコメント1
<div class="block-examlpe1__element-12">サブコメント1</div>
</div>
</div>
SCSS
.block-examlpe1 {
color:red;
&__element-1 {
font-size: 20px;
}
&__element-12 {
font-size: 16px;
}
}
CSS
.block-examlpe1 {
color: red;
}
.block-examlpe1__element-1 {
font-size: 20px;
}
.block-examlpe1__element-12 {
font-size: 16px;
}
誤りの書き方⇒
やってはいけないSCSSの書き方
✖ htmlの構造に関係つけて、
「element内でさらにelementをネストして定義」
するのは NG です。
.block-examlpe1 {
color:red;
&__element-1 {
font-size: 20px;
&__element-12 {
font-size: 16px;
}
}
}
4-3. Modifierの書き方
Modifierは、「&」アンパサンドで親セレクタ名を参照して、ネストして定義する。
注意[赤字部]:
Modifierで定義するスタイルはElementで定義している内容も書く。
=「font-size:20px;は再度書く」
HTML
<div class="block-examlpe1">
<div class="block-examlpe1__element-1">
メインコメント1
<div class="block-examlpe1__element-12">サブコメント1</div>
</div>
<div class="block-examlpe1__element-1--blue">
メインコメント2
<div class="block-examlpe1__element-12">サブコメント2</div>
</div>
</div>
SCSS
.block-examlpe1 {
color:red;
&__element-1 {
font-size: 20px;
&--blue{
font-size: 20px;
color:blue;
}
}
&__element-12 {
font-size: 16px;
}
}
CSS
.block-examlpe1 {
color: red;
}
.block-examlpe1__element-1 {
font-size: 20px;
}
.block-examlpe1__element-1--blue {
font-size: 20px;
color: blue;
}
.block-examlpe1__element-12 {
font-size: 16px;
}
4-4. 少し難しいModifierの書き方
共通部分は、placeholder selectorを使って一箇所にまとめる。
modifierにはelementに対する差分のみを記述するようにする。
HTML
<div class="block-examlpe1">
<div class="block-examlpe1__element-1">
メインコメント1
<div class="block-examlpe1__element-12">サブコメント1</div>
</div>
<div class="block-examlpe1__element-1--blue">
メインコメント2
<div class="block-examlpe1__element-12">サブコメント2</div>
</div>
<div class="block-examlpe1__element-1--green">
メインコメント3
<div class="block-examlpe1__element-12">サブコメント3</div>
</div>
<div class="block-examlpe1__element-1--yellow">
メインコメント4
<div class="block-examlpe1__element-12">サブコメント4</div>
</div>
</div>
SCSS
.block-examlpe1 {
color:red;
%__element-1 {
font-size: 20px;
}
&__element-1 {
@extend %__element-1;
&--blue{
@extend %__element-1;
color:blue;
}
&--green{
@extend %__element-1;
color:green;
}
&--yellow{
@extend %__element-1;
color:yellow;
}
}
&__element-12 {
font-size: 16px;
}
}
CSS
.block-examlpe1 {
color: red;
}
.block-examlpe1 .block-examlpe1__element-1,
.block-examlpe1 .block-examlpe1__element-1--blue,
.block-examlpe1 .block-examlpe1__element-1--green,
.block-examlpe1 .block-examlpe1__element-1--yellow {
font-size: 20px;
}
.block-examlpe1__element-1--blue {
color: blue;
}
.block-examlpe1__element-1--green {
color: green;
}
.block-examlpe1__element-1--yellow {
color: yellow;
}
.block-examlpe1__element-12 {
font-size: 16px;
}
5.まとめ
命名規則BEMをを使ってSassでスタイルを表現する手順を説明しました。
BEMとSassは相性が良いので効率的にWebsite作成ができると思います。
しかし、BEM・Sassを絶対に使わない人もいます。
Websiteに適した開発方法を選んでブログを楽しんでください。
*最後まで読んでいただきありがとうございます。
舌足らずで説明不足の所はお許しください。
また、改良項目・修正項目がございましたらご指摘いただけたら幸いです。
Copyright – Seiji Nakamura, 2021 All Rights Reserved.