Color Palette
CSS変数でカラーパレットを管理する|2層構造にする理由
2025-10-18
:::note ※CSS変数で色を管理したい人向けの「実装ガイド」記事です :::
結論(私の判断基準)
- 命名:意味ベース(primary, secondary)。色名ベース(blue, red)は使わない
- 構造:プリミティブ + セマンティックの2層構造
- ダークモード:同じ変数名で値だけ切り替える
私がこの構造にしているのは、「ブランドカラーを変えたい」と言われたときに1箇所直せば済むから。
🚀 CSS Variables形式で出力 → Color Palette Generator
なぜCSS変数か
/* ❌ 色が散らばっている */
.header { background: #4A90D9; }
.btn { background: #4A90D9; }
.link { color: #4A90D9; }
/* ✅ 一箇所で管理 */
:root { --color-primary: #4A90D9; }
.header { background: var(--color-primary); }
.btn { background: var(--color-primary); }
.link { color: var(--color-primary); }
ブランドカラーを変更するとき、1箇所直せば全部変わる。
検索置換でも同じことはできる。でもCSS変数の方が確実。
なぜ意味ベースの命名か
:root {
/* ✅ 意味ベース(推奨) */
--color-primary: #4A90D9;
--color-secondary: #6B5CD9;
/* ❌ 色名ベース(非推奨) */
--color-blue: #4A90D9;
}
「青をオレンジに変えたい」と言われたとき、--color-blue という名前のままオレンジを入れることになる。
名前と実態が合わなくなる。だから意味ベースで命名する。
なぜ2層構造か
:root {
/* プリミティブ(生の色) */
--blue-500: #4A90D9;
--blue-600: #3B7AC4;
--gray-100: #F3F4F6;
/* セマンティック(意味のある名前) */
--color-primary: var(--blue-500);
--color-primary-hover: var(--blue-600);
--color-bg-page: var(--gray-100);
}
「プライマリカラーを別の青に変えたい」と言われたとき、--color-primary の参照先を変えるだけ。
コンポーネント側のCSSは一切触らない。これが2層構造の利点。
ダークモード対応
:root {
--color-bg: #FFFFFF;
--color-text: #1F2937;
--color-primary: #4A90D9;
}
@media (prefers-color-scheme: dark) {
:root {
--color-bg: #121212;
--color-text: #E0E0E0;
--color-primary: #6BA8E5;
}
}
同じ変数名で値だけ切り替える。コンポーネント側のCSSは変更不要。
私は prefers-color-scheme を使っている。ユーザーの設定に従う。
クラスベースの切り替え
:root {
--color-bg: #FFFFFF;
--color-text: #1F2937;
}
.dark {
--color-bg: #121212;
--color-text: #E0E0E0;
}
<html class="dark">
JavaScript でクラスを付け替える。ユーザーが手動で切り替えたい場合はこちら。
私の設定(コピペ用)
:root {
/* ベース */
--color-bg: #FFFFFF;
--color-surface: #F8FAFC;
/* テキスト */
--color-text: #1F2937;
--color-text-muted: #6B7280;
/* アクセント */
--color-primary: #4A90D9;
--color-primary-hover: #3B7AC4;
}
私はこれをベースにしている。色数は最小限。
迷ったときの判断
| 迷い | 私の判断 |
|---|---|
| 命名をどうするか | 意味ベース(primary, secondary) |
| 2層構造にするか | する。後で変更が楽 |
| ダークモードの切り替え | prefers-color-scheme を基本にする |
この記事で解決しない場合
- HEX/RGB/HSLの違いを知りたい → HEX・RGB・HSLの使い分け
- 配色の思想を知りたい → Web配色は「事故を減らす設計」
CSS変数で管理する理由は「後で変えやすいから」。それだけ。