コンポーネント化CSSは簡単ではない

これからのWebデザインは、コンポーネント化を意識しよう | Webクリエイターボックス
上のリンク先で言われていることは大体みんなやってきたことなんじゃないかと思います。一人でやる案件なら別に意識するまでもなくやれるでしょうが、複数名でやると簡単に泥沼になるのがWeb制作の現場なので、単にコンポーネント化といってもどこに気を付けてやるべきかを熟考しなければなりません。

コンポーネント化の範囲をどうするか

今私がやっているのは「機能単位」でのコンポーネント化です。ただ、これが最適解かどうかは結論が出ていません。たぶん、これが最善と思ってはいますが。
コンポーネント化の単位として考えられるのは以下のパターンです。

  1. レイアウト単位
  2. 機能単位
  3. 装飾単位
レイアウト単位のコンポーネント

代表的なものはグリッドレイアウトです。12グリッド、n/mグリッドが主なパターンになるでしょう。12グリッドはカラム分割や複数枚の画像+記事の回り込みなどといったレイアウトには最適ですが、ヘッダーに横並びの等幅分割でグローバルメニューを設置するような場合はあまり向いていません。

機能単位のコンポーネント

横並びグローバルメニューや、カードモジュールのようなあらかじめ決まった形でそこにしか使わないようなものはまとめてしまう。

装飾単位のコンポーネント

色違いのボタンなど

コンポーネント化の落とし穴

全部入りの欠点

上記の3種のコンポーネントは、Bootstrapなどの大規模CSSフレームワークでは最初から入っています。Bootstrapのようなものを自分で作ろうとすると痛感しますが、非常に考え抜かれたコンポーネントであることが分かります。
なら黙って有名どころのフレームワークを使えばいいじゃん、となるのですが、そういうわけにもいかないのがWeb屋のジレンマです。(私もBootstrapは一度だけ試しに使いましたが、以降は自前でグリッドを用意するようになりました)

全部入りの欠点は、CSSファイルの肥大化が挙げられます。Bootstrapの機能の8割は使わない、という人も多いのではないでしょうか。「パフォーマンス」の御旗のもとにCSSJavaScriptファイルのミニファイなどという涙ぐましい努力を推奨される一方で、こんな無駄が許されるのか、という問題はついて回ります。

レイアウトのみのコンポーネントは無駄がない

一方、グリッドシステムだけが用意されているような場合は、無駄がありませんが、制作時に作らなければならないものが多く、スピードが損なわれます。

レイアウト+機能は比較的バランスが良い

装飾にかかわるプロパティが最小限にとどめられている機能別コンポーネントではレイアウトのみの場合よりも制作スピードは上がります。ただし、その機能で使われる装飾が決まっている場合は、装飾までコンポーネントに入れるのが最適だと思います。機能と装飾を完全に分離してしまうと、セレクタの重複が増え、CSSが肥大化するからです。もっとも、装飾の変更が多い場合は完全分離のほうが管理しやすくなると思います。

装飾単位のみでコンポーネント化するのは避けるべき

スタイルガイドもがっちり作られ、コンポーネント化もされているにも関わらず、レイアウト・機能・装飾の分離がなされていないがためにコンポーネントの無駄な肥大化、同じレイアウトに複数のコンポーネントが割り当てられ、スタイルガイドも追記が頻発、という場面に出会ったことがあります。
主な要因は、レイアウトと機能と装飾を全部同じコンポーネントにまとめようとしていたこと。下線を付けるかつけないかだけでコンポーネントごと新たなセレクタに複製してしまうようでは効率的とは言えません。この辺はCSS設計者の腕の見せ所だと思います。

バランスをどこで見極めるか、が大事

CSSのモジュール化を進めると、必ずどこかで無駄と不足が発生します。不足をなくせばCSSは肥大化し、CSSの無駄と不足を最小にしようとするとクラスが細分化され、今度はHTML側の負担が増えます。これではHTML3の時代と同じじゃないか、ということになりかねません。

上流のCSS設計がまずいとこういう大変なことになるのですが、CSS設計の勘所というのは場数を踏む(そしてあとでまずかったところを把握する)必要があります。
のんびり場数を踏む余裕がない場合は以下の方法が効率的です。

Bootstrapなどのコードを読む

セマンティックな名付け、コーディングのテクニックなどを学ぶことができます。フレームワークは大手のウェブサービス会社が公開しているので、いくつか目を通しておくと、いろいろな設計思想が学べて効果的です。特にBootstrapFoundationPureは勉強になります。

BEMを使ってみる

名づけのルールがBase, Element, Modifierとなっており、上記のコンポーネント化の目安となります。
最初のうちは深くしすぎるなどの失敗をするので練習用のサイトを用意して何回か試行錯誤すると勘所がわかるようになります。
BEMのルール上は__,--を何段にしてもよいみたいですが、3段くらいを限度にするとちょうど良いかなー、という印象です。
そして、導入する、ではなく使ってみる、というのがポイント。一度「このあたりがコンポーネントの境界だな」というのがわかれば、名づけをBEM方式にこだわる必要はありません。

Sassはほぼ必須かも

パフォーマンスをよくするためにはCSSファイルは1つにまとめたい。しかしファイルが大きくなると必要となるセレクタがどこにあるのか探すのに苦労する。またコンポーネント化をする上では土台となるCSSは触りたくない、といった面倒を解消してくれるのがSass。よくバグるけどKoalaを使えばコマンドラインを触ることもなく、CSSとほとんど変わらない感覚で編集・デバッグを行えるのでまだの人はすぐにでも導入すべきでしょう。

自分でCSSフレームワークを作ってみる

これをやると「案件ごとに専用コンポーネント作ったほうが楽じゃね?」ってことに気づきます。どの案件でも使いまわせるのはグリッドシステムくらいのものじゃないかと。
この点大規模フレームワークはすごいなと思います。

まとめ

  • コンポーネント化は目的・役割を固めたうえで、ちょうどよいバランスのところを考える必要がある。
  • 有名どころのCSSフレームワークやBEMは、たとえ使わなくても読んでおくほうがいい。設計思想を学ぶことができる。
  • 一度自分でフレームワークを作ってみると良いと思う。