原生javascript運動函數(shù)的封裝示例【勻速、拋物線、多屬性的運動等】
本文實例講述了原生javascript運動函數(shù)的封裝。分享給大家供大家參考,具體如下:
//封裝勻速運動
//參數(shù):
// 1、dom對象
// 2、樣式屬性(top,left,width,height,opacity等等)
// 3、起始位置,結束位置
// 4、速度:時間間隔,步長
// 5、方向:
//返回值
function moveObj(domObj,attr,startValue,endValue,timeSpace,step,direction) {
let currValue = startValue;
let myTimer = setInterval(function(){
//1、改變數(shù)據(jù)
currValue = currValue+direction*step;
//2、判斷邊界
// if(currValue>=endValue){//??
// currValue = endValue;//??
// window.clearInterval(myTimer);
// }
if(Math.abs(currValue-endValue)<step){
currValue = endValue;
window.clearInterval(myTimer);
}
//3、改變外觀
if(attr=="opacity"){
domObj.style[attr] = currValue;
}else{
domObj.style[attr] = currValue+"px";
}
},timeSpace);
}
//封裝勻速運動
//參數(shù):
// 1、dom對象
// 2、樣式屬性(top,left,width,height,opacity等等)
// 3、結束位置
// 4、時長:
//返回值
function moveObj02(domObj,attr,endValue,timeLong) {
let startValue = parseFloat(getStyle(domObj,attr));//??
let direction= endValue-startValue>0?1:-1;//??
let timeSpace = 10;
let step = Math.abs(endValue-startValue)/(timeLong/timeSpace) // endValue-startValue/步子數(shù);//
let currValue = startValue;
let myTimer = setInterval(function(){
//1、改變數(shù)據(jù)
currValue = currValue+direction*step;
//2、判斷邊界
if(Math.abs(currValue-endValue)<step){
currValue = endValue;
window.clearInterval(myTimer);
}
//3、改變外觀
if(attr=="opacity"){
domObj.style[attr] = currValue;
}else{
domObj.style[attr] = currValue+"px";
}
},timeSpace);
}
//封裝拋物線運動(右開口為例)
//參數(shù):
// dom對象
// 起點
// 終點
// 總時長
//
//返回值:無
function parabola(domObj,startPoint,endPoint,timeLong,func){
//一、初始化
let offsetX = endPoint.x-startPoint.x;
let offsetY = endPoint.y-startPoint.y;
let p = (offsetY*offsetY)/(2*offsetX);
let left1 = 0;
domObj.style.left = startPoint.x+"px";
domObj.style.top = startPoint.y+"px";
let timeSpace = 10;
let step = Math.abs(endPoint.x-startPoint.x)/(timeLong/timeSpace) // endValue-startValue/步子數(shù);//
//二、啟動定時器
let myTimer = setInterval(function(){
//1、改變數(shù)據(jù)
left1=left1+step;
let top1=Math.sqrt(2*p*left1);
//2、判斷邊界
if(left1>=offsetX){
left1 = offsetX;
top1=Math.sqrt(2*p*left1);
window.clearInterval(myTimer);
if(func){
func();
}
}
//3、改變外觀
domObj.style.left = left1+startPoint.x+"px";
domObj.style.top = top1+startPoint.y+"px";
},timeSpace);
}
//淡入:
//參數(shù):
// dom對象
// 時長;
//返回值:無
function fadeIn(domObj,timeLong){
domObj.style.opacity = 0;
moveObj02(domObj,"opacity",1,timeLong);
}
//淡出:
//參數(shù):
// dom對象
// 時長;
//返回值:無
function fadeOut(domObj,timeLong){
domObj.style.opacity = 1;
moveObj02(domObj,"opacity",0,timeLong);
}
//淡入和淡出:
//參數(shù):
// domObjIn:淡入的dom對象
// domObjOut:淡出的dom對象
// 時長;
//返回值:無
function fadeInOut(domObjIn,domObjOut,timeLong,func){
domObjIn.style.opacity = 0;
domObjOut.style.opacity = 1;
let startValue = 0;
let endValue = 1;
let direction= 1;
let timeSpace = 10;
let step = Math.abs(endValue-startValue)/(timeLong/timeSpace) // endValue-startValue/步子數(shù);//
let currValue = startValue;
let myTimer = setInterval(function(){
//1、改變數(shù)據(jù)
currValue = currValue+direction*step;
//2、判斷邊界
if(Math.abs(currValue-endValue)<step){
currValue = endValue;
window.clearInterval(myTimer);
func&&func();
}
//3、改變外觀
domObjIn.style.opacity = currValue;
domObjOut.style.opacity = 1-currValue;
},timeSpace);
}
//多屬性的運動
//參數(shù):
// 1、dom對象
// 2、每個樣式屬性的結束值
// 4、時長:
//返回值
//調(diào)用示例:
/*
animate($("box"),{
"width":600,
"height":400,
"left":50
},2000)
*/
function animate(domObj,endObj,timeLong) {
// let startValue = parseFloat(getStyle(domObj,attr));//??
let startObj = {}
for(let key in endObj){
startObj[key] = parseFloat(getStyle(domObj,key));
}
// let direction= endValue-startValue>0?1:-1;//??
let directionObj = {};
for(let key in endObj){
directionObj[key] = endObj[key]>startObj[key]?1:-1;
}
let timeSpace = 10;
// let step = Math.abs(endValue-startValue)/(timeLong/timeSpace) // endValue-startValue/步子數(shù);//
let stepObj = {};
for(let key in endObj){
stepObj[key] = Math.abs(endObj[key]-startObj[key] )/(timeLong/timeSpace);
}
//let currValue = startValue;
let currObj = {};
for(let key in endObj){
currObj[key] = startObj[key];
}
let myTimer = setInterval(function(){
//1、改變數(shù)據(jù)
//currValue = currValue+direction*step;
for(let key in endObj){
currObj[key] = currObj[key]+directionObj[key]*stepObj[key];
}
//2、判斷邊界
let firstKey = Object.keys(endObj)[0];
if(Math.abs(currObj[firstKey]-endObj[firstKey])<stepObj[firstKey]){
for(let key in endObj){
currObj[key] = endObj[key];
}
window.clearInterval(myTimer);
}
//3、改變外觀
for(let key in endObj){
if(key=="opacity"){
domObj.style[key] = currObj[key];
}else{
domObj.style[key] = currObj[key]+"px";
}
}
},timeSpace);
}
感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運行工具:http://tools.jb51.net/code/HtmlJsRun測試上述代碼運行效果。
更多關于JavaScript相關內(nèi)容感興趣的讀者可查看本站專題:《JavaScript運動效果與技巧匯總》、《JavaScript切換特效與技巧總結》、《JavaScript查找算法技巧總結》、《JavaScript動畫特效與技巧匯總》、《JavaScript錯誤與調(diào)試技巧總結》、《JavaScript數(shù)據(jù)結構與算法技巧總結》、《JavaScript遍歷算法與技巧總結》及《JavaScript數(shù)學運算用法總結》
希望本文所述對大家JavaScript程序設計有所幫助。
相關文章
javascript二維數(shù)組和對象的深拷貝與淺拷貝實例分析
這篇文章主要介紹了javascript二維數(shù)組和對象的深拷貝與淺拷貝,結合實例形式分析了JavaScript針對數(shù)組與對象的深拷貝及淺拷貝相關操作技巧,需要的朋友可以參考下2019-10-10
jsonp跨域及實現(xiàn)百度首頁聯(lián)想功能的方法
這篇文章主要介紹了jsonp跨域及實現(xiàn)百度首頁聯(lián)想功能的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-08-08
JavaScript中誤用/g導致的正則test()無法正確重復執(zhí)行的解決方案
這篇文章主要介紹了JavaScript中誤用/g導致的正則test()無法正確重復執(zhí)行的解決方案的相關資料,需要的朋友可以參考下2016-07-07

