亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

jQuery 1.9.1源碼分析系列(十五)動畫處理之緩動動畫核心Tween

2019-11-20 11:05:28
字體:
來源:轉載
供稿:網友

在jQuery內部函數Animation中調用到了createTweens()來創建緩動動畫組,創建完成后的結果為:

  可以看到上面的緩動動畫組有四個原子動畫組成。每一個原子動畫的信息都包含在里面了。

  仔細查看createTweens函數,實際上就是遍歷調用了tweeners ["*"]的數組中的函數(實際上就只有一個元素)。

  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;        }      }    });  } 

  再次查看這個tweeners ["*"][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 ] ? "" : "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] ? start + ( parts[1] + 1 ) * end : end;    }    return tween;  }]}; 

  可以看出除了hide/show兩種動畫外的其他動畫都經過tweeners ["*"][0]這個函數封裝了動畫組。其中有幾個關鍵的數組start/end/unit。特別是對非像素單位的動畫start值獲取費了一番功夫。

  還有一個比較關鍵的地方是都用了this.createTween獲取單個css特征的基礎的動畫特征。而animation. 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 ] ? "" : "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 ?  hooks.get( this ) :  Tween.propHooks._default.get( this );}, 

  而run函數則會在每個動畫時間點上對正在進行的動畫的每個特征值進行處理。

  主要是兩個步驟:

  1.計算動畫當前進度pos和動畫當前位置now

//如果有動畫時長則使用jQuery.easing計算出緩動動畫進度eased,否則進度eased為percent//并根據進度得到當前動畫位置nowif ( 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屬性動畫的各種必要參數以及動畫函數

  不同的是hide/show直接在defaultPrefilter中創建了這個緩動動畫組(所有的屬性都默認是px單位),其他的動畫在調用createTweens時創建緩動動畫組。

  還記不記得在創建動畫的時候有個tick函數,這個tick函數會在每隔一個步長的時間調用一次

   tick = function() {      ...        length = animation.tweens.length;      for ( ; index < length ; index++ ) {        animation.tweens[ index ].run( percent );      }       ...    } 

  看到沒,每一個原子動畫有自己的run函數來執行自己的動畫,這在創建緩動動畫組的時候就建好了的。

好了,整理一下動畫的整個核心流程:

  1.先根據參數調用jQuery.speed獲取動畫相關參數,得到一個類似如下的對象;并且生成動畫執行函數doAnimation使用.queue壓入隊列并馬上執行

opt = {    complete: fnction(){...},//動畫執行完成的回調    duration: 400,//動畫執行時長    easing: "swing",//動畫效果    queue: "fx",//動畫隊列    old: false/fnction(){...},} 

  2.doAnimation中調用創建一個延時對象,使用延時對象的promise方法構造一個動畫對象animation(延時對象+動畫特征列表),最后給animation添加動畫執行完成后的回調函數。

  3.調用jQuery內部函數proFilter修正css特征名以便能被當前瀏覽器識別,并將某些復合css特征分解(比如padding分解成paddingTop / Right/ Bottom/ Left).

  4.調用jQuery內部函數defaultPrefilter做動畫能夠正常運行前提條件修正:比如對height/width動畫display和overflow需要特定的值。特別需要注意的是

對于show/hide動畫,在之前就調用genFx將需要執行動畫的css特征提取了出來,在defaultPrefilter函數里直接調用動畫對象animation.createTween給每一個CSS動畫屬性添加對應的緩動動畫對象(包括動畫參數和動畫函數如run)壓入緩動動畫組animation.tweens中

  5.調用jQuery內部函數createTweens將除開show/hide之外的動畫每一個css動畫特征使用animation.createTween創建緩動動畫對象(包括動畫參數和動畫函數如run),壓入緩動動畫組animation.tweens中

  6.啟動動畫計時,在每個時間點上執行tick函數來給相應的css特征值設置運動值。

  其中css特征值運動的進度百分比是

remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),temp = remaining / animation.duration || 0,percent = 1 - temp

  得到的percent是符合時間規律的。代入這個percent設置準確的css特征值,以刷新動畫顯示。

  8.動畫完成后調用動畫完成回調。

關于小編給大家分享的jQuery 1.9.1源碼分析系列(十五)動畫處理之緩動動畫核心Tween 全部內容就到此結束了,有問題歡迎給我留言我會在第一時間和大家取得聯系的。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
伦伦影院午夜日韩欧美限制| 国产精品久久久久久久app| 欧美日韩性生活视频| 成人黄色av播放免费| 国产精品视频精品| 欧美有码在线观看| 中文字幕日韩在线视频| 久久精品国产亚洲7777| 亚洲一级黄色av| 97在线精品视频| 91久久久久久久| 欧美成在线观看| 精品视频在线播放色网色视频| 欧美日本高清视频| 俺去啦;欧美日韩| 国产精品午夜一区二区欲梦| 国产精品视频1区| 欧美午夜xxx| 国产女人精品视频| 欧美电影免费在线观看| 久久久国产视频| 国内精品视频一区| 自拍偷拍亚洲一区| 国产日韩欧美影视| 亚洲一区二区三区四区在线播放| 岛国视频午夜一区免费在线观看| 精品国内产的精品视频在线观看| 国产亚洲一区二区精品| 久热99视频在线观看| 欧美大胆在线视频| 亚洲免费高清视频| 日本最新高清不卡中文字幕| 日韩精品免费综合视频在线播放| 亚洲日韩欧美视频一区| 精品成人av一区| 精品国偷自产在线| 91精品视频在线看| 91天堂在线视频| 亚洲视频一区二区| 高清欧美性猛交xxxx| 日韩免费电影在线观看| 国产99久久精品一区二区永久免费| 97在线观看视频| 亚洲精品一区二区久| 黑人与娇小精品av专区| 精品国产一区二区三区四区在线观看| 亚洲国产欧美一区| 日韩电影在线观看中文字幕| 在线精品国产成人综合| 亚洲精品99999| 7777精品久久久久久| 亚洲国产欧美一区二区丝袜黑人| 久久久久久久国产精品视频| 久久久久久久91| 国模私拍视频一区| 成人精品一区二区三区电影免费| 欧美日韩国产区| 欧美性猛交xxxx免费看久久久| 国产999精品| 日韩欧美在线字幕| 精品久久久久久中文字幕| 97视频在线观看成人| 久久人人爽人人| 亚洲字幕在线观看| 国产一区二区动漫| 欧美自拍视频在线| 91视频8mav| 91精品国产自产在线老师啪| 黑人精品xxx一区一二区| 奇米一区二区三区四区久久| 成人免费福利在线| 57pao成人国产永久免费| 一本一本久久a久久精品综合小说| 性色av香蕉一区二区| 久久99精品视频一区97| 亚洲天堂日韩电影| 亚洲变态欧美另类捆绑| 黄色精品一区二区| 国产精品久久久久av免费| 亚洲午夜性刺激影院| 亚洲自拍偷拍视频| 欧美日韩国产va另类| 91国内在线视频| 亚洲第一视频网站| 在线观看精品自拍私拍| 97av视频在线| 一区二区成人精品| 日韩视频免费看| 欧美精品一区三区| 久久久噜噜噜久久| 亚洲欧美中文字幕在线一区| 久久亚洲国产精品成人av秋霞| 中日韩美女免费视频网址在线观看| 亚洲精品网站在线播放gif| 精品国产电影一区| 神马国产精品影院av| 亚洲国产成人精品一区二区| 视频在线一区二区| 亚洲国产免费av| 久久99热精品这里久久精品| 日韩av片电影专区| 日韩av免费观影| 一区二区三区在线播放欧美| 午夜精品一区二区三区在线视| 日韩精品免费综合视频在线播放| 国产黑人绿帽在线第一区| 亚洲精品视频网上网址在线观看| 亚洲一区www| 欧美成人久久久| 日本精品视频在线观看| 成人免费看吃奶视频网站| 免费91在线视频| 欧美激情第6页| 美日韩在线视频| 欧美精品18videos性欧| 久久国产精品久久久久久久久久| 国产综合久久久久| 久久91超碰青草是什么| 久久在线观看视频| 国产精品视频久久久| 国产精品日韩在线播放| 91午夜理伦私人影院| 欧美激情极品视频| 日韩欧美第一页| 2018中文字幕一区二区三区| 亚洲女人天堂网| 久久这里只有精品视频首页| 国产成人啪精品视频免费网| 欧美理论片在线观看| 国产日韩欧美综合| 成人免费视频在线观看超级碰| 久久亚洲精品中文字幕冲田杏梨| 欧美在线视频一二三| 亚洲欧美一区二区三区四区| 91视频国产高清| 亚洲成人在线网| 国产一区二区成人| 九九九久久久久久| 亚洲最大福利网| 欧美另类暴力丝袜| 一区二区三区视频免费在线观看| 精品久久在线播放| 日韩理论片久久| 日韩中文在线视频| 97免费视频在线播放| 亚洲综合精品伊人久久| 亚洲精品国产品国语在线| 国产视频在线一区二区| 在线播放日韩精品| 久久高清视频免费| 国产亚洲精品一区二区| 九九热精品视频| 中文字幕av一区二区| 国产精品高潮在线| 亚洲一区二区三区xxx视频| 亚洲在线一区二区| 成人a免费视频| 国产精品青青在线观看爽香蕉| 亚洲免费高清视频| 精品久久中文字幕久久av| 国产91色在线| 韩曰欧美视频免费观看| 久久久免费高清电视剧观看| 日日狠狠久久偷偷四色综合免费|