CSSフレームワークを選ぶ際の観点5つ+おまけ

## この記事の概要

Web サイトのスタイリングをするにあたり、いつの世も CSS フレームワークは使われています。
技術選定の基準が持てず苦労している人を見かけがちなので、私が見ているポイントを記事にしてみました。

:::note warn
この記事もあくまで「決定版」と言えるほどの内容ではありません。
しかしそれでも誰かの役に立てるかもしれないと思ったため、投稿してみます。
:::

:::note alert
説明の都合上、具体的なフレームワーク名を出している場面もありますが、あくまで「**私だったらこのアプローチを採択する/しない**」の話です。
「**これを使うべき/使ってはいけない**」の主張ではありませんのでご了承ください。
:::

## 見ているポイント

### 要素自体の見た目とレイアウトが分離できているか？

便宜上、自分自身の見た目に関するスタイル（`background-color`や`font-size`など）を`Presentational style`、
ページ内での配置や関係性のスタイル（`display: flex;`や`margin`など）を`Layout style`と呼ぶとして、以下のどれかが好ましいです。

1. `Presentational style`用のクラスと`Layout style`用のクラスが分かれており、任意の要素に複数のクラスを付与できる
1. `Presentational style`用のコンポーネントと`Layout style`用のコンポーネントが分かれている
1. `Presentational style`用のコンポーネントがあり、後から`Layout style`を注入できる

これらの観点はかなり大事にしています。

例えば Bootstrap の`Alerts`は`Presentational style`と`Layout style`ががっちり結びついていて、少し使いづらそうです。
以下が実際のコードなのですが、コンポーネントに`margin-bottom`が指定されているのに注目してください。

```css
.alert {
  position: relative;
  padding: 1rem 1rem;
  margin-bottom: 1rem; /* ←これ */
  border: 1px solid transparent;
  border-radius: 0.25rem;
}
```

たまたま余白が`1rem`だったら良いのですが、そうでない場合も多いでしょう。
CSS では打ち消し回数が多くなればなるほど事故が起きるので、最初からこうやって指定されていると身構えてしまいます。

https://getbootstrap.jp/docs/5.0/components/alerts/

### 例外的なスタイルを無理なく適用できるか？

いきなり例外の話をしてしまいますが、フレームワークにつらみを感じるのは例外的なスタイルを組んでいる場面ではないでしょうか？

- フレームワーク側の詳細度が高過ぎて`!important`をつけないとスタイルを適用できない
- JavaScript で値が動的に挿入されていて、どこから制御されているのか見えづらい

上記のようなパターンだと、オーバーライドすべきプロパティは分かっているのに諦めざるを得ない……なんてこともあるでしょう。
誰だって好きで負債を作りたい訳はありません。

:::note warn
「例外を作らず、フレームワークの way に乗って開発すべき」は間違いないですし、日々の開発ではそう努力すべきです。
しかし選定時は「もし例外的なスタイルが生まれてしまったら」を考慮に入れておいた方がベターだと考えています。
:::

### HTML 要素そのものにスタイルを当てすぎていないか？

reset や normalize の範疇を超えてのスタイルが当たっているかを見ます。

例えば h タグは文書構造と見た目が完全には紐付かない場合も少なくないはず。
毎度打ち消すのは面倒なので、あくまで「クラスに対応するスタイル」を提供してくれるフレームワークの方が好みです。

ただし、そもそも Classless CSS として提供されているものは別です。
通常の CSS フレームワークとは必要なタイミングや役割が違いますから、ここではあくまで Class 有りのフレームワークでの話に限定した観点です。

Classless CSS とは例えば以下のようなもので、CSS ファイルを読み込みさえすれば素の HTML を書くだけでそれなりに見た目が整います。

https://simplecss.org/

### マークアップが過度にフレームワークに囚われないか？

スタイルとマークアップは密接な関係にありますから、ある程度はフレームワークの作法に則るしかありません。
しかし例えば「既定されたコードから、ネストを 1 段階も浅くも深くもできない」くらいガチガチになっていると結構しんどいです。

レスポンシブに対応するためなど、複雑めなマークアップ強いてくるフレームワークも見かけます。
スクラッチしたらもっと簡単じゃん！と思いながらフレームワークを使うのはかなり不毛なのでおすすめしません。

なおこの記事の主旨から外れますが、明らかなつらみが見えているときは「フレームワークを使わない」判断も候補に挙げられると楽になると思います。

### 素の CSS の書き方に近いか？

元も子もない話ですが、何の技術を使おうが最終的には CSS にコンパイルされます。
そのため、元々の CSS から離れれば離れるほど不都合が起きやすいはず。
（うっかりプロパティの名前を間違って覚えるとか、既存のコードを参考にしづらいとか、大きな問題ではないかもしれませんが……）

些細な話ながらも「最終候補に残った 2 つのうち、どちらが良いか迷うなあ」くらいの時期には意識します。

例えば Tailwind CSS では、ユーティリティクラスである都合上微妙に名前が違うものも多いです。

`justify-content: space-between;`が`justify-between`というクラスで表現されているなど、些細な話ですが……。
通常の CSS の方がすぐに浮かぶ身としては、Tailwind 用の方言に変換するのに若干のラグを感じます。

https://tailwindcss.com/docs/justify-content

優劣をつけたい訳ではありませんが、同じ`justify-content: space-between;`を表す際 Bulma は`is-justify-content-space-between`です。
個人的にはオリジナルに略されるよりは正式で長い方が好みです。

https://bulma.io/documentation/helpers/flexbox-helpers/

### おまけ：z-index にとんでもない値を使っていないか？

非常に地味＆限定的な話ですが、一応記載します。
フレームワークというよりも、モーダルライブラリなどを選ぶ際の話に近い気がしますが……笑

私が出会ったことのあるものだと`z-index: 2147483003;`というとんでも無い数が使われておりげんなりしました。
なお`z-index`の最大値は`2147483647`で、限界すれすれまで数値を上げていることも含めての感情です。

## まとめ

- 要素自体の見た目とレイアウトが分離できているか？
- 例外的なスタイルを無理なく適用できるか？
- HTML 要素そのものにスタイルを当てすぎていないか？
- マークアップが過度にフレームワークに囚われないか？
- 素の CSS の書き方に近いか？
- おまけ：z-index にとんでもない値を使っていないか？

---

最後まで読んでくださってありがとうございます！
Twitterでも情報を発信しているので、良かったらフォローお願いします！

https://twitter.com/xrxoxcxox