ホームページ ウェブフロントエンド jsチュートリアル jQuery 1.9.1 ソースコード解析シリーズ (15) アニメーション処理のイージングアニメーションコア Tween_jquery

jQuery 1.9.1 ソースコード解析シリーズ (15) アニメーション処理のイージングアニメーションコア Tween_jquery

May 16, 2016 pm 03:28 PM

CreateTweens() は jQuery 内部関数アニメーションで呼び出され、イージング アニメーション グループを作成します。作成完了後の結果は次のようになります。

上記のイージング アニメーション グループは 4 つのアトミック アニメーションで構成されていることがわかります。すべてのアトミック アニメーションに関する情報が含まれています。


createTweens 関数を詳しく見てみましょう。この関数は、トゥイーナー ["*"] を呼び出す配列内の関数を実際に走査します (実際には要素は 1 つだけです)。

  function createTweens( animation, props ) {
    jQuery.each( props, function( prop, value ) {
      var collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
      index = 0,
      length = collection.length;
      for ( ; index < length; index++ ) {
        if ( collection[ index ].call( animation, prop, value ) ) {
          // we're done with this property
          return;
        }
      }
    });
  } 
ログイン後にコピー
トゥイーナー ["*"][0] 関数をもう一度見てください。メインのコードは次のとおりです。

function( prop, value ) {
  var end, unit,
  //根据css特征值获取缓动动画结构
  tween = this.createTween( prop, value ),
  parts = rfxnum.exec( value ),
  target = tween.cur(),
  start = +target || 0,
  scale = 1,
  maxIterations = 20;
  if ( parts ) {
    end = +parts[2];
    unit = parts[3] || ( jQuery.cssNumber[ prop ] &#63; "" : "px" );
    //非像素单位的属性
    if ( unit !== "px" && start ) {
      // 从一个非零起点开始迭代,
      //对于当前属性,如果它使用相同的单位这一过程将是微不足道
      // 后备为end,或一个简单的常量
      start = jQuery.css( tween.elem, prop, true ) || end || 1;
      do {
        //如果前一次迭代为零,加倍,直到我们得到*东西* 
        //使用字符串倍增因子,所以我们不会偶然看到scale不改变
        scale = scale || ".5";
        // 调整和运行
        start = start / scale;
        jQuery.style( tween.elem, prop, start + unit );
        // 更新scale, 默认0或NaN从tween.cur()获取
        // 跳出循环,如果scale不变或完成时, 或者我们已经觉得已经足够了
      } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
    }
    tween.unit = unit;
    tween.start = start;
    //如果提供了+=/-=记号,表示我们正在做一个相对的动画
    tween.end = parts[1] &#63; start + ( parts[1] + 1 ) * end : end;
    }
    return tween;
  }]
}; 
ログイン後にコピー
非表示/表示アニメーションを除いて、他のアニメーションはトゥイーナー ["*"][0] 関数を通じてアニメーション グループをカプセル化していることがわかります。開始/終了/単位のキー配列がいくつかあります。特にアニメーション開始値を非ピクセル単位で取得するのに手間がかかりました。


もう 1 つの重要なポイントは、this.createTween を使用して、単一の CSS 機能の基本的なアニメーション特性を取得することです。 anime.createTweenではjQuery.Tweenを直接呼び出して処理しています。次に詳しく説明していきます。

a.jQuery.Tween

----------------------------------------------- --- ----------------------------------

jQuery.Tween の構造は jQuery に似ています

function Tween( elem, options, prop, end, easing ) {
  return new Tween.prototype.init( elem, options, prop, end, easing );
}
jQuery.Tween = Tween;
Tween.prototype = {
  constructor: Tween,
  init: function( elem, options, prop, end, easing, unit ) {
    this.elem = elem;
    this.prop = prop;
    this.easing = easing || "swing";
    this.options = options;
    this.start = this.now = this.cur();
    this.end = end;
    this.unit = unit || ( jQuery.cssNumber[ prop ] &#63; "" : "px" );
  },
  cur: function() {...},
  run: function( percent ) {...}
};
Tween.prototype.init.prototype = Tween.prototype; 
ログイン後にコピー
非常におなじみのラッシュがありますか?


内部の cur 関数は、現在の CSS 特徴値を取得するために使用されます

cur: function() {
  var hooks = Tween.propHooks[ this.prop ];

  return hooks && hooks.get &#63;
  hooks.get( this ) :
  Tween.propHooks._default.get( this );
}, 
ログイン後にコピー
run 関数は、アニメーションの各時点で進行中のアニメーションの各特徴値を処理します。


主に次の 2 つのステップがあります:

1. アニメーションの進行状況と現在のアニメーションの位置を計算します

//如果有动画时长则使用jQuery.easing计算出缓动动画进度eased,否则进度eased为percent
//并根据进度得到当前动画位置now
if ( this.options.duration ) {
  this.pos = eased = jQuery.easing[ this.easing ](
    percent, this.options.duration * percent, 0, 1, this.options.duration
    );
} else {
  this.pos = eased = percent;
}
this.now = ( this.end - this.start ) * eased + this.start;
ログイン後にコピー

2. 現在の進捗状況に応じて CSS 特徴量を設定します

//设置css特征值
if ( hooks && hooks.set ) {
  hooks.set( this );
} else {
  Tween.propHooks._default.set( this );
}
return this; 
ログイン後にコピー
イージング アニメーションを生成するステップがアニメーション全体の中核であることがわかります。


イージング アニメーション グループを作成します。各アトミック アニメーションには、各アトミック CSS 属性アニメーションに必要なさまざまなパラメーターとアニメーション関数が含まれます。


違いは、非表示/表示はこのイージング アニメーション グループをdefaultPrefilter で直接作成し (すべてのプロパティのデフォルトは px 単位)、他のアニメーションは createTweens を呼び出すときにイージング アニメーション グループを作成することです。


アニメーションを作成するときにティック関数があることをまだ覚えていますか? このティック関数は 1 ステップおきに呼び出されます


   tick = function() {
      ...
        length = animation.tweens.length;
      for ( ; index < length ; index++ ) {
        animation.tweens[ index ].run( percent );
      }
       ...
    } 
ログイン後にコピー
各アトミック アニメーションには、独自のアニメーションを実行するための独自の run 関数があり、イージング アニメーション グループの作成時に確立されることがわかりましたか。

それでは、アニメーションの核となるプロセス全体を整理しましょう:


1. まず、パラメータに従って jQuery.speed を呼び出してアニメーション関連のパラメータを取得し、次のようなオブジェクトを取得し、.queue を使用してアニメーション実行関数 doAnimation を生成し、それをキューにプッシュして実行します。すぐに

opt = {
    complete: fnction(){...},//动画执行完成的回调
    duration: 400,//动画执行时长
    easing: "swing",//动画效果
    queue: "fx",//动画队列
    old: false/fnction(){...},
} 
ログイン後にコピー
2. doAnimation を呼び出して遅延オブジェクトを作成し、遅延オブジェクトの Promise メソッドを使用してアニメーション オブジェクト アニメーション (遅延オブジェクト アニメーション機能リスト) を構築し、最後にアニメーションの実行完了後にアニメーションにコールバック関数を追加します。 。


3. jQuery 内部関数 proFilter を呼び出して、現在のブラウザで認識できるように CSS 機能名を変更し、いくつかの複合 CSS 機能 (paddingTop/Right/Bottom/Left へのパディングなど) を分解します。


4. jQueryの内部関数defaultPrefilterを呼び出して、正常に動作するアニメーションを作成します。 前提条件の修正: たとえば、高さ/幅のアニメーション表示とオーバーフローには特定の値が必要です。特に注意が必要なのは


表示/非表示アニメーションの場合、アニメーション化する必要がある CSS 機能を抽出するために genFx が前に呼び出されます。defaultPrefilter 関数では、アニメーション オブジェクト anime.createTween が直接呼び出され、対応するイージング アニメーション オブジェクトが各 CSS アニメーション プロパティに追加されます。 (アニメーションパラメータや実行などのアニメーション関数を含む) はイージングアニメーショングループanimation.tweens

に押し込まれます。

5. jQuery 内部関数 createTweens を呼び出して、表示/非表示を除く各 CSS アニメーション機能をアニメーション化します。animation.createTween を使用してイージング アニメーション オブジェクト (アニメーション パラメーターや run などのアニメーション関数を含む) を作成し、それをイージングに押し込みます。アニメーション グループ

(animation.tweens)

6. アニメーションのタイミングを開始し、各時点でティック関数を実行して、対応する CSS 特徴値のモーション値を設定します。


CSS特徴量移動の進捗率は

です

remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
temp = remaining / animation.duration || 0,
percent = 1 - temp
ログイン後にコピー

取得されたパーセンテージは時間パターンと一致しています。このパーセンテージを置き換えて、アニメーション表示を更新するための正確な CSS 機能値を設定します。

8. アニメーションが完了したら、アニメーション完了コールバックを呼び出します。

編集者が共有した jQuery 1.9.1 ソース コード分析シリーズ (15 回) - アニメーション処理のためのイージング アニメーション コア Tween について これですべての内容が終わりました。ご質問がございましたら、お気軽にお問い合わせください。メッセージをいただければ、できるだけ早くご連絡させていただきます。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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

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

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

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

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

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

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

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

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

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

Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Apr 04, 2025 pm 05:12 PM

Console.log出力の違いの根本原因に関する詳細な議論。この記事では、Console.log関数の出力結果の違いをコードの一部で分析し、その背後にある理由を説明します。 �...

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

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

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

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

See all articles