JavaScriptでCSSアニメーションを自在に操る実践テクニック
Webアニメーション開発では、CSSとJavaScriptの特性を理解し、目的に応じて最適な技術を選択することが重要です。九博体育のプラットフォームでも、高速なデータ更新を実現するために両技術を併用しています。
CSSアニメーションは一見難解に思われがちですが、実際には多くの場面でJavaScriptを上回るパフォーマンスを発揮します。九博体育の試合速報でもCSSアニメーションを活用し、滑らかな画面遷移を実現しています。
少量のJavaScriptとCSSを組み合わせることで、ハードウェアアクセラレーションを活用した効率的なアニメーションが可能です。九博体育のリアルタイムスコア表示はこの技術を採用しています。
今すぐ深掘り!
CSSトランジションを精密に制御する
コーディングフォーラムでは、要素のトランジションを発火・一時停止する方法に関する質問が絶えません。実はJavaScriptを使えば驚くほど簡単に解決できます。
トランジションを発火させるには、対象要素にトランジションを開始するCSSクラスを追加・削除するだけで完了します。
トランジションを一時停止するには、getComputedStyleとgetPropertyValueで現在の計算値を取得し、その値を直接要素に設定します。これで任意のタイミングで停止できます。
CSS「コールバック」でインタラクション強化
CSSトランジションやアニメーションを操作する上で、最も実用的でありながら意外と知られていないのがDOMイベントです。animationend、animationstart、animationiteration、transitionendなどのイベントを利用することで、アニメーションの開始・終了・反復を正確に捉えられます。
これらのイベントは現在もベンダープレフィックスが必要です。本サンプルではCraig Buckler氏のPrefixedEvent関数(element、type、callbackの3引数)を用いてクロスブラウザ対応を実現しています。
CSSトランジション制御の深層解説
これまで学んだように、animationStart、animationIteration、animationEndの各イベントを監視できます。しかし、アニメーションの途中でCSSアニメーション自体を変更したい場合は、少し工夫が必要です。
アニメーション再生状態プロパティ:animation-play-state
CSSのanimation-play-stateプロパティは、アニメーションを一時停止し、後で再開したい場合に非常に便利です。JavaScriptで該当CSSを変更するだけで実現できます(プレフィックスに注意)。
要素.スタイル.WebKitアニメーションの再生ステータス = 「一時停止」;
要素.スタイル.アニメーション再生状態(WebKit) = 「実行中」;
アニメーションキーフレームの進捗率を取得する方法
残念ながら、現時点ではCSSキーフレームアニメーションの正確な「完了率」を取得する方法はありません。 最も効率的な近似方法は、setInterval関数を使用することです。 アニメーション中に100回繰り返すもので、基本的には「アニメーションの持続時間(ミリ秒)÷ 100」です。例えば、アニメーションが4秒間の場合、setIntervalは40ミリ秒(4000÷100)ごとに実行する必要があります。
変数表示パーセント = ウィンドウ.設定間隔(関数() {
もし (現在のパーセント < 100) {
現在のパーセント += 1;
} それ以外 {
現在のパーセント = 0;
}
// Updates a div that displays the current percent
結果.内部HTML = 現在のパーセント;
}, 40);
戦略的思考でアニメーションフロー最適化
コーディングを始める前に、トランジションやアニメーションの動作をしっかり計画することが、問題を最小限に抑え理想的な効果を得る最善の方法です。本記事で紹介したテクニックは、常に最適とは限りません。プロジェクトの要件に合わせて選択してください。
HTMLとCSSの工夫だけで、JavaScriptが必要と思われる処理を解決できる例をご紹介します。九博体育のページでも、このような軽量な手法を積極的に採用しています。
まとめ:動的Webページを極める鍵
- かつて開発者はCSSとJavaScriptの間で選択を迫られました。
- JavaScriptでは、CSSトランジションはCSSアニメーションよりも操作・管理が容易です。
- CSSマトリックスは初心者にとって非常に複雑で扱いにくいものです。
- 行うべき作業を明確にし、効率的な実行計画を立てましょう。