原生js實現(xiàn)jquery函數(shù)animate()動畫效果的簡單實例
通過在公司一個月的實習(xí),慢慢的對css跟html算是比較熟悉了,這幾天開始研究js,今天用js寫了一個jquery的animate函數(shù),測試了下,性能還可以。個人覺得jquery并不是萬能的,因為是個框架,所以有些東西寫的比較死,就像animate函數(shù)一樣,可選的參數(shù)不多有時候可能并不能實現(xiàn)我們想要的效果。
注釋的部分是用來測試用的,寫代碼的過程并不是十分順利,因為用js平時用的不是很細(xì),都是大體知道方法,也用過,但等到真正要實現(xiàn)動畫函數(shù)的時候,細(xì)枝末節(jié)寫錯了就可能把人難住了。
函數(shù)里面有幾個參數(shù)解釋一下,
•obj, 函數(shù)的對象
•json, 數(shù)值對,形式{attr:”value”, attr: “value”},在這里是指要動畫對象的運(yùn)動屬性
•interval, 每執(zhí)行一次改變的間隔,這里改變的是對象是屬性值
•sp, 值變換的速度,使動畫具有緩沖效果,而不只是勻速不變(sp為1)的
•fn, 回調(diào)函數(shù),執(zhí)行完動畫之后的行為
代碼比較簡單,只是有幾個細(xì)節(jié)需要注意,在這里提醒一下:
•對象的屬性不必直接聲明,所以函數(shù)的第一句clearInterval(obj.timer);并不會報錯。
•必須為每一個對象分別添加一個定時器,否則互相會影響,一個定時器公用的結(jié)果是定時器的多個對象運(yùn)動出現(xiàn)卡頓。
•son數(shù)據(jù)格式了解一下,當(dāng)遍歷對象的動畫屬性的時候,需要icur != json[arr]判斷是否每一個屬性已經(jīng)達(dá)到目標(biāo)值。flag的作用是防止當(dāng)其中某個屬性第一個達(dá)到目標(biāo)值后,clearInterval(obj.timer)清除了定時器,結(jié)果其他動畫屬性并沒有達(dá)到目標(biāo)值。所以在每次遍歷的時候初始化flag值為true,只要遇到一個沒有達(dá)到目標(biāo)屬性的對象,就將flag置為false,直至對象的所有屬性達(dá)到目標(biāo)值,清除定時器。
•speed = speed > 0 ? Math.ceil(speed): Math.floor(speed);
這一句的作用是將屬性值取整,因為屬性值除了opacity沒有小數(shù)。
•最后調(diào)用的時候注意動畫的對象,在使用for循環(huán)的時候不能隨意使用arr[i]形式,尤其是嵌套循環(huán)的時候i的值已經(jīng)變成了最大值。
js
function animate(obj, json, interval, sp, fn) { clearInterval(obj.timer); //var k = 0; //var j = 0; function getStyle(obj, arr) { if(obj.currentStyle){ return obj.currentStyle[arr]; //針對ie } else { return document.defaultView.getComputedStyle(obj, null)[arr]; } } obj.timer = setInterval(function(){ //j ++; var flag = true; for(var arr in json) { var icur = 0; //k++; if(arr == "opacity") { icur = Math.round(parseFloat(getStyle(obj, arr))*100); } else { icur = parseInt(getStyle(obj, arr)); } var speed = (json[arr] - icur) * sp; speed = speed > 0 ? Math.ceil(speed): Math.floor(speed); if(icur != json[arr]){ flag = false; } if(arr == "opacity"){ obj.style.filter = "alpha(opacity : '+(icur + speed)+' )"; obj.style.opacity = (icur + speed)/100; }else { obj.style[arr] = icur + speed + "px"; } //console.log(j + "," + arr +":"+ flag); } if(flag){ clearInterval(obj.timer); //console.log(j + ":" + flag); //console.log("k = " + k); //console.log("j = " + j); //console.log("DONE"); if(fn){ fn(); } } },interval); }
調(diào)用方式:
<script> var move = document.getElementById("move").getElementsByTagName("li"); for(var i = 0; i < move.length; i ++){ move[i].onmouseover = function(){ var _this = this; animate(_this, {width: 500, height: 200},10, 0.01, function(){ animate(_this, {width: 300, height: 200},10, 0.01); }); } } </script>
以上這篇原生js實現(xiàn)jquery函數(shù)animate()動畫效果的簡單實例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
javascript圓盤抽獎程序?qū)崿F(xiàn)原理和完整代碼例子
這篇文章主要介紹了javascript圓盤抽獎程序?qū)崿F(xiàn)原理和完整代碼例子,需要的朋友可以參考下2014-06-06JS中Generator函數(shù)與async函數(shù)用法介紹
javascript中經(jīng)常會用到異步編程,在ES6之后我們使用的?Generator函數(shù)、async函數(shù)、promise都是我們異步編程的一大助力,這里我們主要講解Generator、async函數(shù),并且簡介他們之間的一些聯(lián)系,本篇文章會帶著一些簡易案例,方便大家理解使用2023-06-06javascript input輸入框模糊提示功能的實現(xiàn)
這篇文章主要介紹了javascript input輸入框模糊提示功能的實現(xiàn)的相關(guān)資料,希望通過本能幫助到大家,需要的朋友可以參考下2017-09-09