JS彈性運(yùn)動(dòng)實(shí)現(xiàn)方法分析
本文實(shí)例分析了JS彈性運(yùn)動(dòng)實(shí)現(xiàn)方法。分享給大家供大家參考,具體如下:
描述:像彈簧一樣左右彈動(dòng),最后緩慢停下來
一、加減速運(yùn)動(dòng)
1.加速運(yùn)動(dòng)
var iSpeed=0; iSpeed++;
速度越來越快,最后沖出去
2.減速運(yùn)動(dòng)
var iSpeed=20; iSpeed--;
速度越來越慢,降到0后開始變負(fù)值往反方向運(yùn)動(dòng)
二、彈性運(yùn)動(dòng)
1.在目標(biāo)點(diǎn)左邊,加速;目標(biāo)點(diǎn)右邊,減速,如
if(div1.offsetLeft<300){ iSpeed=iSpeed+1; //等同iSpeed++; } else{ iSpeed=iSpeed-1; }
這是最簡單的彈性運(yùn)動(dòng),缺陷:加速度恒定(應(yīng)該根據(jù)松緊帶而變)
if(div1.offsetLeft<300){ iSpeed=iSpeed+(300-div1.offsetLeft)/50; } else{ iSpeed=iSpeed-(div1.offsetLeft-300)/50; } iSpeed=iSpeed+(300-div1.offsetLeft)/50; ==>iSpeed=iSpeed+300/50-div1.offsetLeft/50; iSpeed=iSpeed-(div1.offsetLeft-300)/50; ==>iSpeed=iSpeed-div1.offsetLeft/50+300/50;
這兩個(gè)完全一樣 所以不需要if/else
iSpeed+=(300-div1.offsetLeft)/50; div1.style.left=div1.offsetLeft+iSpeed+'px';
缺陷2:不會(huì)停下來(缺少摩擦力)
iSpeed+=(300-div1.offsetLeft)/50; iSpeed*=0.95; //乘一個(gè)小數(shù),越來越小 div1.style.left=div1.offsetLeft+iSpeed+'px';
三、帶摩擦力的彈性運(yùn)動(dòng)
比較好的組合
iSpeed+=(300-div1.offsetLeft)/5; iSpeed*=0.7;
注:var iSpeed=0;要放在定時(shí)器外面,不然每次都從0開始,加啊乘啊就沒用了
四、整合好的彈性運(yùn)動(dòng)框架
var iSpeed=0; var left=0; function startMove(obj,iTarget){ clearInterval(obj.timer); obj.timer=setInterval(function(){ iSpeed+=(iTarget-obj.offsetLeft)/5; iSpeed*=0.7; //計(jì)算出來的速度是一個(gè)小數(shù),如果給它取整,會(huì)一直左右移動(dòng) left+=iSpeed; //把速度存在變量里,變量是可以有小數(shù)的 if(Math.abs(iSpeed)<1 && Math.abs(left-iTarget)<1){ //因?yàn)閕Speed和left都是小數(shù),所以永遠(yuǎn)達(dá)不到0和目標(biāo)點(diǎn),只能無限接近 clearInterval(obj.timer); //雖然速度最后接近于0,看似運(yùn)動(dòng)停止了,但定時(shí)器還一直開著,所以當(dāng)速度=0并且到達(dá)目標(biāo)點(diǎn),關(guān)掉(只是速度=0關(guān)掉,運(yùn)動(dòng)到最右邊準(zhǔn)備回來那一剎那,速度=0,同理只是到達(dá)目標(biāo)點(diǎn)關(guān)掉,一開始往右運(yùn)動(dòng)經(jīng)過中間時(shí)會(huì)達(dá)到目標(biāo)點(diǎn),所以必須兩者同時(shí)滿足) obj.style.left=iTarget+'px'; //小數(shù)無法完全貼合,所以最后直接讓他等于目標(biāo)點(diǎn),一般人肉眼看不出來 } else{ obj.style.left=left+'px'; //style.left只能是一個(gè)整數(shù),所以每次會(huì)把小數(shù)抹掉,誤差是累計(jì)的,最終累加起來就會(huì)有1-2像素,用obj.offsetLeft+iSpeed就會(huì)無法完全貼合 } },30); };
五、彈性運(yùn)動(dòng)不適用的地方
樣式會(huì)過界的
比如高度,先變大后變小,如果物體本身高度很小,可能會(huì)變成負(fù)值,就不對(duì)了
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《JavaScript運(yùn)動(dòng)效果與技巧匯總》、《JavaScript切換特效與技巧總結(jié)》、《JavaScript查找算法技巧總結(jié)》、《JavaScript動(dòng)畫特效與技巧匯總》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
- JavaScript拖拽、碰撞、重力及彈性運(yùn)動(dòng)實(shí)例分析
- 原生JS+CSS實(shí)現(xiàn)炫酷重力模擬彈跳系統(tǒng)的登錄頁面
- JavaScript模擬重力狀態(tài)下拋物運(yùn)動(dòng)的方法
- Javascript實(shí)現(xiàn)重力彈跳拖拽運(yùn)動(dòng)效果示例
- 純js模擬div層彈性運(yùn)動(dòng)的方法
- JS實(shí)現(xiàn)小球的彈性碰撞效果
- js實(shí)現(xiàn)帶簡單彈性運(yùn)動(dòng)的導(dǎo)航條
- js彈性勢(shì)能動(dòng)畫之拋物線運(yùn)動(dòng)實(shí)例詳解
- JavaScript實(shí)現(xiàn)重力下落與彈性效果的方法分析
相關(guān)文章
js通過window.open(url)下載文件并修改文件名
這篇文章主要給大家介紹了關(guān)于js如何通過window.open(url)下載文件并修改文件名的相關(guān)資料,我們知道下載文件是一個(gè)非常常見的需求,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-08-08基于JavaScript實(shí)現(xiàn)在新的tab頁打開url
這篇文章主要介紹了基于JavaScript實(shí)現(xiàn)在新的tab頁打開url 的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08Javascript發(fā)送AJAX請(qǐng)求實(shí)例代碼
這篇文章主要介紹了Javascript發(fā)送AJAX請(qǐng)求的實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08從js向Action傳中文參數(shù)出現(xiàn)亂碼問題的解決方法
Action獲取jsp表單中的中文參數(shù),只要整個(gè)項(xiàng)目都采用UTF-8編碼格式都不會(huì)出現(xiàn)亂碼問題;但JSP中用到JS,并從JS向Action傳中文參數(shù),就會(huì)出現(xiàn)中文亂的現(xiàn)象2013-12-12js 去掉空格實(shí)例 Trim() LTrim() RTrim()
js 去掉空格實(shí)例Trim(),LTrim(),RTrim() 需要的朋友可以過來參考下,希望對(duì)大家有所幫助2014-01-01javascript循環(huán)鏈表之約瑟夫環(huán)的實(shí)現(xiàn)方法
這是一道比較經(jīng)典的循環(huán)鏈表問題,在華為上機(jī)筆試中也出現(xiàn)過。 約瑟夫環(huán)是一個(gè)數(shù)學(xué)的應(yīng)用問題,下面這篇文章主要就給大家介紹了javascript循環(huán)鏈表之約瑟夫環(huán)的實(shí)現(xiàn)方法,需要的朋友可以參考借鑒,下面來一起看看吧。2017-01-01