Javascript 完美運(yùn)動(dòng)框架(逐行分析代碼,讓你輕松了運(yùn)動(dòng)的原理)
大家一聽這名字就知道,有了這套框架 網(wǎng)上的效果基本都是可以實(shí)現(xiàn)的。實(shí)際上之前的運(yùn)動(dòng)框架還是有局限性的,就是不能讓好幾個(gè)值一塊運(yùn)動(dòng)。
那這個(gè)問題怎么解決呢? 我們先來看看之前的運(yùn)動(dòng)框架
function getStyle(obj, name) {
if (obj.currentStyle) {
return obj.currentStyle[name];
} else {
return getComputedStyle(obj, null)[name];
}
}
function startMove(obj, attr, iTarget) {
clearInterval(obj.time);
obj.time = setInterval(function() {
var cur = 0;
if (attr == 'opacity') {
cur = Math.round(parseFloat(getStyle(obj, attr)) * 100);
} else {
cur = parseInt(getStyle(obj, attr));
}
var speed = (iTarget - cur) / 6;
speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
if (cur == iTarget) {
clearInterval(obj.time);
} else {
if (attr == 'opacity') {
obj.style.filter = 'alpha(opacity=' + cur + speed + ')';
obj.style.opacity = (cur + speed) / 100;
} else {
obj.style[attr] = cur + speed + 'px';
}
}
}, 30);
}
怎么修改呢? 實(shí)際上很簡單, 在過去的框架中,你每一次只能傳一個(gè)樣式,和一個(gè)值。那么現(xiàn)在把這些改成一個(gè)json對(duì)象。相信大家就明白了。
我們調(diào)用的時(shí)候就是startMove(oDiv,{width:200,height:200}); 如果需要的話就在加上回調(diào)函數(shù)。那么我們具體看看代碼是怎么修改的。
function startMove(obj, json, fnEnd)
{
var MAX=18;
//每次調(diào)用就只有一個(gè)定時(shí)器在工作(開始運(yùn)動(dòng)時(shí)關(guān)閉已有定時(shí)器)
//并且關(guān)閉或者開啟都是當(dāng)前物體的定時(shí)器,已防止與頁面上其他定時(shí)器的沖突,使每個(gè)定時(shí)器都互不干擾
clearInterval(obj.timer);
obj.timer=setInterval(function (){
var bStop=true; // 假設(shè):所有的值都已經(jīng)到了
for(var name in json)
{
var iTarget=json[name]; // 目標(biāo)點(diǎn)
//處理透明度,不能使用parseInt否則就為0了
if(name=='opacity')
{
// *100 會(huì)有誤差 0000007 之類的 所以要用 Math.round() 會(huì)四舍五入
var cur=Math.round(parseFloat(getStyle(obj, name))*100);
}
else
{
var cur=parseInt(getStyle(obj, name)); // cur 當(dāng)前移動(dòng)的數(shù)值
}
var speed=(iTarget-cur)/5; // 物體運(yùn)動(dòng)的速度 數(shù)字越小動(dòng)的越慢 /5 : 自定義的數(shù)字
speed=speed>0?Math.ceil(speed):Math.floor(speed);
if(Math.abs(speed)>MAX)speed=speed>0?MAX:-MAX;
if(name=='opacity')
{
obj.style.filter='alpha(opacity:'+(cur+speed)+')'; //IE
obj.style.opacity=(cur+speed)/100; //ff chrome
}
else
{
obj.style[name]=cur+speed+'px';
}
// 某個(gè)值不等于目標(biāo)點(diǎn)
if(cur!=iTarget)
{
bStop=false;
}
}
// 都達(dá)到了目標(biāo)點(diǎn)
if(bStop)
{
clearInterval(obj.timer);
if(fnEnd) //只有傳了這個(gè)函數(shù)才去調(diào)用
{
fnEnd();
}
}
}, 20);
}
為什么會(huì)有bstop的假設(shè)呢?
其實(shí)如果我這樣調(diào)用startMove(oDiv,{width:101,height:200}); 寬度變成101 已經(jīng)完成運(yùn)動(dòng)了,高度沒有到, 但是我們可能已經(jīng)關(guān)閉了當(dāng)前的定時(shí)器。運(yùn)動(dòng)已經(jīng)結(jié)束了,就會(huì)出現(xiàn)一個(gè)特殊情況下的bug。解釋一下:
實(shí)際上來說,需要所有的運(yùn)動(dòng)都到了才關(guān)閉定時(shí)器,反過來說,如果沒有不到的,那就關(guān)閉。在程序上就是定義一個(gè)布爾值,一開始為true,假設(shè)
所有的值都已經(jīng)到了,如果說有一個(gè)值不等于目標(biāo)點(diǎn),bstop為false 。 在整個(gè)循環(huán)結(jié)束后,bstop 為ture 就說明所有運(yùn)動(dòng)都完成了,這個(gè)時(shí)候就關(guān)閉定時(shí)器。
那么這個(gè)運(yùn)動(dòng)框架基本已經(jīng)完成了,適用css2 不適用css3。
總結(jié):
運(yùn)動(dòng)框架的演變過程
startMove(iTarget) 運(yùn)動(dòng)框架
startMove(obj,iTarget) 多物體
startMove(obj,attr,iTarget) 任意值
startMove(obj,attr,iTarget,fn) 鏈?zhǔn)竭\(yùn)動(dòng)
startMove(obj,json,fn) 完美運(yùn)動(dòng)
O(∩_∩)O謝謝 ~
- js運(yùn)動(dòng)動(dòng)畫的八個(gè)知識(shí)點(diǎn)
- javascript動(dòng)畫之圓形運(yùn)動(dòng),環(huán)繞鼠標(biāo)運(yùn)動(dòng)作小球
- JS運(yùn)動(dòng)框架之分享側(cè)邊欄動(dòng)畫實(shí)例
- 原生javascript實(shí)現(xiàn)勻速運(yùn)動(dòng)動(dòng)畫效果
- js彈性勢(shì)能動(dòng)畫之拋物線運(yùn)動(dòng)實(shí)例詳解
- JS實(shí)現(xiàn)基于Sketch.js模擬成群游動(dòng)的蝌蚪運(yùn)動(dòng)動(dòng)畫效果【附demo源碼下載】
- JS實(shí)現(xiàn)勻速與減速緩慢運(yùn)動(dòng)的動(dòng)畫效果封裝示例
- Js實(shí)現(xiàn)簡單的小球運(yùn)動(dòng)特效
- javascript實(shí)現(xiàn)10個(gè)球隨機(jī)運(yùn)動(dòng)、碰撞實(shí)例詳解
- JS實(shí)現(xiàn)勻速運(yùn)動(dòng)的代碼實(shí)例
- js實(shí)現(xiàn)緩沖運(yùn)動(dòng)效果的方法
- JS實(shí)現(xiàn)的小火箭發(fā)射動(dòng)畫效果示例
相關(guān)文章
JavaScript截屏功能的實(shí)現(xiàn)代碼
我覺得使用JS截圖的想法是非?;闹嚨?,首先JS沒有權(quán)限調(diào)用操作系統(tǒng)的截圖功能,其次,瀏覽器(BOM)也沒有提供相關(guān)的截圖接口,經(jīng)過一番折騰,有點(diǎn)思路了,下面通過實(shí)例代碼給大家簡單介紹下js 截屏功能的實(shí)現(xiàn)代碼,一起看看吧2017-07-07
小程序云開發(fā)實(shí)戰(zhàn)小結(jié)
這篇文章主要介紹了小程序云開發(fā)實(shí)戰(zhàn)小結(jié),本文詳細(xì)的介紹了云開發(fā)以及環(huán)境的搭建和項(xiàng)目實(shí)踐,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-10-10
適用于javascript開發(fā)者的Processing.js入門教程
這篇文章主要介紹了適用于javascript開發(fā)者的Processing.js入門教程,感興趣的小伙伴們可以參考一下2016-02-02
一個(gè)用javascript寫的select支持上下鍵、首字母篩選以及回車取值的功能
一個(gè)用javascript寫的select支持上下鍵、首字母篩選以及回車取值的功能2009-09-09
es6 super關(guān)鍵字的理解與應(yīng)用實(shí)例分析
這篇文章主要介紹了es6 super關(guān)鍵字的理解與應(yīng)用,結(jié)合實(shí)例形式分析了es6 super關(guān)鍵字的功能、原理、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2020-02-02
Bootstrap fileinput 上傳新文件移除時(shí)觸發(fā)服務(wù)器同步刪除的配置
這篇文章主要介紹了Bootstrap fileinput 上傳新文件移除時(shí)觸發(fā)服務(wù)器同步刪除的配置 ,需要的朋友可以參考下2018-10-10
javascript中xml操作實(shí)現(xiàn)代碼
好久沒寫了。感覺今時(shí)今日,HTML5 還依然只是一種玩票的東東。但愿 w3c 的標(biāo)準(zhǔn)可以早一點(diǎn)出臺(tái),不要讓各種瀏覽器的兼容問題和支持程度搞死2011-11-11

