CSSとBEM

CSSとBEM

この記事ではCSSとBEMについて説明します。

YouTube Video

プレビュー用のHTML

css-bem.html
 1<!DOCTYPE html>
 2<html lang="en">
 3<head>
 4    <meta charset="UTF-8">
 5    <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6    <title>BEM Example</title>
 7    <link rel="stylesheet" href="css-base.css">
 8    <link rel="stylesheet" href="css-bem.css">
 9</head>
10<body>
11    <!-- Header -->
12    <header>
13        <h1>CSS &amp; BEM(Block Element Modifier)</h1>
14    </header>
15
16    <!-- Main content -->
17    <main>
18        <header>
19            <h2>BEM Example</h2>
20        </header>
21        <article>
22            <h3>BEM HTML Example</h3>
23            <section>
24                <header><h4>HTML</h4></header>
25<pre class="sample">
26&lt;div class=&quot;button button--primary&quot;&gt;
27    &lt;span class=&quot;button__text&quot;&gt;Click Me&lt;/span&gt;
28&lt;/div&gt;
29</pre>
30            </section>
31        </article>
32        <article>
33            <h3>BEM Example</h3>
34            <section>
35                <header><h4>HTML</h4></header>
36<pre class="sample">
37&lt;header class=&quot;header&quot;&gt;
38    &lt;div class=&quot;header__logo&quot;&gt;My Logo&lt;/div&gt;
39    &lt;nav class=&quot;header__nav&quot;&gt;
40        &lt;ul class=&quot;header__menu&quot;&gt;
41            &lt;li class=&quot;header__menu-item header__menu-item--active&quot;&gt;Home&lt;/li&gt;
42            &lt;li class=&quot;header__menu-item&quot;&gt;About&lt;/li&gt;
43            &lt;li class=&quot;header__menu-item&quot;&gt;Contact&lt;/li&gt;
44        &lt;/ul&gt;
45    &lt;/nav&gt;
46&lt;/header&gt;
47</pre>
48            </section>
49            <header><h4>HTML+CSS</h4></header>
50            <section class="sample-view">
51                <header class="header">
52                    <div class="header__logo">My Logo</div>
53                    <nav class="header__nav">
54                        <ul class="header__menu">
55                            <li class="header__menu-item header__menu-item--active">Home</li>
56                            <li class="header__menu-item">About</li>
57                            <li class="header__menu-item">Contact</li>
58                        </ul>
59                    </nav>
60                </header>
61            </section>
62        </article>
63        <article>
64            <h3>BEM Example</h3>
65            <section>
66                <header><h4>HTML</h4></header>
67<pre class="sample">
68&lt;header class=&quot;header&quot;&gt;
69    &lt;div class=&quot;header__logo&quot;&gt;My Logo&lt;/div&gt;
70    &lt;nav class=&quot;header__nav&quot;&gt;
71        &lt;ul class=&quot;header__menu&quot;&gt;
72            &lt;li class=&quot;header__menu-item header__menu-item--active&quot;&gt;Home&lt;/li&gt;
73            &lt;li class=&quot;header__menu-item&quot;&gt;About&lt;/li&gt;
74            &lt;li class=&quot;header__menu-item&quot;&gt;Contact&lt;/li&gt;
75            &lt;li class=&quot;header__menu-item header__menu-item--disabled&quot;&gt;Disabled&lt;/li&gt;
76        &lt;/ul&gt;
77    &lt;/nav&gt;
78&lt;/header&gt;
79</pre>
80            </section>
81            <header><h4>HTML+CSS</h4></header>
82            <section class="sample-view">
83                <header class="header">
84                    <div class="header__logo">My Logo</div>
85                    <nav class="header__nav">
86                        <ul class="header__menu">
87                            <li class="header__menu-item header__menu-item--active">Home</li>
88                            <li class="header__menu-item">About</li>
89                            <li class="header__menu-item">Contact</li>
90                            <li class="header__menu-item header__menu-item--disabled">Disabled</li>
91                        </ul>
92                    </nav>
93                </header>
94            </section>
95        </article>
96    </main>
97</body>
98</html>

CSSとBEM: 効果的なスタイル管理のためのアプローチ

CSSは、ウェブサイトの外観を定義するための基本的な言語です。しかし、CSSを効果的に管理することは、特に規模が大きなプロジェクトでは困難です。BEM(Block Element Modifier)は、この問題を解決するためのCSS命名規則であり、再利用性と保守性を向上させるのに役立ちます。

CSSの課題とBEMの必要性

CSSの課題として、以下のような問題があります。

  1. グローバル名前空間の衝突: CSSでは、クラス名がグローバルであるため、異なるコンポーネント間でクラス名が衝突するリスクがあります。
  2. 複雑なセレクタの乱用: 子孫セレクタやIDセレクタが複雑化し、スタイルの特異性が高くなると、後から修正が難しくなります。
  3. 再利用性の低下: 特定のスタイルが他のコンポーネントで再利用しにくくなります。

BEMはこれらの問題を解決するために設計されました。

BEMの基本概念

BEMは3つの主要な要素で構成されます。

  1. Block(ブロック): 独立した意味を持つコンポーネントです。
  2. Element(エレメント): ブロックの一部で、ブロックと論理的に関連付けられています。
  3. Modifier(モディファイア): ブロックまたはエレメントの見た目や動作を変えるものです。

BEMの命名規則は以下の形式に従います。

.block__element--modifier
  • block: ブロックのコンポーネント名です。
  • element: ブロックの一部である要素です。
  • modifier: 特定の状態やスタイルの変化を表現します。

実例

以下に簡単な例を示します。

1<div class="button button--primary">
2  <span class="button__text">Click Me</span>
3</div>
  • button はブロックです。
  • button__text はエレメントです。
  • button--primary はモディファイアです。

BEMの利点

BEMの利点として次の点があります。

  • 一貫性 命名規則が統一されているため、コードが読みやすくなります。
  • 再利用性 コンポーネントの再利用が容易になります。
  • 保守性 他の開発者がコードを理解しやすくなり、変更がしやすくなります。

BEMを使ったプロジェクト構築

HTMLの設計

次にBEMを適用したHTMLの例を示します。

 1<header class="header">
 2  <div class="header__logo">My Logo</div>
 3  <nav class="header__nav">
 4    <ul class="header__menu">
 5      <li class="header__menu-item header__menu-item--active">Home</li>
 6      <li class="header__menu-item">About</li>
 7      <li class="header__menu-item">Contact</li>
 8    </ul>
 9  </nav>
10</header>

CSSの設計

HTMLに対応するCSSを以下のように記述します。

 1.header {
 2  background-color: #333;
 3  color: #fff;
 4  padding: 10px;
 5}
 6
 7.header__logo {
 8  font-size: 24px;
 9}
10
11.header__nav {
12  display: flex;
13  justify-content: space-around;
14}
15
16.header__menu {
17  list-style: none;
18  margin: 0;
19  padding: 0;
20  display: flex;
21}
22
23.header__menu-item {
24  margin: 0 10px;
25  padding: 5px 10px;
26}
27
28.header__menu-item--active {
29  font-weight: bold;
30  border-bottom: 2px solid #fff;
31}
  • このCSSは、BEM(Block Element Modifier)記法を用いて、再利用性と保守性を高めたモジュール化されたスタイルを定義しています。

スタイルの拡張

新しいモディファイアを追加して、特定のメニューアイテムを非アクティブにする場合を見てみましょう。

対応するHTMLは以下のようになります。

1<li class="header__menu-item header__menu-item--disabled">Disabled</li>
1.header__menu-item--disabled {
2  opacity: 0.5;
3  pointer-events: none;
4}
  • このCSSは、非アクティブなメニュー項目に対して視覚的に薄く表示し、クリック操作を無効にするモディファイアを定義しています。

よくある質問

BEMを利用する際、次の点に留意できます。

Q1: BEMの命名規則を厳密に守る必要がありますか?

BEMの命名規則を厳密に守る必要はありませんが、一貫性を保つことが重要です。プロジェクト内で統一されたルールを作成し、チーム全体で遵守しましょう。

Q2: BEMを導入するとCSSが冗長になりませんか?

BEMを導入するとCSSのクラス名は長くなりますが、それによりコンポーネントの役割が明確になります。そのため、保守性が向上、冗長性を上回るメリットがあります。

Q3: 他のCSSフレームワークと併用できますか?

BEMは、他のCSSフレームワークと併用できます。たとえば、Tailwind CSSやBootstrapを使用する場合でも、カスタムコンポーネントにBEMを適用できます。

結論

BEMは、CSSをモジュール化して管理しやすくするための明確な命名規則を提供します。この手法を活用することで、スタイルの衝突を防ぎ、保守性や再利用性が飛躍的に向上します。適切な命名規則の設計は、プロジェクトの品質と生産性の向上につながります。

YouTubeチャンネルでは、Visual Studio Codeを用いて上記の記事を見ながら確認できます。 ぜひYouTubeチャンネルもご覧ください。

YouTube Video