詳細ガイド
アニメーション

CSSでアプリケーションをアニメーション化する

CSSには、アプリケーション内で美しく魅力的なアニメーションを作成するための強力なツールが揃っています。

ネイティブCSSでアニメーションを書く方法

ネイティブCSSでアニメーションを書いたことがない場合は、入門に役立つ優れたガイドがいくつもあります。以下にいくつか紹介します。 MDNのCSSアニメーションガイド W3SchoolsのCSS3アニメーションガイド CSSアニメーションの完全チュートリアル 初心者向けCSSアニメーション

また、次の動画も参考にしてください。 9分でCSSアニメーションを学ぶ Net NinjaのCSSアニメーションチュートリアル再生リスト

まずはこれらのガイドやチュートリアルに目を通し、その後に本ガイドに戻ってきてください。

再利用可能なアニメーションを作成する

@keyframesを使用すると、アプリケーション全体で共有できる再利用可能なアニメーションを作成できます。共通のCSSファイルにキーフレームアニメーションを定義しておけば、アプリケーション内の任意の場所で再利用できます。

animations.css

@keyframes sharedAnimation {  to {    height: 0;    opacity: 1;    background-color: 'red';  }}.animated-class {  animation: sharedAnimation 1s;}

要素にanimated-classクラスを追加すると、その要素でアニメーションが開始されます。

トランジションをアニメーション化する

状態とスタイルをアニメーション化する

要素を開いたり閉じたりするときなど、2つの異なる状態の間をアニメーションで遷移させたいことがあります。CSSクラスを切り替えることで、キーフレームアニメーションやトランジションを使って実現できます。

animations.css

.open {  height: '200px';  opacity: 1;  background-color: 'yellow';  transition: all 1s;}.closed {  height: '100px';  opacity: 0.8;  background-color: 'blue';  transition: all 1s;}

openまたはclosed状態のトリガーは、コンポーネント内で要素のクラスを切り替えて行います。例は、テンプレートガイドで確認できます。

同様の例として、テンプレートガイドのスタイルを直接アニメーション化するも参照してください。

トランジション、タイミング、イージング

アニメーションでは、継続時間や遅延、イージングの挙動を調整することがよくあります。これは複数のCSSプロパティ(またはショートハンド)で指定できます。

キーフレームアニメーションでは、animation-durationanimation-delayanimation-timing-functionを指定するか、animationショートハンドプロパティを使用します。

animations.css

.example-element {  animation-duration: 1s;  animation-delay: 500ms;  animation-timing-function: ease-in-out;}.example-shorthand {  animation: exampleAnimation 1s ease-in-out 500ms;}

同様に、@keyframesを使用しないアニメーションでは、transition-durationtransition-delaytransition-timing-function、およびtransitionショートハンドプロパティを使用できます。

animations.css

.example-element {  transition-duration: 1s;  transition-delay: 500ms;  transition-timing-function: ease-in-out;  transition-property: margin-right;}.example-shorthand {  transition: margin-right 1s ease-in-out 500ms;}

アニメーションをトリガーする

アニメーションは、CSSのスタイルやクラスを切り替えることでトリガーできます。クラスが要素に追加されるとアニメーションが実行され、クラスを削除すると、その要素に定義されているCSSに戻ります。例を示します。

トランジションとトリガー

height: auto をアニメーション化する

CSS Gridを使用すると、height: autoへのアニメーションを実現できます。

すべてのブラウザをサポートする必要がない場合は、height: autoをアニメーション化するためのより本質的な解決策であるcalc-size()も確認してください。詳しくは、MDNのドキュメントとこの項目に関連するチュートリアルを参照してください。

ビューへの出入りをアニメーション化する

要素がビューに入るとき、またはビューから出るときのアニメーションを作成できます。まずは、ビューに入るときのアニメーションを見ていきましょう。animate.enterを使うと、要素がビューに入るときにアニメーション用のクラスが適用されます。

ビューから出るときのアニメーションも、ビューに入るときと同様です。animate.leaveで、要素がビューから出るときに適用するCSSクラスを指定します。

animate.enteranimate.leaveについて詳しくは、EnterとLeaveのアニメーションガイドを参照してください。

インクリメントとデクリメントをアニメーション化する

インクリメントとデクリメントに合わせてアニメーションするのは、アプリケーションでよくあるパターンです。以下はその例です。

アニメーション(またはすべてのアニメーション)を無効にする

指定したアニメーションを無効にする方法はいくつかあります。

  1. animationtransitionnoneに強制するカスタムクラスを作成します。
.no-animation {  animation: none !important;  transition: none !important;}

このクラスを要素に適用すると、その要素ではアニメーションが一切実行されません。また、DOM全体またはDOMの一部にスコープすることで、この挙動を強制できます。ただし、この方法ではアニメーションイベントも発生しなくなります。要素の削除のためにアニメーションイベントを待っている場合、この方法は機能しません。回避策としては、継続時間を1ミリ秒に設定します。

  1. prefers-reduced-motionメディアクエリを使用して、アニメーションを控えたいユーザーにはアニメーションを再生しないようにします。

  2. プログラムからアニメーションクラスを追加しないようにします。

アニメーションのコールバック

アニメーション中の特定のタイミングで処理を実行したい場合、リッスンできるイベントがいくつかあります。次はその一例です。

OnAnimationStart
OnAnimationEnd
OnAnimationIteration
OnAnimationCancel

OnTransitionStart
OnTransitionRun
OnTransitionEnd
OnTransitionCancel

Web Animations APIには、他にも多くの機能があります。利用できるアニメーション関連APIについては、ドキュメントを参照してください。

NOTE: これらのコールバックはバブリング(イベント伝播)します。子要素と親要素の両方をアニメーション化している場合、イベントは子要素から親要素へ伝播します。意図したイベントターゲットに応答しているかを判断するために、伝播を停止するか、イベントの詳細を確認してください。適切なノードを対象にしていることは、animationnameプロパティやトランジション対象のプロパティを確認すると検証できます。

複雑なシーケンス

アニメーションは、単純なフェードインやフェードアウトだけではありません。複数のアニメーションを組み合わせた複雑なシーケンスを実行したいこともあるでしょう。ここでは、そうしたシナリオをいくつか見ていきましょう。

リスト内のアニメーションに段階的な遅延を付ける

よくある効果の1つに、リスト内の各要素のアニメーションを段階的に遅らせてカスケード効果を作るものがあります。これはanimation-delayまたはtransition-delayを利用して実現できます。次はそのCSSの例です。

並行アニメーション

animationショートハンドプロパティを使用すると、1つの要素に複数のアニメーションを同時に適用できます。それぞれに継続時間や遅延を個別に設定できるため、アニメーションを合成して複雑な効果を作成できます。

.target-element {  animation:    rotate 3s,    fade-in 2s;}

この例では、rotatefade-inのアニメーションは同時に実行されますが、継続時間が異なります。

並び替え可能なリストの要素をアニメーション化する

@forループ内の要素は削除されて再追加されるため、enterアニメーションとして@starting-stylesを使用したアニメーションが実行されます。同じ挙動はanimate.enterでも実現できます。要素が削除されるときにアニメーションするには、以下の例のようにanimate.leaveを使用します。

アニメーションをプログラムで制御する

Element.getAnimations()を使用すると、要素に関連付けられたアニメーションを直接取得できます。これは、その要素上のすべてのAnimationを配列として返します。Animation APIを使えば、@angular/animationsパッケージのAnimationPlayerよりも多くの操作が可能です。cancel()play()pause()reverse()などを呼び出せます。このネイティブAPIだけで、アニメーションの制御に必要な機能が揃います。

Angularアニメーションについてさらに詳しく

以下の項目にも興味があるかもしれません: