發(fā)文章
發(fā)文工具
撰寫
網(wǎng)文摘手
文檔
視頻
思維導(dǎo)圖
隨筆
相冊(cè)
原創(chuàng)同步助手
其他工具
圖片轉(zhuǎn)文字
文件清理
AI助手
留言交流
很久之前就對(duì)jQuery animate的實(shí)現(xiàn)非常感興趣,不過前段時(shí)間很忙,直到前幾天端午假期才有時(shí)間去研究。
jQuery.animate的每種動(dòng)畫過渡效果都是通過easing函數(shù)實(shí)現(xiàn)的。jQuery1.4.2中就預(yù)置了兩個(gè)這樣的函數(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ù)名隱約可以推測(cè)出firstNum是初始值。要是你的數(shù)學(xué)學(xué)得比較好,你可以發(fā)現(xiàn)linear函數(shù)是直線方程;要是你的物理學(xué)得比較好,你可以發(fā)現(xiàn)它是勻速運(yùn)動(dòng)的位移方程(我數(shù)學(xué)和物理都沒學(xué)好,是別人提醒我的……)。那么diff和p就是速度和時(shí)間了。
再看看jQuery.animate的原型:
animate: function( prop, speed, easing, callback )
各參數(shù)的說明如下:
元素的當(dāng)前樣式值(firstNum)可以獲取,動(dòng)畫時(shí)長(zhǎng)(p)就是duration,最終樣式值是prop。理論上說,動(dòng)畫速度(diff)是可 以算出來的。但是這又必然需要另一個(gè)函數(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的值,從上下文得知它實(shí)際上是動(dòng)畫的時(shí)間進(jìn)度。而firstNum和diff的參數(shù)值都是寫死的,分別是0和1。這下easing函數(shù)的秘密完全被解開,p、firstNum、diff都是百分率而非實(shí)際數(shù)值,easing函數(shù)的返回值也就是位移的進(jìn)度。diff的值是1,也就是以1倍的速度運(yùn)行動(dòng)畫。算出位移進(jìn)度后,通過“初始值+(最終值-初始值)×進(jìn)度”就可以算出當(dāng)前位移值:
this.now = this.start + ((this.end - this.start) * this.pos);
通過setInterval每隔一定時(shí)間(jQuery中是13ms)進(jìn)行一次位移運(yùn)算,直到當(dāng)前時(shí)間與初始時(shí)間的差值大于動(dòng)畫時(shí)長(zhǎng),這就是jQuery.animate的執(zhí)行過程。
按照常規(guī)思路,動(dòng)畫的實(shí)現(xiàn)方式是這樣的:通過setInterval每隔一定時(shí)間給某個(gè)值增加特定數(shù)值,直到這個(gè)值達(dá)到限制值。這樣做的主要問題是,不同瀏覽器的運(yùn)行速度不同,從而導(dǎo)致動(dòng)畫速度有差異,一般是IE下比較慢,F(xiàn)irefox下比較快。而jQuery.animate是以當(dāng)前時(shí)間來決定位移值,某個(gè)時(shí)刻的位移值總是固定的,因而動(dòng)畫速度不會(huì)有差異。
來自: 昵稱10504424 > 《工作》
0條評(píng)論
發(fā)表
請(qǐng)遵守用戶 評(píng)論公約
jQuery animate() 方法
jQuery animate() 方法定義和用法。animate() 方法執(zhí)行 CSS 屬性集的自定義動(dòng)畫。(selector).animate({styles},speed,easing,callback)可以應(yīng)用動(dòng)畫的屬性:animate 函數(shù)執(zhí)行完之后,要執(zhí)行的函數(shù)。eas...
jQuery 源碼解析(三十) 動(dòng)畫模塊 $.animate()詳解
內(nèi)部通過jQuery.fx.step中的方法來更新樣式的值 if ( this.options.step ) { //如果當(dāng)前的animate指定了step回調(diào)函數(shù) this.options.step...
jQuery動(dòng)畫 animate函數(shù)
jQuery動(dòng)畫 animate函數(shù)animate函數(shù)作用是使元素樣式逐漸變?yōu)樗鶄鞯膮?shù)指定的樣式$(selector).animate({params},speed,callback);
8個(gè)超實(shí)用的jQuery插件應(yīng)用 – 碼農(nóng)網(wǎng)
8個(gè)超實(shí)用的jQuery插件應(yīng)用 – 碼農(nóng)網(wǎng)。自jQuery誕生以來,jQuery社區(qū)都在不斷地、自發(fā)地為jQuery創(chuàng)建許許多多功能不一的插件應(yīng)用,很多...
網(wǎng)頁加載進(jìn)度條的JS程序開發(fā)思路與實(shí)際應(yīng)用 | 前端開拓者
網(wǎng)頁加載進(jìn)度條的JS程序開發(fā)思路與實(shí)際應(yīng)用 | 前端開拓者。loading進(jìn)度條更是對(duì)當(dāng)前加載進(jìn)度的一個(gè)良好反饋。將進(jìn)度反饋設(shè)置為四個(gè)部分...
深入學(xué)習(xí)jQuery的三種常見動(dòng)畫效果
jQuery輕量級(jí)圓形進(jìn)度指示器插件radialIndicator
該圓形指示器插件支持顏色范圍,動(dòng)態(tài)修改值,格式化和百分比值等形式。它可以很好的和jQuery或angular js一起工作。效果圖:
手把手教你用jQuery做動(dòng)畫插件
jQuery天生就是用來做動(dòng)畫的。我們現(xiàn)在有很多的動(dòng)畫方法,滑動(dòng)、淡出淡入、還有其他的顯示隱藏動(dòng)畫,但是我們對(duì)于精確的控制動(dòng)畫以及動(dòng)...
三. jQuery中的事件和動(dòng)畫
<script>$(function(){$(''#btn'').bind("click",myFun1=function(){ //先綁定$(''#test'').append("...");});})</script><sc...
微信掃碼,在手機(jī)上查看選中內(nèi)容