原生js封裝運(yùn)動(dòng)框架的示例講解
昨天我們說(shuō)了一下原生JS中常用的兼容性寫法,今天我們來(lái)說(shuō)一下運(yùn)動(dòng)框架.
正常情況下我們要寫一個(gè)運(yùn)動(dòng)的效果會(huì)用到tween.js這么一個(gè)插件,這個(gè)東西不是一般人寫出來(lái)的,因?yàn)槔锩嫔婕暗倪\(yùn)動(dòng)效果都是經(jīng)過(guò)一堆數(shù)學(xué)的函數(shù)運(yùn)算出來(lái)的,我們平常人是寫不出來(lái)的,所有我們就自己封裝一個(gè)運(yùn)動(dòng)框架,有什么問(wèn)題改起來(lái)也方便,下面我們就開(kāi)始封裝.
首先,我們先寫一個(gè)div,設(shè)置一些簡(jiǎn)單的樣式,我們就拿這個(gè)div舉例子
如下代碼:
#div{ width: 100px; height: 100px; background: gold; position: absolute; left:0; top:0; opacity: 1; }
然后我們就開(kāi)始寫js代碼了,如下:
window.onload=function() { var oDiv = document.getElementById("div"); var timer;
寫一個(gè)函數(shù),方便以后用的時(shí)候直接調(diào)用就好了,首先先傳入幾個(gè)參(要運(yùn)動(dòng)的對(duì)象,變動(dòng)的屬性,終點(diǎn)距離,運(yùn)動(dòng)總時(shí)間,回調(diào)函數(shù))----今天的只是簡(jiǎn)單的封裝一下,你也寫可以傳入一個(gè)json
function move(obj,name, target, dur,fn) { // 總步數(shù)=總時(shí)間÷計(jì)時(shí)器設(shè)定的時(shí)間 var count = parseInt(dur / 30); // 起始位置 var start = parseFloat(setStyle(obj,name)); // 總距離=傳入的距離-起始距離 var dis = target - start; // 每步運(yùn)動(dòng)的距離=總距離÷總步數(shù) var spen = dis / count; // 定義起始步數(shù) var n = 0; timer = setInterval(function () { n++; // 把當(dāng)前運(yùn)動(dòng)的位置保存 var cur=start + n * spen; // 判斷屬性是不是透明度,透明度不用加單位 if(name=='opacity'){ obj.style[name]=cur; // 兼容IE低版本,IE的透明度是1到100 obj.style.filter='alpha('+cur*100+')'; }else { obj.style[name] = start + n * spen + "px"; } // 判斷運(yùn)動(dòng)是否完成 if (n == count) { // 完成后清除定時(shí)器,停止運(yùn)動(dòng) clearInterval(timer); // 判斷用戶是否傳入回調(diào)函數(shù) fn && fn(); }; }, 30); };
然后自己隨便寫一些調(diào)用回調(diào)函數(shù),測(cè)試一下:
oDiv.onclick=function(){ move(oDiv,"left",600,1000,function(){ move(oDiv,'top',400,1000,function(){ move(oDiv,"width",300,1000,function(){ move(oDiv,"opacity",0,1000); }); }); }); }; // 獲取非行間樣式 function setStyle(obj,name){ // 考慮兼容性問(wèn)題 if(obj.currentStyle){//不兼容火狐和谷歌 return obj.currentStyle[name]; }else{ return getComputedStyle(obj,false)[name];//不兼容IE }; }; };
好了,今天就先封裝到這里了,這只是簡(jiǎn)單的封裝一下,明天我們會(huì)改進(jìn)一下,比如參數(shù)太多、參數(shù)順序不能亂的問(wèn)題,還有多次點(diǎn)擊計(jì)時(shí)器出現(xiàn)的Bug的問(wèn)題,如果你有好的方法歡迎評(píng)論區(qū)留言,程序員之間就是要相互學(xué)習(xí)的,明天見(jiàn),老鐵們!
以上這篇原生js封裝運(yùn)動(dòng)框架的示例講解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- JS實(shí)現(xiàn)運(yùn)動(dòng)緩沖效果的封裝函數(shù)示例
- JS實(shí)現(xiàn)勻速與減速緩慢運(yùn)動(dòng)的動(dòng)畫效果封裝示例
- 原生JS實(shí)現(xiàn)圖片無(wú)縫滾動(dòng)方法(附帶封裝的運(yùn)動(dòng)框架)
- 原生JS封裝animate運(yùn)動(dòng)框架的實(shí)例
- 原生JS實(shí)現(xiàn)風(fēng)箱式demo,并封裝了一個(gè)運(yùn)動(dòng)框架(實(shí)例代碼)
- JS實(shí)現(xiàn)勻速運(yùn)動(dòng)的代碼實(shí)例
- 使用JavaScript 實(shí)現(xiàn)對(duì)象 勻速/變速運(yùn)動(dòng)的方法
- JavaScript中的勻速運(yùn)動(dòng)和變速(緩沖)運(yùn)動(dòng)詳細(xì)介紹
- 原生javascript實(shí)現(xiàn)勻速運(yùn)動(dòng)動(dòng)畫效果
- 淺談Javascript中勻速運(yùn)動(dòng)的停止條件
- js指定步長(zhǎng)實(shí)現(xiàn)單方向勻速運(yùn)動(dòng)
- 原生javascript運(yùn)動(dòng)函數(shù)的封裝示例【勻速、拋物線、多屬性的運(yùn)動(dòng)等】
相關(guān)文章
利用js實(shí)現(xiàn)選項(xiàng)卡的特別效果的實(shí)例
利用js實(shí)現(xiàn)選項(xiàng)卡的特別效果的實(shí)例,需要的朋友可以參考一下2013-03-03學(xué)習(xí)Bootstrap滾動(dòng)監(jiān)聽(tīng) 附調(diào)用方法
這篇文章主要為大家全面解析Bootstrap中滾動(dòng)監(jiān)聽(tīng)的使用方法,感興趣的小伙伴們可以參考一下2016-07-07javascript實(shí)現(xiàn)iframe框架延時(shí)加載的方法
這篇文章主要介紹了javascript實(shí)現(xiàn)iframe框架延時(shí)加載的方法,可基于setTimeout實(shí)現(xiàn)這一功能,是非常實(shí)用的技巧,需要的朋友可以參考下2014-10-10JS實(shí)現(xiàn)1000以內(nèi)被3或5整除的數(shù)字之和
今天在技術(shù)群里看到一道這樣的提:求1000以內(nèi)被3或5整除的數(shù)字之和。小編把我的解決辦法分享到腳本之家平臺(tái),供大家參考2016-02-02JS中使用apply、bind實(shí)現(xiàn)為函數(shù)或者類傳入動(dòng)態(tài)個(gè)數(shù)的參數(shù)
這篇文章主要介紹了JS中使用apply、bind實(shí)現(xiàn)為函數(shù)或者類傳入動(dòng)態(tài)個(gè)數(shù)的參數(shù)的相關(guān)資料,需要的朋友可以參考下2016-04-04全面了解addEventListener和on的區(qū)別
下面小編就為大家?guī)?lái)一篇全面了解addEventListener和on的區(qū)別。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-07-07