CSS変数:var()からテーマ、@propertyまで

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

CSS変数:構文、スコープ、テーマ、JavaScript、@property | We.Inc

CSSカスタムプロパティを解説します。変数だけで作ったライトとダークのテーマをその場で確認でき、JavaScriptのgetPropertyValueとsetProperty、@property、Tailwind v4の@theme、つまずきやすい点も扱います。

CSS変数は、--brand: #2563eb; のように先頭にハイフンを2つ付けて宣言します。ページ全体から参照できるよう、たいていは:rootの中に書き、var(--brand)で読み出します。2つ目の引数は代替値で、var(--brand, blue)のように書きます。変数は色と同じように継承されるため、あるセクションで定義し直すと、その中のすべてに反映されます。そのおかげで、テーマを手軽に作れます。

構文の早見表

このガイドでは、宣言、スコープ、代替値の基本に続いて、変数だけを切り替えるテーマ切り替え、このページ上でJavaScriptから変数を読み書きできるツール、@propertyによる登録済みプロパティ、Tailwind v4がテーマを変数に変換する仕組み、そしてvar()が気付かないうちに効かなくなる間違いを取り上げます。

よくある質問

CSS変数とSassの変数の違いは何ですか?

Sassの変数はスタイルシートのコンパイル時に置き換えられ、出力には残りません。CSSのカスタムプロパティは実行時にブラウザーの中に存在し、DOMを通じて継承され、要素ごとに異なる値を持てます。さらに、ページの読み込み後にJavaScriptやメディアクエリのルールで変更することもできます。

メディアクエリの中でCSS変数を使えますか?

使えません。メディアクエリは継承元となる要素がない状態で評価されるため、@mediaルールの条件部分ではvar()を使えません。ただし、メディアクエリのブロックの中で変数の値を変更することはでき、これがトークンをレスポンシブにする一般的な方法です。

変数が効かないのはなぜですか?

綴りと大文字小文字、変数がその要素または祖先で定義されているか、最終的な値がそのプロパティにとって有効かを確認してください。置き換えた後の値が無効な場合、その宣言は計算値の時点で無効となり、プロパティは直前のルールではなく、継承値または初期値に戻ります。

CSS変数はアニメーションできますか?

登録されていない変数は文字列として扱われるため、なめらかに変化せず中間点で切り替わります。@propertyで<color>や<angle>などの構文を指定して登録すれば、トランジションやアニメーションでブラウザーがなめらかに補間できるようになります。

CSS変数はどこでも使えますか?

カスタムプロパティとvar()は、何年も前から主要なブラウザーすべてで動作しています。@propertyはそれより新しく、Firefoxが対応したのは2024年のバージョン128です。古いバージョンをサポートする場合はcaniuseで確認し、登録しない場合の代替手段も残しておきましょう。

スコープと継承

計算値の時点で無効になる

デモで使っているテーマのトークン

ライトとダークの値

スコープと代替値をその場で確認

局所的な上書きと代替値

2枚目のカードは、自分用に--accentを定義し直しています。3枚目は誰も定義していない変数を使っているため、代替の色が表示されます。

変数だけで作るライトとダークのテーマ

コンポーネントのルールは1組だけです。テーマとは値の組み合わせの違いであり、システムの設定かdata-theme属性によって選ばれます。

JavaScriptで変数を読み書きする

getPropertyValueとsetProperty

どの要素からでも計算値を読み取れます。全体を変えるなら:rootに、その要素の配下だけに効かせたいならその要素に書き込みます。

@property:型付きでアニメーションできる変数

グラデーションの角度をアニメーションさせる

--angleを<angle>として登録すると、ブラウザーが値を補間できるようになります。登録しないと、グラデーションは回転せずに飛び飛びに切り替わります。

Tailwind v4の@theme

トークンがユーティリティと変数になる

Tailwind v4では、@themeの中の変数からbg-brandのようなユーティリティが生成され、さらにvar()で使える本物のCSS変数としても出力されます。

つまずきやすい点

よくあるつまずき

変数だけで作るライトとダークのテーマ

テーマ

ライトモード

ダークモード

週次レポート

先週より注文が増加

件のサンプル注文

詳細を見る

変わるのはここだけ

CSSをコピー

JavaScriptから変数を読み書きする

下のサンプルのボックスは、枠線にvar(--demo-accent, #2563eb)、角にvar(--demo-radius, 8px)を使っています。どちらかの変数を設定すると、ボックスが変化します。

変数名

新しい値

カスタムプロパティの名前は、--demo-radiusのようにハイフン2つで始まります。

読み取る

設定

削除

--demo-radiusを試す

サンプルのボックス

(未設定)

無料で始める · クレジットカード不要

関連: ガイド|Webマーケティングと集客を学ぶ

製品

ご利用いただける方

機能

リソース

会社情報

サイトマップを見る