CSS変数がもっと便利になる新しい記述方法、CSSの次世代変数@propertyがすべてのブラウザにサポートされました
Post on:2024年8月8日
CSSの@property
がFirefoxにサポートされ、デスクトップ・スマホのすべてのブラウザでサポートされました。
@property
は次世代変数と呼ばれるもので、これまでの変数(カスタムプロパティ)の使い勝手が大幅に向上します。@property
によるカスタムプロパティの記述方法、@property
を使ったCSSのテクニックを紹介します。
@property: Next-gen CSS variables now with universal browser support
by Una Kravets
下記は各ポイントを意訳したものです。
※元サイト様のライセンスに基づいて翻訳しています。基づいてというのは、貢献部分に関して同ライセンスも含みます。
はじめに
CSSのパワーアップに備えましょう! CSS Houdini(CSSの拡張性のために誕生したAPIの総称)の一つである@property
ルールが、すべてのモダンブラウザの安定版でサポートされました。
@property
は2024年7月にFirefoxにサポートされ、デスクトップ版・スマホ版のすべてのブラウザにサポートされました。
この画期的な機能により、CSSのカスタムプロパティ(CSS変数とも呼ばれます)の制御と柔軟性が新たなレベルに引き上げられ、スタイルシートがよりスマートでダイナミックになります!
@propertyのメリット
@property
ルールを使用するメリットは、下記の通り。
-
- セマンティック
@property
を使用して、カスタムプロパティの型(構文)を設定します。これにより、カスタムプロパティが保持するデータの種類(カラー・サイズ・数値など)がブラウザに通知され、予期せぬ結果が防止され、グラデーションのアニメーション化などの新しい可能性がサポートされます。
-
- フォールバック
- スタイルが失敗することはもうありません。
@property
を使用して、カスタムプロパティの初期値を設定します。もし無効な値が代入されても、ブラウザは定義されたフォールバック値をスタイルに適用します。
-
- エラー処理の改善
- 強化された構文の安全性とフォールバック機能により、CSS内で直接テストと検証をおこなえる新しい機会が開かれます。
@propertyによるカスタムプロパティの記述方法
まずは、これまでのカスタムプロパティをおさらいします。
カスタムプロパティは--
を付けたプロパティ名と値を設定します。カスタムプロパティの値は、ブラウザによって文字列として解析されます。
下記は、デフォルト(文字列ベース)のカスタムプロパティがどのように初期化されるかを示しています。
1 2 3 |
:root { --myColor: hotpink; } |
文字列以外のセマンティクスを含む「高度なカスタムプロパティ」の利点を活用するには、カスタムプロパティを@property
で設定します。
下記は、同じカスタムプロパティを@property
で初期化したものです。
1 2 3 4 5 |
@property --myColor { syntax: '<color>'; inherits: false; initial-value: hotpink; } |
@property
で初期化されたカスタムプロパティは、名前と値だけでなく、より多くの詳細な情報を持っています。構文タイプが含まれ、継承をtrue
またはfalse
で設定できます。
これまではそのプロパティに値としてカラーが含まれていることが予想され、そのカラーをスタイルシート内の他の場所で使用していましたが、もし誰かがそのプロパティをアップデートして値を数値にした場合、そのプロパティは他の場所で失敗することになります。@propertyによるカスタムプロパティの利点は、initial-value
でフォールバックを定義することができ、syntax
でこのプロパティはカラー値を保持する必要があることを宣言できます。そのため、カラー以外の値が使用されても、代わりにフォールバックが機能します。
メモ:
CSS.registerProperty()
を使用して、JavaScriptで構文、継承、初期値を使用してカスタムプロパティを設定できます。また、style.setProperty();
でカスタムプロパティ値を操作することもできます。
@propertyの使い方: きらめくグラデーション背景
@property
の優れた使い方の一つに、これまではトランジションが不可能だったプロパティのスムーズなアニメーションです。たとえば、グラデーションはブラウザによって画像として認識されます。しかし、@property
でカスタムプロパティに構文的な意味を与えると、グラデーション・ステートメントで使用することができます。
これにより、グラデーション内で宣言された2つの値間のアニメーションを記述することができ、アニメーションが可能になります。デモページをご覧ください。2つの放射状グラデーションで構成された繊細な背景アニメーションを持つカードで、グラデーションのカラーは異なる時間軸で変化します。
See the Pen
CSS @property animated bg card by coliss (@coliss)
on CodePen.
まずは、カスタムプロパティ値をカラーとして設定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
@property --card-bg { syntax: "<color>"; inherits: false; initial-value: lavender; } @property --shine-1 { syntax: "<color>"; inherits: false; initial-value: wheat; } @property --shine-2 { syntax: "<color>"; inherits: false; initial-value: lightpink; } |
続いて、初期のグラデーション背景を作成します。
1 2 3 4 5 6 7 |
.card { background: radial-gradient( 300px circle at 55% 60% in oklab, var(--shine-2), transparent 100% 100%), radial-gradient(farthest-side circle at 75% 30% in oklab, var(--shine-1) 0%, var(--card-bg) 100%); } |
さらに、キーフレーム値を設定します。
1 2 3 4 5 6 7 8 9 10 11 |
@keyframes animate-color-1 { to { --shine-1: orange; } } @keyframes animate-color-2 { to { --shine-2: hotpink; } } |
最後に、アニメーション化します。
1 |
animation: animate-color-1 8s infinite linear alternate, animate-color-2 1s infinite linear alternate; |
終わりに
CSSの@property
で定義されたカスタムプロパティは、CSS変数にセマンティックとコンテキストを与えることで、CSS言語を拡張する非常に強力な機能です。現在、@property
はベースラインに追加されたことで、CSSはますます強力にパワーアップします。
sponsors