原生javascript运动函数的封装示例【匀速、抛物线、多属性的运动等】

作者:巴啦啦小能量 时间:2024-04-25 13:15:33 

本文实例讲述了原生javascript运动函数的封装。分享给大家供大家参考,具体如下:


//封装匀速运动
//参数:
// 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、改变数据
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);
}
//封装匀速运动
//参数:
// 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/步子数;//
let currValue = startValue;
let myTimer = setInterval(function(){
//1、改变数据
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);
}
//封装抛物线运动(右开口为例)
//参数:
// 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/步子数;//
//二、启动定时器
let myTimer = setInterval(function(){
//1、改变数据
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);
}
//淡入:
//参数:
// dom对象
// 时长;
//返回值:无
function fadeIn(domObj,timeLong){
domObj.style.opacity = 0;
moveObj02(domObj,"opacity",1,timeLong);
}
//淡出:
//参数:
// dom对象
// 时长;
//返回值:无
function fadeOut(domObj,timeLong){
domObj.style.opacity = 1;
moveObj02(domObj,"opacity",0,timeLong);
}
//淡入和淡出:
//参数:
// 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/步子数;//
let currValue = startValue;
let myTimer = setInterval(function(){
//1、改变数据
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);
}
//多属性的运动
//参数:
// 1、dom对象
// 2、每个样式属性的结束值
// 4、时长:
//返回值
//调用示例:
/*
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/步子数;//
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、改变数据
//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);
}

希望本文所述对大家JavaScript程序设计有所帮助。

来源:https://blog.csdn.net/mlonly/article/details/85238590

标签:javascript,运动函数,封装
0
投稿

猜你喜欢

  • mysql 8.0.15 winx64压缩包安装配置方法图文教程

    2024-01-23 03:00:13
  • 解决pandas展示数据输出时列名不能对齐的问题

    2021-02-12 03:00:23
  • Python matplotlib绘制图形实例(包括点,曲线,注释和箭头)

    2021-08-31 22:57:06
  • ASP中遍历和操作Application对象的集合

    2007-09-13 12:45:00
  • 在sqlserver中如何使用CTE解决复杂查询问题

    2024-01-24 13:31:34
  • python将字典内容存入mysql实例代码

    2024-01-22 11:23:04
  • 是时候不用考虑基于字体大小(em)的设计了

    2009-10-24 13:25:00
  • Python中让MySQL查询结果返回字典类型的方法

    2024-01-25 04:37:33
  • Python多线程、异步+多进程爬虫实现代码

    2023-07-29 03:28:42
  • MySQL8.0.32安装及环境配置过程

    2024-01-19 03:20:49
  • vue实现下拉加载其实没那么复杂

    2024-05-29 22:29:53
  • mssql SA帐号的改名和删除

    2024-01-19 14:28:44
  • 解决json中ensure_ascii=False的问题

    2023-01-04 10:49:11
  • Nodejs进阶:express+session实现简易登录身份认证

    2024-05-11 09:51:28
  • Python Pygame实战之塔防游戏的实现

    2021-12-15 08:57:22
  • JavaScript 函数惰性载入的实现及其优点介绍

    2024-04-16 09:25:37
  • DenseNet121模型实现26个英文字母识别任务

    2023-08-22 13:15:22
  • 在pycharm中使用pipenv创建虚拟环境和安装django的详细教程

    2021-06-06 19:02:37
  • Javascript实现的鼠标经过时播放声音

    2010-05-18 20:03:00
  • 解析mysqldump的delay-insert选项

    2024-01-27 02:57:16
  • asp之家 网络编程 m.aspxhome.com