tanaka101

身につくスキル

  • -グローバルCSSの役割とコンポーネントCSSとの違いを理解する
  • -CSS変数・カスケード・@layer の仕組みを説明できる
  • -CSS変数を使ったダークモード対応の仕組みを読み解ける
  • -clamp() を使ったレスポンシブデザインを書ける
進捗: 0 / 8

CSS変数(カスタムプロパティ)

色やサイズを1箇所で管理できる「CSS変数(カスタムプロパティ)」の書き方と使いどころを学びます。

同じ色を何箇所にも書く問題

前回までのレッスンで、CSSリセットとベーススタイルを学びました。 次は色の管理について考えてみましょう。

例えば、サイトの背景色に #ffffff、文字色に #171717 を使うとします。

globals.css
body {
  background-color: #ffffff;
  color: #171717;
}
 
.card {
  background-color: #ffffff;
  border: 1px solid #171717;
}
 
.footer {
  background-color: #ffffff;
  color: #171717;
}

同じ色コードが何度も繰り返されています。もし背景色を #f5f5f5 に変えたくなったら、 すべての #ffffff を探して書き換えなければいけません。

  • 変更箇所が多く、修正漏れが起きやすい
  • どの #ffffff が「背景色」で、どの #ffffff が別の用途なのか区別がつかない

この問題を解決するのがCSS変数です。

CSS変数で「名前をつけて管理する」

CSS変数(カスタムプロパティ)を使うと、値に名前をつけて1箇所で管理できます。

globals.css
:root {
  --background: #ffffff;
  --text: #171717;
}

定義した変数は var() で呼び出します。

globals.css
body {
  background-color: var(--background);
  color: var(--text);
}

構文はシンプルです。

構文役割
--変数名: 値;変数を定義する--background: #ffffff;
var(--変数名)変数を使うbackground-color: var(--background);

先ほどの繰り返しだらけのコードを、CSS変数で書き直してみましょう。

CSS変数で色を管理する

--background の値を :root で1箇所変えるだけで、.page.card.footer すべてに反映されます。 エディタで --background の値などを変えてみてください。(#f0f9ffなど)

:root に書くのはなぜ?

CSS変数はどのの中でも定義できます。しかし、グローバルCSSでは :root に書くのが定番です。

globals.css
/* :root = HTML文書のルート要素(html要素)*/
:root {
  --background: #ffffff;
  --text: #171717;
}

:root はページ全体の最上位要素です。ここで定義した変数は、子孫であるすべての要素から var() で参照できます。

定義する場所変数が使える範囲
:rootページ全体(すべての要素)
.card.card とその子要素だけ

サイト全体で使う色やサイズは :root に定義する。特定のコンポーネントだけで使う変数はその内に定義する。この使い分けが基本です。

:roothtml はほぼ同じ要素を指しますが、:root疑似クラスのため詳細度がわずかに高くなります。

レッスン2で学んだ詳細度を思い出してみましょう。

種類詳細度
:root疑似クラスセレクタclassと同等
html要素最も低い

グローバルCSSで :root が好まれるのは、「ここがサイト全体の変数定義である」という共通認識がエンジニア間にあるためです。

変数を使ってベーススタイルに色を追加しよう

前回のレッスンで、ベーススタイルに font-familyline-height を定義しました。

globals.css
/* 2. ベーススタイル */
body {
  font-family: system-ui, sans-serif;
  line-height: 1.6;
}

CSS変数を組み合わせると、ここに背景色と文字色も追加できます。

globals.css
/* 3. デザイントークン(CSS変数) */
:root {
  --background: #ffffff;
  --text: #171717;
}
 
/* 2. ベーススタイル */
body {
  font-family: system-ui, sans-serif;
  line-height: 1.6;
  background-color: var(--background);
  color: var(--text);
}

色の:root のCSS変数で管理し、適用先body のベーススタイルで指定する。役割を分けることで、色を変更したいときは :root だけを見ればよくなります。

CSS変数 + ベーススタイル

変数の名前は、色そのもの(--blue--white)ではなく役割--background--text--primary)でつけるのがおすすめです。

globals.css
/* 避けたい命名 */
:root {
  --white: #ffffff;
  --dark-gray: #171717;
}
 
/* おすすめの命名 */
:root {
  --background: #ffffff;
  --text: #171717;
}

--white だと、将来ダークモードで背景を黒にしたとき --white: #171717; という矛盾した定義になってしまいます。役割で名前をつけておけば、値が変わっても名前が意味を失いません。

構成の概要を振り返ろう

ここまでのレッスンで、構成の概要の3番目まで理解できました。

globals.css(構成の概要)
/* 1. CSSリセット */
*, *::before, *::after { box-sizing: border-box; margin: 0; }
 
/* 2. ベーススタイル */
body { font-family: system-ui, sans-serif; line-height: 1.6; }
 
/* 3. デザイントークン(CSS変数) */
:root { --background: #ffffff; --text: #171717; }
 
/* 4. ダークモードの色定義 */
.dark { --background: #171717; --text: #ffffff; }
 
/* 5. レスポンシブなサイズ定義 */
h1 { font-size: clamp(1.5rem, 1.25rem + 1vw, 1.875rem); }
globals.css(ここまで理解できた部分)
/* 1. CSSリセット ✅ */
*, *::before, *::after { box-sizing: border-box; margin: 0; }
 
/* 2. ベーススタイル ✅ */
body { font-family: system-ui, sans-serif; line-height: 1.6; }
 
/* 3. デザイントークン(CSS変数) ✅ */
:root { --background: #ffffff; --text: #171717; }

次のステップ

CSS変数で色を1箇所で管理できるようになりましたね。もし、:root に定義した変数の値だけを別のセットに切り替えたら、何が起きるでしょうか? 次のレッスンでは、CSS変数を活用したダークモードの仕組みを学びます。