jialisoftw

          了解jQuery的animate()函數(shù)

          很久之前就對jQuery animate的實現(xiàn)非常感興趣,不過前段時間很忙,直到前幾天端午假期才有時間去研究。

          jQuery.animate的每種動畫過渡效果都是通過easing函數(shù)實現(xiàn)的。jQuery1.4.2中就預(yù)置了兩個這樣的函數(shù):

          easing: {
          linear: function( p, n, firstNum, diff ) {
          return firstNum + diff * p;
          },
          swing: function( p, n, firstNum, diff ) {
          return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
          }
          }

          從參數(shù)名隱約可以推測出firstNum是初始值。要是你的數(shù)學(xué)學(xué)得比較好,你可以發(fā)現(xiàn)linear函數(shù)是直線方程;要是你的物理學(xué)得比較好,你可以發(fā)現(xiàn)它是勻速運(yùn)動的位移方程(我數(shù)學(xué)和物理都沒學(xué)好,是別人提醒我的……)。那么diff和p就是速度和時間了。

          再看看jQuery.animate的原型:

          animate: function( prop, speed, easing, callback )

          各參數(shù)的說明如下:

          • prop:一組包含作為動畫屬性和終值的樣式屬性和及其值的集合。
          • speed:動畫時長。
          • easing:要使用的擦除效果的名稱。
          • callback:動畫完成時執(zhí)行的函數(shù)。

          元素的當(dāng)前樣式值(firstNum)可以獲取,動畫時長(p)就是duration,最終樣式值是prop。理論上說,動畫速度(diff)是可以算出來的。但是這又必然需要另一個函數(shù)進(jìn)行運(yùn)算。這樣做明顯是不明智的。再看看調(diào)用easing函數(shù)的相關(guān)代碼(位于jQuery.fx.prototype.step中):

          var t = now();
          ...
          var n = t - this.startTime;
          this.state = n / this.options.duration;
          ...
          this.pos = jQuery.easing[specialEasing || defaultEasing](this.state, n, 0, 1, this.options.duration);

          可以發(fā)現(xiàn),p參數(shù)的值也就是this.state的值,從上下文得知它實際上是動畫的時間進(jìn)度。而firstNum和diff的參數(shù)值都是寫死的,分別是0和1。這下easing函數(shù)的秘密完全被解開,p、firstNum、diff都是百分率而非實際數(shù)值,easing函數(shù)的返回值也就是位移的進(jìn)度。diff的值是1,也就是以1倍的速度運(yùn)行動畫。算出位移進(jìn)度后,通過“初始值+(最終值-初始值)×進(jìn)度”就可以算出當(dāng)前位移值:

          this.now = this.start + ((this.end - this.start) * this.pos);

          通過setInterval每隔一定時間(jQuery中是13ms)進(jìn)行一次位移運(yùn)算,直到當(dāng)前時間與初始時間的差值大于動畫時長,這就是jQuery.animate的執(zhí)行過程。

          按照常規(guī)思路,動畫的實現(xiàn)方式是這樣的:通過setInterval每隔一定時間給某個值增加特定數(shù)值,直到這個值達(dá)到限制值。這樣做的主要問題是,不同瀏覽器的運(yùn)行速度不同,從而導(dǎo)致動畫速度有差異,一般是IE下比較慢,F(xiàn)irefox下比較快。而jQuery.animate是以當(dāng)前時間來決定位移值,某個時刻的位移值總是固定的,因而動畫速度不會有差異。

          posted on 2013-01-19 15:01 飛豬一號 閱讀(808) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

          <2013年1月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          統(tǒng)計

          常用鏈接

          留言簿

          隨筆檔案

          友情鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 绥芬河市| 郴州市| 新巴尔虎右旗| 禄丰县| 泊头市| 台北市| 通渭县| 东台市| 赣州市| 宝鸡市| 铜山县| 泰宁县| 德兴市| 太和县| 阳春市| 中江县| 南昌市| 阿拉善左旗| 枞阳县| 沙河市| 武功县| 郓城县| 临城县| 衡南县| 德安县| 明星| 沙洋县| 舟山市| 商洛市| 日照市| 句容市| 汕头市| 苏尼特右旗| 峡江县| 鄂州市| 保康县| 南川市| 天水市| 朝阳县| 安庆市| 开化县|