jQuery的animate函數(shù)學(xué)習(xí)記錄
很久之前就對(duì)jQuery animate的實(shí)現(xiàn)非常感興趣,不過(guò)前段時(shí)間很忙,直到前幾天端午假期才有時(shí)間去研究。
jQuery.animate的每種動(dòng)畫(huà)過(guò)渡效果都是通過(guò)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é)和物理都沒(méi)學(xué)好,是別人提醒我的……)。那么diff和p就是速度和時(shí)間了。
再看看jQuery.animate的原型:
animate: function( prop, speed, easing, callback )
各參數(shù)的說(shuō)明如下:
prop:一組包含作為動(dòng)畫(huà)屬性和終值的樣式屬性和及其值的集合。
speed:動(dòng)畫(huà)時(shí)長(zhǎng)。
easing:要使用的擦除效果的名稱。
callback:動(dòng)畫(huà)完成時(shí)執(zhí)行的函數(shù)。
元素的當(dāng)前樣式值(firstNum)可以獲取,動(dòng)畫(huà)時(shí)長(zhǎng)(p)就是duration,最終樣式值是prop。理論上說(shuō),動(dòng)畫(huà)速度(diff)是可以算出來(lái)的。但是這又必然需要另一個(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)畫(huà)的時(shí)間進(jìn)度。而firstNum和diff的參數(shù)值都是寫(xiě)死的,分別是0和1。這下easing函數(shù)的秘密完全被解開(kāi),p、firstNum、diff都是百分率而非實(shí)際數(shù)值,easing函數(shù)的返回值也就是位移的進(jìn)度。diff的值是1,也就是以1倍的速度運(yùn)行動(dòng)畫(huà)。算出位移進(jìn)度后,通過(guò)“初始值+(最終值-初始值)×進(jìn)度”就可以算出當(dāng)前位移值:
this.now = this.start + ((this.end - this.start) * this.pos);
通過(guò)setInterval每隔一定時(shí)間(jQuery中是13ms)進(jìn)行一次位移運(yùn)算,直到當(dāng)前時(shí)間與初始時(shí)間的差值大于動(dòng)畫(huà)時(shí)長(zhǎng),這就是jQuery.animate的執(zhí)行過(guò)程。
按照常規(guī)思路,動(dòng)畫(huà)的實(shí)現(xiàn)方式是這樣的:通過(guò)setInterval每隔一定時(shí)間給某個(gè)值增加特定數(shù)值,直到這個(gè)值達(dá)到限制值。這樣做的主要問(wèn)題是,不同瀏覽器的運(yùn)行速度不同,從而導(dǎo)致動(dòng)畫(huà)速度有差異,一般是IE下比較慢,F(xiàn)irefox下比較快。而jQuery.animate是以當(dāng)前時(shí)間來(lái)決定位移值,某個(gè)時(shí)刻的位移值總是固定的,因而動(dòng)畫(huà)速度不會(huì)有差異。
- jQuery animate和CSS3相結(jié)合實(shí)現(xiàn)緩動(dòng)追逐效果附源碼下載
- jQuery使用animate創(chuàng)建動(dòng)畫(huà)用法實(shí)例
- jQuery插件animateSlide制作多點(diǎn)滑動(dòng)幻燈片
- jQuery中animate動(dòng)畫(huà)第二次點(diǎn)擊事件沒(méi)反應(yīng)
- jQuery的animate函數(shù)實(shí)現(xiàn)圖文切換動(dòng)畫(huà)效果
- jquery使用animate方法實(shí)現(xiàn)控制元素移動(dòng)
- jQuery中animate用法實(shí)例分析
- jquery中animate的stop()方法作用實(shí)例分析
- JQuery動(dòng)畫(huà)animate的stop方法使用詳解
- 深入理解jquery自定義動(dòng)畫(huà)animate()
相關(guān)文章
jquery實(shí)現(xiàn)在網(wǎng)頁(yè)指定區(qū)域顯示自定義右鍵菜單效果
這篇文章主要介紹了jquery實(shí)現(xiàn)在網(wǎng)頁(yè)指定區(qū)域顯示自定義右鍵菜單效果,涉及jquery鼠標(biāo)點(diǎn)擊及事件綁定等相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08bootstrap中日歷范圍選擇插件daterangepicker的使用詳解
daterangepicker是bootstrap的一個(gè)日歷插件 主要用來(lái)選擇時(shí)間段的插件 這個(gè)插件很好用也很容易操作 。這篇文章主要介紹了bootstrap中日歷范圍選擇插件daterangepicker的使用詳解,需要的朋友可以參考下2018-04-04如何使用jQUery獲取選中radio對(duì)應(yīng)的值(一句代碼)
一些基本的語(yǔ)法在使用中老忘掉,下列使用jQUery獲取選中radio對(duì)應(yīng)的值,剛剛想起來(lái),感興趣的朋友可以了解下2013-06-06jquery的index方法實(shí)現(xiàn)tab效果
jquery的index方法實(shí)現(xiàn)tab效果,需要的朋友可以參考下。2011-02-02jQuery實(shí)現(xiàn)仿美橙互聯(lián)兩級(jí)導(dǎo)航菜單的方法
這篇文章主要介紹了jQuery實(shí)現(xiàn)仿美橙互聯(lián)兩級(jí)導(dǎo)航菜單的方法,實(shí)例分析了jQuery操作css及setTimeout等實(shí)現(xiàn)導(dǎo)航菜單的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03jquery動(dòng)態(tài)改變form屬性提交表單
在js中動(dòng)態(tài)改變form的屬性,滿足不同條件的form提交需求,下面有個(gè)不錯(cuò)的示例,大家可以參考下2014-06-06jQuery實(shí)現(xiàn)的簡(jiǎn)單在線計(jì)算器功能
這篇文章主要介紹了jQuery實(shí)現(xiàn)的簡(jiǎn)單在線計(jì)算器功能,結(jié)合完整實(shí)例形式分析了jQuery實(shí)現(xiàn)簡(jiǎn)單四則運(yùn)算的相關(guān)操作技巧,需要的朋友可以參考下2017-05-05基于jQuery實(shí)現(xiàn)選取月份插件附源碼下載
這是一個(gè)基于jQuery的可以選擇年份和月份的月份拾取插件,你可以設(shè)置點(diǎn)擊頁(yè)面上的任意元素觸發(fā)彈出年月選擇面板,可以是一個(gè)鏈接也可以是一個(gè)輸入框,廣泛應(yīng)用于月份查詢,而無(wú)需設(shè)置select表單。2015-12-12