使用JavaScript 實現(xiàn)對象 勻速/變速運動的方法
實例1——控制一個對象的勻速移動和停止
HTML:
<input id="btn" type="button" value=" Move It ! "/>
<div id="d1">
<img id="i1" src="1.jpg" alt/>
</div>
JS:實現(xiàn)向右運動
var timer=null;
window.onload=function(){
var odiv=document.getElementById('d1');
var obtn=document.getElementById('btn');
clearInterval(timer); //作用見要點①
obtn.onclick=function(){
timer=setInterval(function(){
var speed=10;
if(odiv.offsetLeft>=300){ //判斷對象邊距 到達指定位移則關閉定時器
clearInterval(timer);
}else{
odiv.style.left=odiv.offsetLeft+speed+'px';
}
},30);
}
}
要點:
①if語句的條件不能用“==”運算符,如上述代碼,當speed的值為基數(shù)如7時,不斷增加的左邊距不會出現(xiàn)300px值,而是到達294后直接跳到301,導致條件失效,無法停止。
②使用else語句是防止停止移動后,每點擊一次按鈕,div任會移動一個speed。
③在定時器之前,先關閉一下定時器,防止連續(xù)點擊按鈕時,同時打開多個定時器,使移動速度疊加后更快。
封裝:
//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);
}
實例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遞減,實現(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);
}
要點:
①通過遞減speed值,實現(xiàn)變速。
②移動到最后,當像素小于1px時,小于1px的幾個值不會被添加(或減去)到對象left中,而是被忽略,所以最終位移量比設定的水平位移位置itarget要少幾個像素。解決的辦法是進行取整:正數(shù)向上取整ceil(),負數(shù)向下取整floor()。
擴展:垂直位移的原理和水平位移的相同。
補充1:
解決speed與itarget不能整除,導致對象不能精確到達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;
}
//設置對象在離目標位置itarget的距離小于speed時,停止運動,同時設置對象的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);
}
補充2:
offset的Bug:例如offsetWidth,它包含的不只是width,還包含padding和border。當給對象設置了填充或邊框時,再將offsetWidth賦值給對象時,就會運動就會有差異。
解決:不用offset,而是通過創(chuàng)建一個兼容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實現(xiàn)運動緩沖效果的封裝函數(shù)示例
- JS實現(xiàn)勻速與減速緩慢運動的動畫效果封裝示例
- 原生JS實現(xiàn)圖片無縫滾動方法(附帶封裝的運動框架)
- 原生JS封裝animate運動框架的實例
- 原生JS實現(xiàn)風箱式demo,并封裝了一個運動框架(實例代碼)
- 原生js封裝運動框架的示例講解
- JS實現(xiàn)勻速運動的代碼實例
- JavaScript中的勻速運動和變速(緩沖)運動詳細介紹
- 原生javascript實現(xiàn)勻速運動動畫效果
- 淺談Javascript中勻速運動的停止條件
- js指定步長實現(xiàn)單方向勻速運動
- 原生javascript運動函數(shù)的封裝示例【勻速、拋物線、多屬性的運動等】
相關文章
用Object.prototype.toString.call(obj)檢測對象類型原因分析
在本篇文章里我們給大家剖析了用Object.prototype.toString.call(obj)檢測對象類型的原因,需要的朋友們可以學習下。2018-10-10setInterval()和setTimeout()的用法和區(qū)別示例介紹
setInterval()和setTimeout()想必大家并不陌生吧,接觸js的朋友都知道的,不過還是有一些新手朋友對兩者的用法不是很熟悉,下面簡要的為大家介紹下2013-11-11在JavaScript中操作數(shù)組之map()方法的使用
這篇文章主要介紹了在JavaScript中操作數(shù)組之map()方法的使用,是JS入門學習中的基礎知識,需要的朋友可以參考下2015-06-06ajax不執(zhí)行success回調而是執(zhí)行了error回調
最近在看jQuery的API文檔,在使用到jQuery的ajax時,如果指定了dataType為json,老是不執(zhí)行success回調,而是執(zhí)行了error回調函數(shù),極度郁悶2012-12-12