RequestAnimationFrameを使用したシンプルなアニメーション
コアポイント
-
requestAnimationFrame
は、ブラウザの描画サイクルと同期したアニメーションの書き込みに使用されるヘルパー関数であり、それにより、よりスムーズでCPUを節約するアニメーション効果を実現します。すべての最新のブラウザでサポートされており、古いブラウザーと互換性があります。 -
requestAnimationFrame
animate
を使用して作成された関数は、一連の関数をパラメーターとして受け入れるように設計できます。これは、シーケンスで呼び出され、アニメーションシーケンスを実装します。この関数は、アニメーションの進行状況を追跡し、アニメーションの終了時間を計算できます。 -
requestAnimationFrame
ブラウザのリフレッシュレートと同期して動作するため、setTimeout
またはsetInterval
よりも効率的にアニメーションを作成します。 JavaScriptフレームワークまたはライブラリで使用でき、CSSプロパティ、キャンバスアニメーション、SVGアニメーション、スクロールまたはユーザーインタラクションベースのアニメーションなど、さまざまなアニメーションを処理できます。
dom要素アニメーションでは、数ミリ秒ごとにCSSスタイルを変更して、動きの幻想を作成します。これは、コールバック関数をsetTimeout
に渡し、そのコールバック関数のノードのスタイルオブジェクトを変更することを意味します。次に、もう一度setTimeout
を呼び出して、次のアニメーションフレームをキューアップします。 requestAnimationFrame
この新しいヘルパー関数は、アニメーションのために生まれました。最初はFirefox 4で見られ、IE 10を含むすべてのブラウザに徐々に採用されています。幸いなことに、古いブラウザと互換性があるのは簡単です。
window.requestAnimationFrame(callbackFunction);
setTimeout
(指定された時間遅延の後に実行)とは異なり、ブラウザが次回画面を描画するときにrequestAnimationFrame
コールバック関数を実行します。これにより、ブラウザの描画サイクルと同期できるため、あまり頻繁に描画しないか、頻繁に頻繁に描画しないようになります。つまり、アニメーションは非常にスムーズで、CPUに過負荷になりません。
ブラウザ互換性処理
現在、すべてのブラウザにはrequestAnimationFrame
の接頭辞付きバージョンがあります。そのため、どのバージョンがサポートされているかを検出して参照しましょう。
var _requestAnimationFrame = function(win, t) { return win["webkitR" + t] || win["r" + t] || win["mozR" + t] || win["msR" + t] || function(fn) { setTimeout(fn, 60) } }(window, "equestAnimationFrame");
setTimeout
次に、アニメーションをシミュレートするために
を繰り返し呼び出す単純な関数を構築しましょう。アニメーションを実装するには、繰り返し呼ばれるエントリポイントと内部関数(ステップ関数と呼ばれる)として外部関数が必要です。window.requestAnimationFrame(callbackFunction);
ステップ関数を呼び出すたびに、アニメーションの進行状況を追跡して、いつ終了するかを知る必要があります。アニメーションが終了する時間を計算し、各サイクルの残りの時間に基づいて進行状況を計算します。
var _requestAnimationFrame = function(win, t) { return win["webkitR" + t] || win["r" + t] || win["mozR" + t] || win["msR" + t] || function(fn) { setTimeout(fn, 60) } }(window, "equestAnimationFrame");
new Date()
を使用して、現在の時間をミリ秒単位で取得していることに注意してください。プラス記号は、日付オブジェクトを数値データ型にキャストします。 rate
変数は0〜1の数値であり、アニメーションの進行率を示しています。
アニメ関数の改善
関数の入力と出力を考慮する必要があります。関数が関数と持続時間をパラメーターとして受け入れるようにしましょう。
function animate() { var step = function() { _requestAnimationFrame(step); } step(); }
このようにこの関数を呼び出すことができます:
function animate() { var duration = 1000 * 3, // 3 秒 end = +new Date() + duration; var step = function() { var current = +new Date(), remaining = end - current; if (remaining < 60) { // 如果剩余时间少于 60 毫秒,则在此结束动画 return; } else { var rate = 1 - remaining / duration; // 执行一些动画操作 } _requestAnimationFrame(step); } step(); }
run
関数では、ノードの幅を「100px」から「300px」にアニメーション化するコードを配置します。
function animate(item) { var duration = 1000 * item.time, end = +new Date() + duration; var step = function() { var current = +new Date(), remaining = end - current; if (remaining < 60) { item.run(1); // 1 = 进度为 100% return; } else { var rate = 1 - remaining / duration; item.run(rate); } _requestAnimationFrame(step); } step(); }
アニメーション関数の改善
正常に動作しますが、私が本当に望んでいるのは、順番に呼ばれる関数の配列を入力できることです。このようにして、最初のアニメーションが終了した後、2番目のアニメーションが開始されます。配列をスタックとして扱い、アイテムを一度に1つずつポップします。入力を変更しましょう:
animate({ time: 3, // 以秒为单位的时间 run: function(rate) { /* 使用 rate 执行某些操作 */ } });
はnullで、item
は60ミリ秒未満なので、アレイから最初のアイテムをポップして実行を開始します。アニメーションの最後のフレームでは、remaining
も60未満なので、現在のアニメーションを完了し、次のアイテムを配列からポップアップして、次のアイテムをアニメーション化します。また、私は緩和式を通じてremaining
値を渡したことに注意してください。 0〜1の値は、立方体の割合で成長し、硬く見えます。アニメーション関数を呼び出すために、次のことを行います。
rate
animate({ time: 3, run: function(rate) { document.getElementById("box").style .width = (rate * (300 - 100) + 100) + "px"; } });
コードを少しクリーンアップしましょう。何度か
を呼び出すことに注意してください。これはあまり良くありません。キャッシュしてキャッシュして、開始値と終了値をキャッシュしながらキャッシュしましょう。
getElementById
function animate(list) { var item, duration, end = 0; var step = function() { var current = +new Date(), remaining = end - current; if (remaining < 60) { if (item) item.run(1); // 1 = 进度为 100% item = list.shift(); // 获取下一个项目 if (item) { duration = item.time * 1000; end = current + duration; item.run(0); // 0 = 进度为 0% } else { return; } } else { var rate = remaining / duration; rate = 1 - Math.pow(rate, 3); // 缓动公式 item.run(rate); } _requestAnimationFrame(step); }; step(); }
変数を介してオブジェクトのすべてのプロパティにアクセスできるため、メイン関数を変更する必要はないことに注意してください。これで、ステップ関数を実行するたびに、すべての変数をキャッシュします。それでおしまい。 run
を利用し、古いブラウザーにフォールバックを提供するシンプルなアニメーションヘルパー関数。 this
requestAnimationFrame
(コンテンツが元のテキストから高度に複製されているため、擬似オリジナルを完了するためにコアポイントを維持するだけであるため、単純なアニメーションにrequestAnimationFrameを使用するFAQセクションも省略されています。)
以上がRequestAnimationFrameを使用したシンプルなアニメーションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











フロントエンドのサーマルペーパーチケット印刷のためのよくある質問とソリューションフロントエンド開発におけるチケット印刷は、一般的な要件です。しかし、多くの開発者が実装しています...

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

スキルや業界のニーズに応じて、PythonおよびJavaScript開発者には絶対的な給与はありません。 1. Pythonは、データサイエンスと機械学習でさらに支払われる場合があります。 2。JavaScriptは、フロントエンドとフルスタックの開発に大きな需要があり、その給与もかなりです。 3。影響要因には、経験、地理的位置、会社の規模、特定のスキルが含まれます。

この記事の視差スクロールと要素のアニメーション効果の実現に関する議論では、Shiseidoの公式ウェブサイト(https://www.shisido.co.co.jp/sb/wonderland/)と同様の達成方法について説明します。

JavaScriptの最新トレンドには、TypeScriptの台頭、最新のフレームワークとライブラリの人気、WebAssemblyの適用が含まれます。将来の見通しは、より強力なタイプシステム、サーバー側のJavaScriptの開発、人工知能と機械学習の拡大、およびIoTおよびEDGEコンピューティングの可能性をカバーしています。

JavaScriptを学ぶことは難しくありませんが、挑戦的です。 1)変数、データ型、関数などの基本概念を理解します。2)非同期プログラミングをマスターし、イベントループを通じて実装します。 3)DOM操作を使用し、非同期リクエストを処理することを約束します。 4)一般的な間違いを避け、デバッグテクニックを使用します。 5)パフォーマンスを最適化し、ベストプラクティスに従ってください。

同じIDを持つ配列要素をJavaScriptの1つのオブジェクトにマージする方法は?データを処理するとき、私たちはしばしば同じIDを持つ必要性に遭遇します...

フロントエンドのVSCodeと同様に、パネルドラッグアンドドロップ調整機能の実装を調べます。フロントエンド開発では、VSCODEと同様のVSCODEを実装する方法...
