CSS

カスタムプロパティ

上級

読み方:カスタムプロパティ|英語:Custom Property

CSS変数のことで、--変数名: 値; で定義し、var(--変数名) で使うよ。色やサイズの一括管理に便利。

やさしい説明

カスタムプロパティ(CSS変数)は、値に名前をつけて再利用する仕組みです。-- で始まる名前で定義し、var() で使います。

サイト全体のメインカラーを1箇所で管理できます。色を変えたいとき、変数の値を1つ変えるだけで全ページに反映されます。

ダークモードの切り替えにも使われます。変数の値を切り替えるだけで、サイト全体の配色が変わります。

具体例・使い方

/* 変数を定義(:rootで全体に適用) */
:root {
  --color-primary: #0d9488;
  --color-text: #1f2937;
  --spacing-md: 16px;
  --spacing-lg: 32px;
  --radius: 8px;
}

/* 変数を使う */
.btn {
  background: var(--color-primary);
  padding: var(--spacing-md);
  border-radius: var(--radius);
}

.card {
  padding: var(--spacing-lg);
  color: var(--color-text);
}

ダークモードへの応用

/* ライトモード(デフォルト) */
:root {
  --bg: #ffffff;
  --text: #1f2937;
}

/* ダークモード */
.dark {
  --bg: #111827;
  --text: #f9fafb;
}

/* 変数を使えばクラス切り替えだけで全体が変わる */
body {
  background: var(--bg);
  color: var(--text);
}

変数を使わないと、ダークモード対応で数十〜数百箇所の色を書き直す必要があります。カスタムプロパティを使えば :root の値を変えるだけで済みます。

フォールバック値の指定

/* var(変数名, フォールバック値) */
.btn {
  /* --accent が未定義のとき blue を使う */
  background: var(--accent, blue);
}

/* JavaScriptから変数を変更することもできる */
document.documentElement.style.setProperty("--color-primary", "#ef4444");

いつ使う?

  • サイト全体の色・フォント・余白を1箇所で統一管理したいとき
  • ダークモード・テーマ切り替えを実装するとき
  • 同じ値(カラーコードや余白サイズ)を複数箇所で使い回すとき
  • JavaScriptから動的にスタイルを変更したいとき

間違いやすいポイント

❌ -- を付け忘れる・var() を忘れる

定義時は --変数名: 値、使用時は var(--変数名) の両方が必要です。どちらかを忘れると機能しません。

/* ❌ ハイフン2つが必要 */
:root { main-color: blue; }
.btn { background: main-color; }

/* ✅ 正しい書き方 */
:root { --main-color: blue; }
.btn { background: var(--main-color); }

❌ IE11では使えない

CSS カスタムプロパティはIE11非対応です。IE対応が必要なプロジェクトではSassの変数($変数名)を検討しましょう。現在の多くのプロジェクトではIE非対応を前提にできます。

よくある疑問

Q: カスタムプロパティの書き方は?

A: :root { --main-color: #3a86ff; } で定義し、.btn { color: var(--main-color); } で使います。:rootに書けば全体で使えます。

Q: Sassの変数との違いは?

A: Sassの変数はビルド時に値が確定しますが、カスタムプロパティは実行時に変更可能です。JavaScriptから値を変えたり、メディアクエリで切り替えたりできます。

Q: ダークモード対応に使うには?

A: :root { --bg: white; } @media (prefers-color-scheme: dark) { :root { --bg: #1a1a1a; } } のように変数の値だけ切り替えます。

関連用語

📖 関連レッスン

レッスンを見る →

関連ブログ記事

⚠️ 関連するエラー

❓ 関連するQ&A