素のJavaScriptだけでアニメーションを実装するWeb Animations API
Web Animations APIとは、他のライブラリーを使わずにアニメーションを実装できるJavaScriptの仕様です。CSSアニメーションと違い、様々な関数やイベントと組み合わせてより柔軟に、より豊かな表現が可能となります。今回はそんなWeb Animations APIを使ってみましょう!
↑私が10年以上利用している会計ソフト!
Web Animations APIの基本の書き方
基本的な考え方や構造はCSSアニメーションと同じですが、アニメーションの内容やどう動かすかの指定は、配列やオブジェクトで記述していきます。基本形はこんな感じ:
JavaScript
動かす要素.animate(動かす内容, 動きの詳細);
動かす内容(キーフレーム)
animate()
の第一引数には動かす内容、キーフレームを指定します。CSSと同じ形でプロパティーを書きますが、JavaScriptの文法にあわせて、CSSの -
がつくプロパティーは -
を除いて大文字表記にします。(例: font-size
→ fontSize
)
値は開始点、終了点の指定をします。書き方は角括弧 [ ]
で囲んで配列のように記述したり、
const keyframes = { プロパティー1: ["開始の値", "終了の値"], プロパティー2: ["開始の値", "終了の値"], }
キーフレームごとに波括弧 { }
で囲んでもOK。
const keyframes = [ { プロパティー1: "開始の値", プロパティー2: "開始の値" }, { プロパティー1: "終了の値", プロパティー2: "終了の値" } ]
動きの詳細(タイミング)
第二引数には、動かす時間やタイミング、繰り返しなどの指定をします。必須項目はアニメーションの再生時間を表す duration
で、他に設定項目がないなら値のみでOK。以下の例は背景色を3秒かけて動かします。
JavaScript
document.body.animate({ background: ["#fcc", "#f66"], }, 3000 );
他にもオプションを指定するなら、動かす内容(キーフレーム)と同じく配列のように指定します。
delay
アニメーションの開始を遅らせる時間。ミリ秒の数値を記述。初期値は0。
direction
アニメーションを実行する方向。
- normal … 通常の方向で再生(初期値)
- alternate … 奇数回で通常・偶数回で反対方向に再生(行って帰って行って帰って…という具合)
- reverse … 逆方向に再生
- alternate-reverse … alternate の逆方向に再生
duration
アニメーションの再生時間。整数値のミリ秒で記述するので、1秒の場合「1000」と記述します。
easing
アニメーションが変化する速度やタイミング。
- linear … 一定の速度で変化(初期値)
- ease … 開始時と終了時は緩やかに変化
- ease-in … 最初はゆっくり、だんだん速く変化
- ease-out … 最初は速く、だんだんゆっくりと変化
- ease-in-out … 開始時と終了時はかなり緩やかに変化
- steps() … 段階ごとに変化
- cubic-bezier() … ベジエ曲線の座標にそって変化
fill
アニメーションの再生前後の状態。
- none(初期値)
- forwards … 再生後、最後のキーフレームの状態を保持
- backwards … 再生前、最初のキーフレームの状態を適用
- both … forwards と backwards の両方を適用
iterations
アニメーションを繰り返す回数。初期値は1。無限ループにするには Infinity
を指定。
※ Infinity
は文字列ではなくJavaScriptの予約語なので、クォーテーションで囲まず、一文字目は大文字にします。"Infinity"
や infinity
と書くと動作しません。
簡単な例
以下のコードでは body
の背景色を薄いピンク #fcc から濃いピンク #f66 に3秒かけて変化させ、アニメーションが終わったら終了時の値で停止します。
See the Pen
JavaScript Web Animations API Basic by Mana (@manabox)
on CodePen.
サンプル画面右下「Rerun」をクリックして動作確認できます!↑
ふよふよ動く流体シェイプ
ここ数年よく見かける、ふよふよ動くシェイプ。いろんな実装方法がありますが、ここでは border-radius を使って少し歪んだ楕円を作成し、角丸具合に変化をつけて動かしています。
See the Pen
JavaScript Web Animations API Fluid Shape by Mana (@manabox)
on CodePen.
ローディングと組み合わせる
他にもCSSアニメーションとの違いとしてあげられるのは、ローディングやクリックといったイベントとの組み合わせがかんたんなところです。まずはローディングとの組み合わせ方法を見てみましょう。 window.onload
を使ってページを読み込んだら幕が上がるようなイメージにしてみました。
See the Pen
Loading animation by Mana (@manabox)
on CodePen.
サンプル画面右下「Rerun」をクリックして動作確認できます!↑
クリックと組み合わせる
CSSアニメーションと組み合わせて、クリックしたら指定のクラスを追加して…という方法がこれまではよく利用されてきましたが、Web Animations APIのいいところはJavaScriptのみで完結できるところ。CSSとJavaScriptのファイルを行き来する必要がなくなり、コードの見通しがよくなります。以下の例ではリンクをクリックすると全体をぼかしながらフェードアウトさせてリンク先へ遷移します。
See the Pen
Fadeout link animation by Mana (@manabox)
on CodePen.
水色のボタンをクリックして動作確認できます!↑
Web Animations APIの対応ブラウザー
Web Animations APIはChrome、Edge、Firefox、Safariなどのブラウザーに対応しています。IEには非対応ですが、Polyfillがあるので、必要な方は利用するといいですね!
この他にも、play()
や pause()
、 reverse()
などと組み合わせて再生制御をしたり、offset
で変化する位置を調整したりと、様々な表現が実装可能です。ぜひ試してみてくださいね!