テーマ設定のための CSS 変数
-- でカスタムプロパティを宣言し、var() で参照し、ネストしたスコープで上書きして、ライト/ダークテーマの切り替えを実装します。
「テーマ設定のための CSS 変数」はCoddyKit上の無料Frontend Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはFrontend Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Frontend Academyコースには全4レッスンが含まれています。
CSSカスタムプロパティとは
CSSカスタムプロパティ(CSS変数)は、スタイルシート全体で再利用できる値を保存します。--name: valueで宣言し、var(--name)で参照します。Sassなどのプリプロセッサー変数とは異なり動的で、JavaScriptから更新できます。
カスタムプロパティの宣言
:rootにプロパティを宣言すると、グローバルに利用できるようになります。任意の要素に宣言して、その要素のサブツリー内だけに適用することもできます。
:root {
--color-primary: #3182ce;
--color-bg: #f7fafc;
--color-text: #1a202c;
--spacing-md: 16px;
--border-radius: 8px;
--font-sans: 'Inter', system-ui, sans-serif;
}カスタムプロパティの使用
var(--name)で変数を参照します。2番目の引数としてフォールバック値を指定できます:var(--color-primary, #3182ce)。変数が定義されていない場合は、フォールバック値が使用されます。
.card {
background: var(--color-bg);
color: var(--color-text);
padding: var(--spacing-md);
border-radius: var(--border-radius);
}
.btn {
background: var(--color-primary, blue); /* fallback */
}カスケード:スコープ付き変数
カスタムプロパティはカスケードされ、継承されます。子要素で変数を再定義すると、その要素とすべての子孫要素では、親の値が上書きされます。
:root { --accent: blue; }
.card { color: var(--accent); } /* blue */
.special-section {
--accent: green; /* override for this subtree */
}
.special-section .card { color: var(--accent); } /* green */CSS変数によるダークモード
最もすっきりしたダークモードのパターンは、明るい配色と暗い配色をCSS変数として定義する方法です。クラスを切り替えるか、prefers-color-schemeメディアクエリを使って切り替えます。個々の色プロパティを上書きする必要はありません。
:root {
--bg: #ffffff;
--text: #1a202c;
--card-bg: #f7fafc;
}
[data-theme='dark'], @media (prefers-color-scheme: dark) {
:root {
--bg: #1a202c;
--text: #f7fafc;
--card-bg: #2d3748;
}
}
body { background: var(--bg); color: var(--text); }JavaScriptによるダークモードの切り替え
ルート要素のdata属性またはクラスを切り替えるボタンを追加します。残りの処理はCSS変数が担うため、JavaScriptは1行で済み、個々のスタイルを上書きする必要もありません。
const btn = document.querySelector('#theme-toggle');
btn.addEventListener('click', () => {
const current = document.documentElement.getAttribute('data-theme');
document.documentElement.setAttribute(
'data-theme',
current === 'dark' ? 'light' : 'dark'
);
});JavaScriptによる変数の更新
element.style.setProperty('--name', value)は、インラインでカスタムプロパティを更新します。removePropertyで削除すると、カスケードされた値に戻ります。これにより、動的なテーマやアニメーションする値を実現できます。
// Dynamically set a CSS variable from JS:
document.documentElement.style.setProperty('--primary-hue', '220');
// Based on input:
const hue = document.querySelector('#hue-slider');
hue.addEventListener('input', () => {
document.documentElement.style.setProperty('--primary-hue', hue.value);
});デザイントークンをCSS変数として定義
色のパレット、スペーシングスケール、タイプスケールなど、すべてのデザイン上の決定をCSS変数として定義します。これにより、コンポーネントが参照する単一の信頼できる情報源を作成できます。トークンを変更すると、その変更がすぐにすべての場所へ反映されます。
:root {
/* Colour scale */
--blue-50: #ebf8ff;
--blue-100: #bee3f8;
--blue-500: #3182ce;
--blue-900: #1a365d;
/* Spacing scale */
--space-1: 4px;
--space-2: 8px;
--space-4: 16px;
--space-8: 32px;
}calc()での変数の使用
CSS変数はcalc()内でも使用できるため、トークンの値に基づいたレスポンシブな計算が可能になります。
:root { --header-height: 64px; }
.content {
/* Leave room for fixed header */
padding-top: calc(var(--header-height) + 24px);
min-height: calc(100vh - var(--header-height));
}ブラウザーの対応状況
CSSカスタムプロパティは、すべてのモダンブラウザーでサポートされています(主要ブラウザーでは2016年以降)。この機能のためにプリプロセッサーを使う必要はありません。非常に古いブラウザーへのフォールバックとして、var()の前に静的な値を指定してください。
.btn {
background: blue; /* IE fallback */
background: var(--color-primary); /* modern browsers */
}CSSカスタムプロパティとSass変数の比較
Sass変数は静的な値にコンパイルされます。CSSカスタムプロパティは実行時に存在し、動的に変更でき、DOMを通じてカスケードします。テーマ設定にはCSS変数を、ビルド時の定数にはSass変数を使用してください。
確認問題
JavaScriptからCSSカスタムプロパティを読み取り、更新するにはどうすればよいでしょうか。
まとめ:CSSカスタムプロパティ
グローバルスコープには、:rootで--を付けて宣言します。var()で使用します。スコープを限定した変数は子孫要素へカスケードします。ダークモードでは、メディアクエリまたはdata属性で色のトークンを再定義します。JavaScriptからはstyle.setProperty()で更新します。デザイントークンを変数にすることで、単一の信頼できる情報源になります。
よくある質問
「テーマ設定のための CSS 変数」レッスンは無料ですか?
はい。「テーマ設定のための CSS 変数」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Frontend Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Frontend Academyコースには全4レッスンが含まれています。
「テーマ設定のための CSS 変数」で何を学びますか?
-- でカスタムプロパティを宣言し、var() で参照し、ネストしたスコープで上書きして、ライト/ダークテーマの切り替えを実装します。 ブラウザで直接実行するハンズオンコードでFrontend Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Frontend Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのFrontend Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「テーマ設定のための CSS 変数」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このFrontend Academyレッスンでコードを書いて実行できますか?
はい。すべてのFrontend Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。