CSSのこの新機能、すごく楽しみ! UI要素にさまざまなアニメーションを簡単に実装できるようになります
Post on:2023年4月27日
朗報です!!!
今までJavaScriptや複雑なCSSを使用しないと実装できなかったアニメーションが、簡単なCSSだけで実装できるようなります!
たとえば現在のCSSではtransition
でdisplay
は機能しませんが、CSSの新機能を使用すると、下記のようなCSSで表示・非表示のアニメーションを実装できるようになります。
このCSSの新機能により、UI要素にさまざまなアニメーションを簡単に実装できるようになります。
Google ChromeのデベロッパーUna氏(@Una)によると、transition
プロパティでdisplay
が使用できるようになり、要素の表示・非表示、ポップオーバーなどのアニメーションが簡単なCSSで実装できるようになるとのことです。
👀 An early look at transitioning to and from
display: none
in CSS 👀 pic.twitter.com/uICGqCZcvC— Una 🇺🇦 (@Una) April 25, 2023
CSSの新機能は、@initial
です。
※プロパティの初期値を設定するinitial
とは異なります。
@initial
は、初期状態を設定できるCSSの新機能です。transition
でdisplay
が使用できないのはなぜかというと、transition
は状態間の変化を定義するプロパティで、display: none;
とdisplay: block;
で変化させるとdisplay: none;
時は存在がない状態だったため使用できませんでした。しかし、@initial
で初期状態を設定すると、display
が使用できるようになります。
@initial
は仕様が確定している状態ではありません(w3c/csswg-drafts)。前述したようにinitial
プロパティと混同しやすいなど懸念事項があるため、変更される可能性もあります。現在@initial
が動作するブラウザは、Chrome Canaryのみとなっています。
これらのアニメーションは、デモページで実際に試せます。
2023年4月現在、デモを動作させるには、Chrome Canaryで「#experimental-web-platform-feature」のflagを有効にする必要があります。
chrome://flags/にアクセスし、flagを有効(Enabled)にする
まずは、チェックボックスをオンにすると、要素がdisplay: none;
からdisplay: block;
にトランジションするデモ。オフにすると非表示になります。
デモページ(Chrome Canaryで表示)
CSSは、下記の通り。
display
がtransition
で使用できるようになるのもすごいですが、@initial
でアニメーション化前の状態を設定することが重要なポイントです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
.display-on-check { opacity: 0; display: none; /* opacityとdisplayの両方を設定 */ transition: opacity 0.5s, display 0.5s; } /* チェックしたときのアクティブな状態 */ :checked + .display-on-check { opacity: 1; display: block; } /* 初期状態を設定 */ @initial { :checked + .display-on-check { opacity: 0; } } |
続いて、:popover
と@initial
を使用したポップオーバー。下部の3つのアイコンをタップすると、それぞれのポップオーバーが表示されます。
デモページ(Chrome Canaryで表示)
CSSは、下記の通り。
:popover-open
と@initial
を使用して、オープンする前の初期状態のスタイルを設定します。:popover-open
内で、オープン状態を設定します。- ベースとなる要素で、アニメーション先を設定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
.settings-popover { &:popover-open { /* 初期状態を設定 */ @initial { transform: translateY(20px); opacity: 0; } /* オープン状態 */ transform: translateY(0); opacity: 1; } /* オープン後、クローズ状態 */ transform: translateY(-50px); opacity: 0; transition: transform 0.5s, opacity 0.5s, display 0.5s; } |
sponsors