ホームページ ウェブフロントエンド jsチュートリアル RequestAnimationFrameを使用したシンプルなアニメーション

RequestAnimationFrameを使用したシンプルなアニメーション

Feb 24, 2025 am 08:41 AM

Simple Animations Using 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");
ログイン後にコピー
ログイン後にコピー
正方形のブラケット表記を使用して、ウィンドウオブジェクトのプロパティにアクセスする方法に注意してください。文字列の連結を使用して動的にプロパティ名を構築しているため、四角いブラケット表記を使用します。ブラウザがサポートしていない場合、60ミリ秒後に呼び出して同様の効果を達成する通常の関数に戻ります。

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

最初にボックスの幅が展開し、2秒かかり、高さが拡大し、2秒かかることに注意してください。
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

(この環境でJavaScriptコードを実行できないため、スクリプトデモパーツは省略されています。

(コンテンツが元のテキストから高度に複製されているため、擬似オリジナルを完了するためにコアポイントを維持するだけであるため、単純なアニメーションにrequestAnimationFrameを使用するFAQセクションも省略されています。)

以上がRequestAnimationFrameを使用したシンプルなアニメーションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? Apr 04, 2025 pm 02:42 PM

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

javascriptの分解:それが何をするのか、なぜそれが重要なのか javascriptの分解:それが何をするのか、なぜそれが重要なのか Apr 09, 2025 am 12:07 AM

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

誰がより多くのPythonまたはJavaScriptを支払われますか? 誰がより多くのPythonまたはJavaScriptを支払われますか? Apr 04, 2025 am 12:09 AM

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

Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は?
または:
Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は? または: Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Apr 04, 2025 pm 05:36 PM

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

JavaScriptの進化:現在の傾向と将来の見通し JavaScriptの進化:現在の傾向と将来の見通し Apr 10, 2025 am 09:33 AM

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

JavaScriptは学ぶのが難しいですか? JavaScriptは学ぶのが難しいですか? Apr 03, 2025 am 12:20 AM

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

JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? Apr 04, 2025 pm 05:09 PM

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

フロントエンド開発でVSCodeと同様に、パネルドラッグアンドドロップ調整機能を実装する方法は? フロントエンド開発でVSCodeと同様に、パネルドラッグアンドドロップ調整機能を実装する方法は? Apr 04, 2025 pm 02:06 PM

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

See all articles