SlideShare a Scribd company logo
1 of 14
BEM記法
「HTMLコーディングする際のidやclassの命名規則」
 なぜBEMが必要か
 基本概念と命名規則
 BEMのメリット・デメリット
- 2014/05 Younju Park -
こんなコーディングに困ってませんか?
「タグ」、「id」、「class」が混在したスタイル指定や、深すぎる入れ子でコントロール不能。
場当たり的に「!important」を多用してリリース後の変更が困難になってませんか?
同じ見た目のまま見出しレベルを変えたいのに、「HTML」も「CSS」も両方修正し
更に見出しレベル毎に同じような記述をしてませんか?
パーツを場所の移動や複製したいだけで大掛かりな改修が必要になってませんか?
他の人の作ったサイトを改修しようとした時にどこを修正していいかわからない。
命名規則が独自すぎて意味が分からない。自分で書く時もどのように命名して
いいか迷って時間を浪費してませんか?
コピペで済むと思ったらHTML+CSS+JavaScript全部改修が必要になったという事はありませんか?
パーツの流用時、JavaScriptが動かない
制作者本人しかわからないclass名の命名規則
パーツを別の場所に流用すると表示が崩れる
汎用的に使えないスタイル
スタイルの優先順位のコントロール不能状態
BEMとは?
 「BEM」はBlock、Element、Modifierの略称
 HTMLコーディングの際のクラス名の命名規則(とっても特徴的)
 フロントエンド側(HTML/CSS/JavaScript)の総合設計に応用可能
 ファーストバージョン開発の高速化
 長期間メンテナンスでき、変更に強い設計
 チームのスケーラビリティ
 コードの再利用性向上
BEMはプロジェクトの成長とともに既存のページが変化していく事を前提とした設計です。
多くの人がかかわり、長く運用されるプロジェクト(コンパネ等)に向いています。
また、開発をすばやく行う事ができる為、キャンペーンなどの期間限定サイトでも有用です。
BEMの命名規則
block__element—modifier
 各要素をセパレーターで繋ぐ。
 全て小文字で記述。
 1つのタグに1つのclass(シングルクラス設計)。
elementsはアンダースコア2つ modifierはハイフン2つ
BEMを構成する3つの要素
Block(ブロック)
 Blockの構成要素。入力欄、ボタンなど。
 Elementが属するBlock内でのみ意味を持つ。
Element(エレメント)
 BlockやElementでスタイルが変わる時に使うもの。
 メニューの中で選択中のアイテムを違う色にする時など。
Modifier(モディファイア)
 Webページを要素ごとに区切ったもの。
BEM:Block(ブロック)
Tab 1 Tab 2 Tab 3 Tab 4 Tab 5
Search words
Search
================================
================================
================================
================================
================================
================================
Tab Menu Block
Search Block
Contents Block
Webページを要素ごとに区切ったもの。
Blockは完全に独立し、Blockを別の場所に移動しても、
単体で動作可能である必要がある。
左画面には大きく3つのBlock
が存在する
「Tab Menu Block」,
「Contents Block」,
「Search Block」。
また、「Contents Block」は
「Content Block」の繰り返し
でもある。
BEM:Elements(エレメント)
Tab 1 Tab 2 Tab 3 Tab 4 Tab 5 Search words
Search
================================
================================
Tab Menu Block Search Block
Content Block
Tab Elementsの繰り返し
imgとarticle Elements
inputとbutton Elements
Blockの下部要素であり、Blockを構成する要素。
Elementが属するBlock内でのみ意味を持つ。
BEM:Modifirer(モディファイア)
================================
================================
例)BlockのModifier
================================
================================
================================
================================
Tab 1 Tab 2 Tab 3 Tab 4
例)ElementsのModifier
「Tab 3」の画面
バリエーションの軸(例:行頭記号)や、状態(例:現在地)を表すプロパティの役割。
例えば、同じリストで、行頭記号が2種類以上存在する場合や、
同じメニュー内の「タブ」であっても、現在ユーザーがいるタブだけ、
見栄えを変える場合などに利用。
imgとarticle Elementsで構成されてい
るContent Blockについて、一部のみスタ
イルを変更して使用する場合
現在のTab Elementsの場合のみ、
スタイルを変更する場合
命名規則:Block__Element--Modifierの区切り
block※1 :ブロックのクラス名
block__element※2 :ブロック配下のエレメントのクラス名
block__element __element ※3 :エレメントが入れ子になる場合のクラス名
block__element—modifier :ブロック配下のエレメントの別の状態のクラス名
block—modifier :ブロックの別の状態のクラス名
block—modifier__element :ブロックの別の状態のエレメントのクラス名
<div class=“body”>※1
<div class=“body__menu”></div>※2
<div class=“body__contents”>
<div class=“body__contents__search”>※3
<input type=" search " class=“search-keyword”>
<input type="submit" value=“Search“ class=“button-search”>
</div>
</div>
<div>
HTML
※DOMの構成を再現する必要はありません。
BEM命名規則:単語の区切り
BlockやElement名を2つ以上の単語で表す場合は
「単語-単語」のように区切り文字にハイフンを使用。
<div class=“service-body”>
<div class=“service-body__main-menu”></div>
<div class=“service-body__main-menu--current-active”></div>
<div>
HTML
service-body__main-menu--current-active
BEM命名規則:注意点
再定義の可能性がある文字列をclass名として宣言しないこと。
親子関係が分かるように、クラス名はなるべく具体的に命名する。
 ×:box ○:login-box
 ×:box-text ○:login-notice
CSSの制御はclassのみ使用しidは使わない。idはJavaScript
のイベント用にだけ使う。
 classは複数同時使用や再使用が容易である。
 idはclassより反映優先順位が高く、idで宣言されたスタイルをclassで
上書きするのは容易ではない。
BEMのメリット
 コードの可読性が上がり、意味付けが簡単に出来る。
 HTMLとCSSは、いつでもデザインの変化に対応出来る。
 プログラマとフロントエンドエンジニア間で、お互いのコードの理解
力が上がる。
 各要素の命名が具体的であるため、メンバー間のコミュニケーショ
ンが取りやすく、メンテナンスや共同開発の効率が上がる。
 パーツ単位のコードの再利用が容易に出来る。
 画像ファイル名の命名規則にも応用可能。
BEMのデメリット
 記法が独特で気持ちが悪い(慣れの問題?)
 ElementやModifierの名前が冗長になりがち。
 対処1:命名規則の亜種を利用
セパレーターをアンスコ、ハイフン1つにし、
単語の区切りはキャメルケースにする。
「header__global-menu__link-tab—hover 」
→「header_globalMenu_linkTab-hover」
 対処2:良く使う長い単語の略称をチームで予め統一しておく
 icon → ico
 heder → hd
 mouseover → hov
冗
長
化
対
策
ありがとうございました!
END

More Related Content

What's hot

ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方増田 亨
 
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)Mikiya Okuno
 
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発慎一 古賀
 
Spring Bootをはじめる時にやるべき10のこと
Spring Bootをはじめる時にやるべき10のことSpring Bootをはじめる時にやるべき10のこと
Spring Bootをはじめる時にやるべき10のこと心 谷本
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Etsuji Nakai
 
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐO/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐkwatch
 
ドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したことドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したことBIGLOBE Inc.
 
MySQLバックアップの基本
MySQLバックアップの基本MySQLバックアップの基本
MySQLバックアップの基本yoyamasaki
 
MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話Yoshinori Matsunobu
 
Chapitre 5 classes abstraites et interfaces
Chapitre 5  classes abstraites et interfacesChapitre 5  classes abstraites et interfaces
Chapitre 5 classes abstraites et interfacesAmir Souissi
 
ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方増田 亨
 
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかKoichiro Matsuoka
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)Yoshitaka Kawashima
 
20160526 依存関係逆転の原則
20160526 依存関係逆転の原則20160526 依存関係逆転の原則
20160526 依存関係逆転の原則bonjin6770 Kurosawa
 
Memcachedの仕組みと設定
Memcachedの仕組みと設定Memcachedの仕組みと設定
Memcachedの仕組みと設定Tatsuya Akashi
 
Spring Day 2016 - Web API アクセス制御の最適解
Spring Day 2016 - Web API アクセス制御の最適解Spring Day 2016 - Web API アクセス制御の最適解
Spring Day 2016 - Web API アクセス制御の最適解都元ダイスケ Miyamoto
 
Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門
Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門
Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門Preferred Networks
 
Java 9で進化する診断ツール
Java 9で進化する診断ツールJava 9で進化する診断ツール
Java 9で進化する診断ツールYasumasa Suenaga
 
Spark 의 핵심은 무엇인가? RDD! (RDD paper review)
Spark 의 핵심은 무엇인가? RDD! (RDD paper review)Spark 의 핵심은 무엇인가? RDD! (RDD paper review)
Spark 의 핵심은 무엇인가? RDD! (RDD paper review)Yongho Ha
 

What's hot (20)

ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方
 
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
 
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
 
Spring Bootをはじめる時にやるべき10のこと
Spring Bootをはじめる時にやるべき10のことSpring Bootをはじめる時にやるべき10のこと
Spring Bootをはじめる時にやるべき10のこと
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
 
Amazon ElastiCacheのはじめ方
Amazon ElastiCacheのはじめ方Amazon ElastiCacheのはじめ方
Amazon ElastiCacheのはじめ方
 
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐO/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐ
 
ドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したことドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したこと
 
MySQLバックアップの基本
MySQLバックアップの基本MySQLバックアップの基本
MySQLバックアップの基本
 
MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話
 
Chapitre 5 classes abstraites et interfaces
Chapitre 5  classes abstraites et interfacesChapitre 5  classes abstraites et interfaces
Chapitre 5 classes abstraites et interfaces
 
ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方
 
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
 
20160526 依存関係逆転の原則
20160526 依存関係逆転の原則20160526 依存関係逆転の原則
20160526 依存関係逆転の原則
 
Memcachedの仕組みと設定
Memcachedの仕組みと設定Memcachedの仕組みと設定
Memcachedの仕組みと設定
 
Spring Day 2016 - Web API アクセス制御の最適解
Spring Day 2016 - Web API アクセス制御の最適解Spring Day 2016 - Web API アクセス制御の最適解
Spring Day 2016 - Web API アクセス制御の最適解
 
Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門
Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門
Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門
 
Java 9で進化する診断ツール
Java 9で進化する診断ツールJava 9で進化する診断ツール
Java 9で進化する診断ツール
 
Spark 의 핵심은 무엇인가? RDD! (RDD paper review)
Spark 의 핵심은 무엇인가? RDD! (RDD paper review)Spark 의 핵심은 무엇인가? RDD! (RDD paper review)
Spark 의 핵심은 무엇인가? RDD! (RDD paper review)
 

BEM記法~HTMLコーディングする際のidやclassの命名規則~

Editor's Notes

  1. Block__element--mod