原生javascript运动函数的封装示例【匀速、抛物线、多属性的运动等】
作者:巴啦啦小能量 发布时间:2024-04-25 13:15:33
标签:javascript,运动函数,封装
本文实例讲述了原生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


猜你喜欢
- 凡搞WEB开发的人都离不开HTTP(超文本传输协议),而要了解HTTP,除了HTML本身以外,还有一部分不可忽视的就是HTTP消息头。做过S
- 本文为大家介绍了一段来源于网络上的代码实例,能够合并单元格,下面和大家分享一下,希望能够给需要的朋友或多或少带来一定的帮助。代码实例如下:&
- 本文实例为大家分享了vue实现价格日历效果的具体代码,供大家参考,具体内容如下1、效果图2、下载全局安装:npm install ele-c
- 我写的这个程序import tensorflow as tfsess=tf.InteractiveSession()x=tf.Variabl
- 一、XML产生的背景 XML同HTML一样,都来自Standard Generalized Markup Language, 即标准通用标记
- 参考其他比较专业的博客系统,都在代码块上有一个复制代码的按钮。用来快速复制整个代码块的代码。于是我也想给我的博客增加一个这个功能。注:chr
- 训练的时候当然用gpu,速度快呀。我想用cpu版的tensorflow跑一下,结果报错,这个错误不太容易看懂。大概意思是没找到一些节点。后来
- <!-- -----------[test]表生成脚本---------------
- Perl利用函数rand()和srand()为随机数(更确切的说是"伪随机数")字符串的生成提供了基本的工具。这些函数不
- 近年来流行 Ajax,而 Ajax 的本质就是 XMLHttpRequest,是客户端 XMLHttpRequest 对象的使用。相对于 A
- 本文总结了input的各种使用方法,挺全面的1.取消按钮按下时的虚线框在input里添加属性值 hideFocus 或者 HideFocus
- 以前面试的时候会被问到,linux熟不熟呀?对于这种问题:我总会尴尬地回答,“额..了解一点”。 然而,我大学毕业的时候,连linux的虚拟
- 本文实例为大家分享了Python实现k-means算法的具体代码,供大家参考,具体内容如下这也是周志华《机器学习》的习题9.4。 数据集是西
- 迭代dict的key和value我们了解了如何迭代 dict 的key和value,那么,在一个 for 循环中,能否同时迭代 key和va
- 两种方式以及效果:方式一,使用PIL.Image.blend方式:from PIL import Image, ImageDrawim =
- Node被设计用来高效的处理I/O操作,但是你应该知道,有些类型的程序并不适合这种模式。比如,如果你打算用Node处理一个CPU密集的任务,
- 1。总体概要kNN算法已经在上一篇博客中说明。对于要处理手写体数字,需要处理的点主要包括: (1)图片的预处理:将png,jpg等格式的图片
- Windows 下从源码编译 PaddlePaddle1.环境准备Windows 10 专业版 (64bit)Python 版本 Pytho
- 需求描述:在公司老旧系统里,数据库表很多,但是在设计之初并没有建立好关系图,导致新人刚入职,面对N个库,每个库几百张表,很不方便。例如:公司
- 在讲这个问题之前让我们来先看一段代码: dim sql_injdata,SQL_inj,SQL_Get,SQL_Data,Sql_