【CSS設計手法】BEM、OOCSS、SMACSSの違いと特徴のまとめ【CSS設計手法】BEM、OOCSS、SMACSSの違いと特徴のまとめCSSの設計手法とは、CSSのメンテナンス性や作業効率を向上させるためのHTMLのクラス名の付け方と、CSSのコードの管理方法の考え方のことを言います。命名規則などとも呼ばれたりしますね。ページ数が少なく、コード量もそこまで多くないような場合はあまり気にする必要はありませんが、大きなプロジェクトになるとCSSの設計手法を取り入れることで様々なメリットがあります。今回は、CSSの設計手法に関する基本と、3つの人気のCSSの設計手法をご紹介したいと思います。INDEXなぜCSSの設計手法が大切なのかメンテナンス性が向上する大規模なWebサイトでも整ったコードで記述できる複数人でコーディングしやすくなる主要な3つのCSS設計手法BEMBEMを使うメリットBEMを使ったコードの記述例OOCSSSMACSS結局どのCSSの設計手法がいいのか設計手法を取り入れる前にSassの導入も検討してみようCSS設計手法は万能薬じゃないなぜCSSの設計手法が大切なのかCSSの設計手法を取り入れる大きなメリットは下記の3つです。メンテナンス性が向上する大規模なWebサイトでも整ったコードで作れる複数人でのコーディングが行いやすくなるメンテナンス性が向上するCSSの設計手法を正しく取り入れることによって、全体的に管理の行き届いたコードを記述することができ、メンテナンス性が向上します。逆に、煩雑になってしまったコードではスタイルの優先順位が複雑になってしまっていたり、!importantが随所で登場してしまっているようなコードのことで、一度コードが崩壊してしまうとそれを整えるためには大変な手間がかかってしまいます。CSSの設計手法を取り入れることによって、コードを体系立てて管理することができるようになり、アップデートの際にも修正すべき点が明確なメンテナンス性が高いコードを記述することができます。大規模なWebサイトでも整ったコードで記述できるランディングページなどのコーディングを行う場合はあまり困らないかもしれませんが、何十ページもあるようなWebサイトのコーディングを行う場合や、コンポーネントを使い回すような場合は、設計手法や命名規則を決めておかないと納品する頃にはスパゲッティコードと言われるような、整理されておらず複雑な状態が出来上がってしまいます。なってしまうと、ある場所を修正すると他の場所にも意図せぬ影響が出てしまったり、依存関係を確認するだけで時間が過ぎてしまったりするなど、非常に分かりづらいコードが出来上がってしまいます。設計手法を決めてコーディングを行うことによって、コードの影響範囲が明確になり、大規模なWebサイトのコーディングであっても管理が行き届いたコードを書くことができるようになります。複数人でコーディングしやすくなる設計手法を取り入れることで、それぞれのメンバーが同じようにコードを記述することができるようになるため、複数人でコーディングを行いやすくなります。ページごとに担当を分けてコーディングを行うような場合に、担当した人によってコードの書き方が全く違うと、他の人がコードを修正する時の作業がスムーズに行えなくなります。企業やチームによって、それぞれ異なるコーディングのルールが存在していますが、BEMやOOCSS、SMACSSなどメジャーな設計手法を用いることによって、誰が書いても同じような記述でコードを書くことができ、設計手法を知らない人でもWebをちょっと調べればすぐに扱えるようになります。企業やチームによって色々なCSSの設計手法が使われていますが、体感的によく使われている設計手法は下記の3つです。BEMOOCSSSMACSSそれぞれの設計手法について下記にご紹介していきます。BEMBEM(ベム)は、下記の3つの要素の頭文字から名付けられた設計手法です。Block枠組みとなる要素のこと。セクションやコンテナをBlockとして扱うケースが多いです。ElementBlockの中に存在する子要素のことModifierBlockやElementを修飾するもの。activeやlargeのように状態を管理する場合もModifierで指定するようにしますBEMでは、下記のようにBlock、Element、Modifierをクラス名に使用します。block__element--modifierBlockの後ろに「_」(アンダースコア)を2つはさんでElementを記述し、BlockやElementにModifierを付ける場合は「-」(ハイフン)を2つはさみます。BlockやElementが1単語で表現できない場合には.main-block__titleのようにハイフン1つで単語を繋げて記述します。BEMを使うメリットメンテナンスしやすいBEMは、細かくクラス名を指定するCSSの設計手法です。スタイルの使い回しが少なく、クラス名によってある程度使用されている範囲が絞られるため、CSSを修正した時の影響範囲が小さく、メンテナンスコストを少なく抑えることができます。ある要素のスタイルを変更したいときに、CSSのコードが色々な場所に存在するとそれぞれの依存関係や影響を考えなければなりませんが、BEMの場合はHTMLの要素のスタイルを記述しているCSSのコードの箇所を見つけやすく、メンテナンスのしやすさが特徴的です。これによってクラス名が長くなってしまうというデメリットもあります。上記のようなデザインのページをBEMを使って記述する場合、HTMLのクラス名には下記のように名前を付けていきます。card__button--purple">Add</button></div>.cardというBlockの中に、titleというElementが配置されています。大きなサイズのカードのクラス名には、.card--largeという形でModifierを使用してクラス名を指定しています。ボタンについては、.card__buttonクラスでボタンの共通のスタイルを指定して、.card__button--redのように特有のスタイルについてはModifierを使ってクラス名を指定します。上記のように、クラス名を見ただけでどの要素のどういった状態を示すものなのかが分かりやすいというのが、BEMを使う大きなメリットの1つです。Sullivanによって提唱されたCSSの設計手法です。構造と見た目の分離OOCSSは「構造と見た目を切り離す」という考え方をベースにルールが作られています。構造って何?と思うかもしれませんが、レイアウトのことを指しています。見た目は色やフォントサイズなど、レイアウトに影響しないスタイルを「見た目」として扱います。レイアウトに関係するスタイルと、レイアウトに関係無いスタイルを分けて記述するという考え方が「構造と見た目の分離」です。コンテナとコンポーネントの分離OOCSSでは、コンポーネントの場所によってスタイルが変わらないようにCSSを記述していきます。これによって、一度使用したコンポーネントを別の箇所で使用した時にスタイルが変わらないようにすることができるため、再利用性が向上します。先程BEMで紹介したレイアウトを同じようにしてOOCSSを使ってコードを書くと、下記のようになります。bg-purple">Add</button></div>このように、OOCSSではクラス名を組み合わせることによってスタイルを指定する形となります。bg-red"というように既存のボタンのスタイルに背景色を指定するクラスを組み合わせています。.bg-redというクラスはサイト内の他の箇所でスタイルを指定することができ、汎用性が向上するため全体のコードの記述量を少なく済ませることができます。一方で、あるクラスのスタイルを変更するとサイト全体に影響するため、影響範囲が分かりづらいというデメリットがあります。BEMはコード量が多くなるが変更時の影響範囲が小さいのに対し、OOCSSはコード量を少なく済ませることができる一方で変更時の影響範囲が大きくなってしまうという特徴があります。この辺りについては、プロジェクトの大きさや関わる人の数など、状況に応じて適した設計手法を選ぶことが大切です。CSS」の頭文字を取った言葉で、よく使われるCSSの設計手法の1つです。SMACSSでは、CSSの種類を下記の5つに分類して記述を行います。ベースbodyやinputなど、要素にスタイルを指定するものを指します。ベースルールの中にCSSリセットも含まれます。レイアウトレイアウトは、その名の通りページのレイアウトを指定するものを指します。モジュールボタンやタイポグラフィなど、コンポーネントのようなパーツのことを指します。ステート.is-errorや.is-activeなど、状態によって見た目が変化する場合のスタイルを指定するものを指します。テーマベースカラーやメインカラーなど、デザイン全体で統一されるべきスタイルのことをテーマと呼びます。場合、上記の5つのフォルダを作成し、その中に必要なCSSファイルを保存していくような形を取ります。bg-red"のようにbuttonクラスとbg-redクラスにそれぞれスタイルを指定することで、ボタンを再利用するときや背景色に赤を使用する場面で上記のクラス名を指定するだけでスタイルを指定することができます。複数のページで同じようなレイアウトを取るようなサイトをコーディングするときにも、レイアウトとモジュールが分離されているので同一のクラス名を付けることで簡単に同じレイアウトを作ることができます。button-purple">Add</button></div></div></div>上記のように、cardクラス要素のの親要素で.l-grid-6クラスが指定されており、レイアウトとモジュールがそれぞれクラス名で管理されます。最初の.cardクラスに.is-card-recommendedクラスが付けられているように、同じクラスの中でスタイルに変化を付けたい場合はステートを利用します。(.card-largeのようにして大きなカードをモジュールとして扱う方法も使われます。)SMACSSは、どちらかというとOOCSSと同じようにスタイルの再利用を推奨する設計手法です。コード量を少なく済ませることができる一方、厳密に管理しないと気づいたら煩雑なコードが出来上がってしまうため注意が必要です。結局どのCSSの設計手法がいいのかBEM、OOCSS、SMACSSの3つのCSSの設計手法をご紹介しましたが、いずれもメリットとデメリットがあり、最も優れたCSSの設計手法というものは存在していません。プロジェクトのサイズであったり、一人でコーディングをするのか複数人でコーディングをするのかなど、状況に応じて相性のいいCSSの設計手法は異なります。多くの場合がCSSの設計手法をそのまま使うのではなく、チーム内でローカルルールを作ってコーディングを行う形が一般的です。CSSの設計手法は方法論の1つであり、実際にどのような命名規則でクラス名を付けていくのか、どのようにCSSを記述していくのかは自分がしっくりくる形を見つけなければなりません。そのためにも、上記で紹介したような著名なCSSの設計手法の存在を理解しておくことはCSSのレベルを向上するために多くの知識を与えてくれるはずです。設計手法を取り入れる前にSassの導入も検討してみようCSSのメンテナンスコストを下げるための設計手法ですが、それぞれの設計手法にもデメリットがあります。設計手法を決めずにコーディングを行うよりは設計手法を決めてコーディングを行うべきですが、もっとシステマティックにCSSを管理したい場合はSassの導入がおすすめです。Sassを導入することによって、要素をネストすることができるようになり、CSSの記述量が減るだけでなく、変数や関数を使うことによって変更に強いCSSを書けるようになります。コードをコンパイルしなければならないので、環境構築が少し手間かもしれませんが、Preprosなどのツールを使うことで面倒な作業無しで準備を整えることもできます。SassのGUIコンパイラは「Prepros」がおすすめ!使い方と機能のまとめSassに挑戦しようと思ったけどコンパイルのための環境構築が難しそうでやめてしまった方も多いのではないでしょうか。trendsCSS設計手法は万能薬じゃないここまでCSS設計手法のメリットをお伝えしてきましたが、設計手法はあくまでCSSの設計手法であり、設計手法を取り入れるだけであらゆる問題が解決するような万能薬ではありません。同じ設計手法を使っても人それぞれ少しずつ異なるコードが出来上がるので、設計手法を取り入れるだけでチームでの作業が劇的にスムーズになるわけでもないでしょう。管理が行き届いたメンテナンスしやすいコードを書くためには設計手法を取り入れることは非常に有効な方法です。設計手法を取り入れた上で、どのようにすれば管理しやすいコードが書けるのかは自分で考えてみましょう。Trends(ウェブデザイントレンド)は、Webに関わる全ての人のためのメディアです。ウェブサイトの制作やデザインに役立つ情報、最新トレンド、チェックすべきサービスなどを配信しています。