jQuery的animate函數(shù)學習記錄
很久之前就對jQuery animate的實現(xiàn)非常感興趣,不過前段時間很忙,直到前幾天端午假期才有時間去研究。
jQuery.animate的每種動畫過渡效果都是通過easing函數(shù)實現(xiàn)的。jQuery1.4.2中就預置了兩個這樣的函數(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ù)學學得比較好,你可以發(fā)現(xiàn)linear函數(shù)是直線方程;要是你的物理學得比較好,你可以發(fā)現(xiàn)它是勻速運動的位移方程(我數(shù)學和物理都沒學好,是別人提醒我的……)。那么diff和p就是速度和時間了。
再看看jQuery.animate的原型:
animate: function( prop, speed, easing, callback )
各參數(shù)的說明如下:
prop:一組包含作為動畫屬性和終值的樣式屬性和及其值的集合。
speed:動畫時長。
easing:要使用的擦除效果的名稱。
callback:動畫完成時執(zhí)行的函數(shù)。
元素的當前樣式值(firstNum)可以獲取,動畫時長(p)就是duration,最終樣式值是prop。理論上說,動畫速度(diff)是可以算出來的。但是這又必然需要另一個函數(shù)進行運算。這樣做明顯是不明智的。再看看調用easing函數(shù)的相關代碼(位于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的值,從上下文得知它實際上是動畫的時間進度。而firstNum和diff的參數(shù)值都是寫死的,分別是0和1。這下easing函數(shù)的秘密完全被解開,p、firstNum、diff都是百分率而非實際數(shù)值,easing函數(shù)的返回值也就是位移的進度。diff的值是1,也就是以1倍的速度運行動畫。算出位移進度后,通過“初始值+(最終值-初始值)×進度”就可以算出當前位移值:
this.now = this.start + ((this.end - this.start) * this.pos);
通過setInterval每隔一定時間(jQuery中是13ms)進行一次位移運算,直到當前時間與初始時間的差值大于動畫時長,這就是jQuery.animate的執(zhí)行過程。
按照常規(guī)思路,動畫的實現(xiàn)方式是這樣的:通過setInterval每隔一定時間給某個值增加特定數(shù)值,直到這個值達到限制值。這樣做的主要問題是,不同瀏覽器的運行速度不同,從而導致動畫速度有差異,一般是IE下比較慢,F(xiàn)irefox下比較快。而jQuery.animate是以當前時間來決定位移值,某個時刻的位移值總是固定的,因而動畫速度不會有差異。
相關文章
jquery實現(xiàn)在網(wǎng)頁指定區(qū)域顯示自定義右鍵菜單效果
這篇文章主要介紹了jquery實現(xiàn)在網(wǎng)頁指定區(qū)域顯示自定義右鍵菜單效果,涉及jquery鼠標點擊及事件綁定等相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-08-08bootstrap中日歷范圍選擇插件daterangepicker的使用詳解
daterangepicker是bootstrap的一個日歷插件 主要用來選擇時間段的插件 這個插件很好用也很容易操作 。這篇文章主要介紹了bootstrap中日歷范圍選擇插件daterangepicker的使用詳解,需要的朋友可以參考下2018-04-04jQuery實現(xiàn)仿美橙互聯(lián)兩級導航菜單的方法
這篇文章主要介紹了jQuery實現(xiàn)仿美橙互聯(lián)兩級導航菜單的方法,實例分析了jQuery操作css及setTimeout等實現(xiàn)導航菜單的技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-03-03