使用JavaScript 實(shí)現(xiàn)對象 勻速/變速運(yùn)動的方法
實(shí)例1——控制一個(gè)對象的勻速移動和停止
HTML:
<input id="btn" type="button" value=" Move It ! "/>
<div id="d1">
<img id="i1" src="1.jpg" alt/>
</div>
JS:實(shí)現(xiàn)向右運(yùn)動
var timer=null;
window.onload=function(){
var odiv=document.getElementById('d1');
var obtn=document.getElementById('btn');
clearInterval(timer); //作用見要點(diǎn)①
obtn.onclick=function(){
timer=setInterval(function(){
var speed=10;
if(odiv.offsetLeft>=300){ //判斷對象邊距 到達(dá)指定位移則關(guān)閉定時(shí)器
clearInterval(timer);
}else{
odiv.style.left=odiv.offsetLeft+speed+'px';
}
},30);
}
}
要點(diǎn):
①if語句的條件不能用“==”運(yùn)算符,如上述代碼,當(dāng)speed的值為基數(shù)如7時(shí),不斷增加的左邊距不會出現(xiàn)300px值,而是到達(dá)294后直接跳到301,導(dǎo)致條件失效,無法停止。
②使用else語句是防止停止移動后,每點(diǎn)擊一次按鈕,div任會移動一個(gè)speed。
③在定時(shí)器之前,先關(guān)閉一下定時(shí)器,防止連續(xù)點(diǎn)擊按鈕時(shí),同時(shí)打開多個(gè)定時(shí)器,使移動速度疊加后更快。
封裝:
//object:要移動的對象id itarget:水平位移位置
var timer=null;
function moveto(object,itarget){
var obj=document.getElementById(object);
clearInterval(timer);
timer=setInterval(function(){
var speed=0;
if(obj.offsetLeft<itarget){ //通過對象距離父級的邊距和水平位移量 判斷左右位移方向
speed=10;
}else{
speed=-10;
}
if(obj.offsetLeft==itarget){
clearInterval(timer);
}else{
obj.style.left=obj.offsetLeft+speed+'px';
};
},30);
}
實(shí)例2——修改上述封裝的函數(shù)moveto(),使該對象變速停止
JS:
var timer=null;
function moveto(object,itarget){
var obj=document.getElementById(object);
clearInterval(timer);
timer=setInterval(function(){
var speed=0;
if(obj.offsetLeft<itarget){//通過位移量除以10,使speed遞減,實(shí)現(xiàn)減速停止。 乘以10則為加速。通過乘除的數(shù)字,控制快慢
speed=(itarget-obj.offsetLeft)/10;
}else{
speed=-(obj.offsetLeft-itarget)/10;
}
speed=speed>0?Math.ceil(speed):Math.floor(speed);//取整,解決最后不足1px的位移量被忽略的問題
if(obj.offsetLeft==itarget){
clearInterval(timer);
}else{
obj.style.left=obj.offsetLeft+speed+'px';
};
document.title=obj.offsetLeft;
},30);
}
要點(diǎn):
①通過遞減speed值,實(shí)現(xiàn)變速。
②移動到最后,當(dāng)像素小于1px時(shí),小于1px的幾個(gè)值不會被添加(或減去)到對象left中,而是被忽略,所以最終位移量比設(shè)定的水平位移位置itarget要少幾個(gè)像素。解決的辦法是進(jìn)行取整:正數(shù)向上取整ceil(),負(fù)數(shù)向下取整floor()。
擴(kuò)展:垂直位移的原理和水平位移的相同。
補(bǔ)充1:
解決speed與itarget不能整除,導(dǎo)致對象不能精確到達(dá)itarget位置,而是在其左右抖動問題:
var timer=null;
function moveto(object,itarget){
var obj=document.getElementById(object);
clearInterval(timer);
timer=setInterval(function(){
var speed=0;
if(obj.offsetLeft<=itarget){
speed=7;
}else{
speed=-7;
}
//設(shè)置對象在離目標(biāo)位置itarget的距離小于speed時(shí),停止運(yùn)動,同時(shí)設(shè)置對象的left直接移動到itarget的位置。
if(Math.abs(itarget-obj.offsetLeft<=speed)){
clearInterval(timer);
obj.style.left=itarget+'px';
}else{
obj.style.left=obj.offsetLeft+speed+'px';
};
document.title=obj.offsetLeft;
},30);
}
補(bǔ)充2:
offset的Bug:例如offsetWidth,它包含的不只是width,還包含padding和border。當(dāng)給對象設(shè)置了填充或邊框時(shí),再將offsetWidth賦值給對象時(shí),就會運(yùn)動就會有差異。
解決:不用offset,而是通過創(chuàng)建一個(gè)兼容IE和FF的函數(shù),獲取元素的width屬性值,來代替offsetWidth。該函數(shù)如下:getAttr()
function getAttr(obj,attrName){
var obj=document.getElementById(obj);
if(obj.currentStyle){
return obj.currentStyle[attrName]; //兼容IE
}else{
return getComputedStyle(obj,false)[attrName]; //兼容FF
}
}
- JS實(shí)現(xiàn)運(yùn)動緩沖效果的封裝函數(shù)示例
- JS實(shí)現(xiàn)勻速與減速緩慢運(yùn)動的動畫效果封裝示例
- 原生JS實(shí)現(xiàn)圖片無縫滾動方法(附帶封裝的運(yùn)動框架)
- 原生JS封裝animate運(yùn)動框架的實(shí)例
- 原生JS實(shí)現(xiàn)風(fēng)箱式demo,并封裝了一個(gè)運(yùn)動框架(實(shí)例代碼)
- 原生js封裝運(yùn)動框架的示例講解
- JS實(shí)現(xiàn)勻速運(yùn)動的代碼實(shí)例
- JavaScript中的勻速運(yùn)動和變速(緩沖)運(yùn)動詳細(xì)介紹
- 原生javascript實(shí)現(xiàn)勻速運(yùn)動動畫效果
- 淺談Javascript中勻速運(yùn)動的停止條件
- js指定步長實(shí)現(xiàn)單方向勻速運(yùn)動
- 原生javascript運(yùn)動函數(shù)的封裝示例【勻速、拋物線、多屬性的運(yùn)動等】
相關(guān)文章
深入理解JavaScript系列(18):面向?qū)ο缶幊讨瓻CMAScript實(shí)現(xiàn)
這篇文章主要介紹了深入理解JavaScript系列(18):面向?qū)ο缶幊讨瓻CMAScript實(shí)現(xiàn),本文講解了數(shù)據(jù)類型、原始值類型、Object類型、動態(tài)性、內(nèi)置對象、原生對象及宿主對象等內(nèi)容,需要的朋友可以參考下2015-03-03
全選復(fù)選框JavaScript編寫小結(jié)(附代碼)
這篇文章主要介紹了全選”復(fù)選框JavaScript編寫,分別附上html和js代碼以供大家更深刻了解,具體操作步驟大家可查看下文的詳細(xì)講解,感興趣的小伙伴們可以參考一下。2017-08-08
Javascript學(xué)習(xí)筆記之相等符號與嚴(yán)格相等符號
本文詳細(xì)介紹了javascript中的相等符號以及嚴(yán)格相等符號,需要的朋友可以參考下2014-11-11
Javascript學(xué)習(xí)筆記之 對象篇(四) : for in 循環(huán)
如同 in 運(yùn)算符一樣,使用 for in 循環(huán)遍歷對象屬性時(shí),也將往上遍歷整個(gè)原型鏈。2014-06-06
JavaScript中幾種排序算法的簡單實(shí)現(xiàn)
這篇文章主要介紹了JavaScript中幾種排序算法的簡單實(shí)現(xiàn),排序是各種編程語言學(xué)習(xí)中都是共通的必會的基礎(chǔ),需要的朋友可以參考下2015-07-07
JavaScript中的運(yùn)算符種類及其規(guī)則介紹
JavaScript中的運(yùn)算符有很多,主要分為算術(shù)運(yùn)算符,等同全同運(yùn)算符,比較運(yùn)算符,字符串運(yùn)算符,邏輯運(yùn)算符,賦值運(yùn)算符等,它們都有一個(gè)自己的運(yùn)算規(guī)則,在本文為大家介紹下2013-09-09

