CSSでdisplay:none;からアニメーションができる! @starting-styleがすべてのブラウザにサポートされました
Post on:2024年10月1日
CSSの@starting-style
が先日リリースされたFirefoxでもサポートされ、これでデスクトップ・スマホのすべてのブラウザでサポートされました。
@starting-style
はアニメーション化させる要素に対して開始時のスタイルを設定でき、display: none;
からアニメーション化する要素に対して必須となります。
Now in Baseline: animating entry effects
by Una Kravets
下記は各ポイントを意訳したものです。
※元サイト様のライセンスに基づいて翻訳しています。基づいてというのは、貢献部分に関して同ライセンスも含みます。
はじめに
Four new CSS features for smooth entry and exit animations(当ブログの翻訳記事CSSでスムーズなアニメーションを実現する4つの新しい機能)では、Chromeに実装された便利な機能を紹介しました。
今回は、先日Firefox 129にもサポートされた@starting-style
, transition-behavior: allow-discrete;
がすべてのブラウザで利用可能になったので紹介しようと思います。
display: none;
からのアニメーション化、トップレイヤーへのアニメーション化など、アニメーションさせる要素に対して開始値を設定できるようになりました。
CSSの@starting-styleとは
CSSの@starting-style
はCSSのアットルールで、アニメーションさせる要素に設定されるプロパティの開始値を設定することができます。
@starting-style
ルールは、要素がページにレンダリングされる前の要素の初期スタイルを定義します。これはdiplay: none;
からアニメーション化する要素に必須となります。これらの要素にはアニメーション化を開始する状態が必要だからです。
@starting-style
の基本構文は、CSSの他のアットルールと同様に、要素のスタイルをその中に記述します。
1 2 3 |
@starting-style { /* 要素のスタイル /* } |
たとえば、ダイアログがアニメーションで開く前のスタイルは、dialog[open]
スタイルを@starting-style
ルール内に記述します。これでダイアログが引く前に使用されるスタイルを設定できます。
1 2 3 4 5 |
@starting-style { dialog[open] { /* ダイアログが開く前のスタイル */ } } |
@starting-style
のサポートブラウザは、下記の通りです。先日リリースされたFirefox 129でもサポートされ、これでデスクトップ・スマホのすべてのブラウザでサポートされました。
allow-discreteで離散アニメーションを有効にする
ダイアログやポップオーバーなど、diplay: none;
からアニメーションする要素の開始値をサポートするために必要なもう一つは、離散プロパティのアニメーションをサポートする新しいアニメーションモードを有効にすることです。
離散プロパティとは、値の間を補完できないプロパティのことです。オン・オフのスイッチのようなものと考えてください。たとえば、diplay
, visibility
, mix-blend-mode
など、機能が1つの値あるいは別の値であるプロパティがあります。この新しいアニメーションモードにより、ブラウザはトランジションの0%ポイントではなく、50%ポイントで値を交換できるようになります。
ちなみに、Web Animationsに定義されているアニメーションのプロパティは、4種類あります。
- not animatable: アニメーション不可
- discrete: 離散的
- by computed value: 算出値による
- repeatable list: 繰り返し可能なリスト
diplay: none;
やvisibility: hidden;
の要素の開始エフェクトをアニメーション化するには、次のいずれかを使用します。
allow-discrete
値を持つtransition-behavior
プロパティallow-discrete
値はtransition
のショートハンド
transition-behavior
の適用は、transition
のショートハンドに含まれているので、2番目の方法をお勧めします。もし、transition-behavior: allow-discrete;
を設定すると、transition
, timing
, easing
関数を適用するtransition
のショートハンドの前に適用すると、ブラウザはtransition-behavior
は無視してしまいます。
transition
のショートハンドで使用する場合は、個別のアニメーションを必要とする特定のプロパティにのみallow-discrete
キーワードを適用します。下記のCSSでは、tranlate
プロパティとdiplay
プロパティの両方を遷移させていますが、allow-discrete
キーワードはdiplay
プロパティにのみ設定しています。
1 |
transition: translate 0.7s ease-out, display 0.7s ease-out allow-discrete; |
transition-behavior
のサポートブラウザは、下記の通りです。デスクトップ・スマホのすべてのブラウザでサポートされています。
transition-behaviorプロパティのサポートブラウザ
アニメーションさせる要素に対して開始値を設定するデモ
これらの機能は、dialog
要素やpopover
属性を使用するコンポーネントなどのトップレイヤー要素に対して特に役立ちます。
下記のデモでは、dialog
要素がビューポート下部から(最初はスクリーン外の100vh
の垂直移動から開始)中央までアニメーション化され、dialog
要素が開いているときに移動が取り除かれます。
1 2 3 4 5 6 7 8 9 10 11 12 |
/* ダイアログが開く前 */ @starting-style { dialog[open] { translate: 0 100vh; } } /* ダイアログが開いている時 */ dialog[open] { translate: 0 0; transition: translate 0.7s ease-out, display 0.7s ease-out allow-discrete; } |
このCSSは、CSSのネストを使用すると、より簡潔に記述できます。
1 2 3 4 5 6 7 8 |
dialog[open] { translate: 0 0; transition: translate 0.7s ease-out, display 0.7s ease-out allow-discrete; @starting-style { translate: 0 100vh; } } |
CSSのネストについて詳しくは、下記をご覧ください。
実際の動作は、デモページをご覧ください。
dialog
要素はビューポート下部から(最初はスクリーン外の100vh
の垂直移動から開始)中央までアニメーション化され、dialog
要素が開いているときに移動が取り除かれます。
See the Pen
Dialog animate-in example by coliss (@coliss)
on CodePen.
終わりに
このような機能がベースラインに導入されたのは、喜ぶべきことです。少なくとも、これらの要素にとっては素晴らしい機能強化となります。もしこれらの機能がなければ、トップレイヤーやdiplay: none;
からアニメーション化する要素は、これまでと同様に遷移なしでページに表示されるだけです。
sponsors