大家都知道JQuerry有animate方法来给DOM元素进行运动,CSS3中也有transition、transform来进行运动。而使用原生的Javascript来控制元素运动,须要写非常多运动的细节以及兼容。

然而。当你的BOSS不让你使用庞大的JQ框架,并且你开发的产品也须要在一些不兼容CSS3的浏览器运行的时候。你是否认为每次都要开个定时器来琢磨运动该怎么进行,是件非常费力的事情呢?

那么福利来了,笔者近期总结了两个经常使用的运动框架,并将其写成组件,
仅仅要依照以下的方法调用。就可以方便使用。

1.在你的页面中引入js

<script src="Mover.js"></script>

2.在你的js代码中创建Mover对象

<script>
window.onload=function(){var mover = new Mover();
};
</script>

3.開始使用mover!
使用方法说明:笔者写的组件包含了两种运动框架供使用。一种是基于速度的;一种是基于时间的。让我们来先看看基于速度的运动框架的使用方法

startMoveBySpeed(obj, json, endFn);

參数obj : 传入要运动的对象

參数json : 以json的形式传入要运动的属性,包含left、top、width、height等以px为单位的属性和透明度opacity,他们的值是运动的终点

參数endFn(可选) : 结束运动后要运行的方法

<script>
//基于速度的运动框架使用方法
window.onload=function(){//得到你要运动的元素var oDiv = document.getElementsByTagName('div')[0];//使用运动框架var mover = new Mover();oDiv.onclick=function(){    mover.startMoveBySpeed(this,{'left':200,'width':300,'opacity':50});//使oDiv的left运动到200px,宽度变为300px,透明度变为50%}};
</script>

让我们来看看第二种基于时间的运动框架

startMoveByTime(obj, json, options, endFn )

參数obj : 传入要运动的对象

參数json : 以json的形式传入要运动的属性。包含left、top、width、height等以px为单位的属性和透明度opacity。他们的值是运动的终点

參数options : 以json的形式传入传入运动的总时间和运动方式,如:
{
‘times’ : 1000。//运动总时间为1s
‘fx’ : ‘linear’ // 运动形式为匀速
}
当options传入參数为空json{}时,就使用默认设置(运动时间500ms,运动形式为匀速)

參数endFn(可选) : 结束运动后要运行的方法

//基于事件的运动框架使用方法
window.onload=function(){//得到你要运动的元素var oDiv = document.getElementsByTagName('div')[0];//使用运动框架var mover = new Mover();oDiv.onclick=function(){mover.startMoveByTime(this, {'left':500,'top':200}, {'times':1000,'fx':'easeIn'}, function(){mover.startMoveByTime(this,{'opacity':20},{});});//使oDiv的left变为500px,高度变为200px,结束上述运动后再使透明度变为20%}
}

如今来说说两种方式的差别吧。使用第一种方式进行运动时。元素的各项须要改变的属性的运动速度同样,而因为每项属性起点到终点的距离不一样。所以各项属性到达运动终点的时间也不一样。

而第二种运动直接固定了运动总时间同样,所以全部传入參数的属性一起改变、一起终止。

以下是Mover.js组件的代码,笔者乃菜鸟一仅仅,欢迎指正。后面有时间也会将弹性运动、碰撞运动、重力运动一起写入框架

/*js原生运动组件
*///Mover构造函数
function Mover(){this.setting = {'times' : 500,'fx' : 'linear'}
}//获取当前样式
Mover.prototype.getStyle = function(obj,attr)
{return obj.currentStyle ? obj.currentStyle[attr] : getComputedStyle(obj)[attr];
}//获取当前时间
Mover.prototype.now = function(){return (new Date()).getTime();
}//速度版运动框架
Mover.prototype.startMoveBySpeed = function (obj,json,fnEnd)
{clearInterval(obj.timer);_this = this;obj.timer = setInterval(function(){obj.bStop = true;for(var attr in json){var cur = 0;var speed = 0;if(attr === 'opacity'){cur = _this.getStyle(obj,attr);cur = Math.round( parseFloat(cur*100) );}else{cur = parseInt(_this.getStyle(obj,attr));}var speed = (json[attr]-cur)/8;speed = speed ? Math.ceil(speed):Math.floor(speed);if(cur !== json[attr]){obj.bStop = false;}if(attr === 'opacity'){obj.style.opacity = (cur+speed)/100;obj.style.filter = 'Alpha(opacity:'+(cur+speed)+')';}else{obj.style[attr] = (cur+speed)+'px';}}if(obj.bStop){clearInterval(obj.timer);fnEnd && fnEnd.call(obj);}},20);
}//时间版运动框架
Mover.prototype.startMoveByTime = function(obj,json,options,endFn){//对于时间版框架来说。初始值b是固定的,所以写在定时器外面var _this = this;//默认设置extend(_this.setting,options);var iCur = {};//获取当前值for(attr in json){iCur[attr] = 0;if(attr === 'opacity'){iCur[attr] = Math.round( parseFloat( _this.getStyle(obj,attr) )*100 );}else{iCur[attr] = parseInt( _this.getStyle(obj,attr) );}};var iStartTime = _this.now();clearInterval(obj.timer);obj.timer = setInterval(function(){var iCurTime = _this.now();var t = _this.setting.times-Math.max(0,iStartTime-iCurTime+_this.setting.times);for(attr in json){   /*Tween[fx]函数4个參数t:current  time(当前时间)b:beginning  value(初始值)c: change  in  value(变化量)d:duration(持续时间)return  (目标点)   */var value = _this.Tween[_this.setting.fx](t,                      //t  0~timesiCur[attr],             //bjson[attr]-iCur[attr],  //c_this.setting.times                     //d);if(attr === 'opacity'){obj.style[attr] =  parseFloat(value/100);obj.style.filter = 'alpha(opacity:'+value+')';}else{obj.style[attr] = value + 'px';}}if( t === _this.setting.times ){clearInterval(obj.timer);endFn && endFn.call(obj);}},13);}
//覆盖默认设置
function extend(child,father){for(var attr in father){child[attr] = father[attr];}
}
//Tween运动算法
Mover.prototype.Tween = {/*4个參数t:current  time(当前时间)b:beginning  value(初始值)c: change  in  value(变化量)d:duration(持续时间)return  (目标点)*/linear: function (t, b, c, d){  //匀速return c*t/d + b;},easeIn: function(t, b, c, d){  //加速曲线return c*(t/=d)*t + b;},easeOut: function(t, b, c, d){  //减速曲线return -c *(t/=d)*(t-2) + b;},easeBoth: function(t, b, c, d){  //加速减速曲线if ((t/=d/2) < 1) {return c/2*t*t + b;}return -c/2 * ((--t)*(t-2) - 1) + b;},easeInStrong: function(t, b, c, d){  //加加速曲线return c*(t/=d)*t*t*t + b;},easeOutStrong: function(t, b, c, d){  //减减速曲线return -c * ((t=t/d-1)*t*t*t - 1) + b;},easeBothStrong: function(t, b, c, d){  //加加速减减速曲线if ((t/=d/2) < 1) {return c/2*t*t*t*t + b;}return -c/2 * ((t-=2)*t*t*t - 2) + b;}
}

转载于:https://www.cnblogs.com/gavanwanggw/p/7025924.html

【原生JS组件】javascript 运动框架相关推荐

  1. animate用法 js原生_原生JS封装animate运动框架的实例

    如下所示: div { width: 100px; height: 100px; background-color: pink; position: absolute; left: 0; top: 5 ...

  2. 原生JS实现各种运动之匀速运动

    给大家分享一个用原生JS实现的匀速运动,效果如下: 需要注意的是,这种运动效果在实际的开发中用的比较少,用的更多的还是弹性运动和缓冲运动,以下是代码实现,欢迎大家复制粘贴及吐槽. <!DOCTY ...

  3. 好程序员技术教程分享JavaScript运动框架

    好程序员技术教程分享JavaScript运动框架,有需要的朋友可以参考下. JavaScript的运动,即让某元素的某些属性由一个值变到另一个值的过程.如让div的width属性由200px变到400 ...

  4. 【原生js实现MVVM核心框架】

    MVC是一种框架模式,也是在学习前端时最先接触的框架模式,而MVP与MVVM都是在MVC的基础之上演化而来,三者各有优劣,本文主要按照下面思维导图进行介绍. 一.mvc mvp mvvm设计理念 1. ...

  5. javascript运动框架(三)

    迟到了好几天,不好意思哈! 继续来优化一下javascript运动框架的代码. 之前的代码存在bug,当重复点击时速度会加快,那么怎么解决这个bug呢? 现在我们就来解决一下, 其实很简单, 在开始运 ...

  6. JavaScript 运动框架

    1,运动原理 Js运动,本质来说,就是让 web 上 DOM 元素动起来.而想要 DOM 动起来,改变其自身的位置属性,比如高宽,左边距,上边距,透明度等.动画的原理就是把不同状态的物体,串成连续的样 ...

  7. 原生JS封装时间运动函数

    /*讲时间运动之前先给大家复习一下运动函数 通常大家都会写运动框架,一个定时器(Timer),一个步长(step 就是每次运动的距离),一个当前位置(current)一个目标位置(target),然后 ...

  8. js实现轮播图,模拟flash上下滚动(原生JS,没有任何框架)

    //以下是需要用到的js  最好封装 function startMove(obj, json, fnend) { clearInterval(obj.timer); //防止定时器叠加 obj.ti ...

  9. 近期学习的原生JS知识以及jQuery框架

    [正则表达式] 1.正则表达式包括两部分: ① 定义正则表达式的规则 ② 定义正则表达式的模式(i/g/m) 2.声明正则表达式: ① 字面声明 : var reg = /表达式规则/表达式模式 ② ...

最新文章

  1. SAP MM 如果存在OPEN的盘点凭证,则不能再次创建盘点凭证
  2. C#设计模式之二十职责链模式(Chain of Responsibility Pattern)【行为型】
  3. 9种没结果的爱(未婚者必读)!!!
  4. 餐厅叫号语音包_在济宁,你知道这家粤菜餐厅吗?网友:简直太好吃了
  5. vue-cli安装教程
  6. Leetcode 707.设计链表
  7. Java解决空引用_在java中检查空引用的乐观方法
  8. linux创建raid5分区,linux RAID5 创建过程以及raid5扩容步骤(软raid)
  9. bzoj 3396: [Usaco2009 Jan]Total flow 水流(最大流)
  10. C语言实现密码字典生成器
  11. 第二届(2021—2022学年)少年硅谷——全国青少年人工智能教育成果展示大赛
  12. 基于大数据技术推荐系统算法案例实战教程
  13. ASPUPload3.0注册机
  14. 查看电脑无线网 wifi密码
  15. HDU - 2567 寻梦
  16. mysql like 原理_MySql原理
  17. 由frankmocap得到的.pkl文件转为.bvh或者.fbx
  18. matlab小波变换边缘检测,matlab小波变换图像边缘检测源代码.m
  19. 两种方式实现线程通信:三个线程交替打印AABBCC
  20. 深度分析如何在Hadoop中控制Map的数量

热门文章

  1. 10_python基础—数据序列(推导式)
  2. python列表赋值 连续整数_Python_03_字符串_数据类型_for循环_列表操作
  3. andrew ng 机器学习笔记_机器学习笔记
  4. LINUX矩阵键盘简单介绍,stm32矩阵键盘原理图及程序介绍
  5. python实现两个接口的依赖关系
  6. 如何把服务器系统克隆出来,一次Win2003服务器下的完全克隆 -电脑资料
  7. cad vba 打开文件对话框_CAD每次打开系统都会新建一个Acad.vlx文件,如何解决呢?...
  8. caffe-gpu ubuntu 安装_ubuntu16.04 cuda10.0 配置caffe gpu环境
  9. 计算机学硕和专硕编码,2018考研报名:学会从专业代码判断学硕还是专硕
  10. 利用Eigen进行矩阵计算