一个简单的js动画效果代码


Posted in Javascript onJuly 20, 2010

实现的功能:移动,暂停,恢复,停止.

未实现的功能:无法实现单位换算,不能实现颜色渐变(还有很多,有待完善...)

代码中的使用方法如下:

var $m = $M("divAnimate"); _("btnAnimate").onclick = function(){ 
this.disabled = true; 
var that = this; 
$m.animate({left:"300px",top:"100px",width:"300px", height:"200px",opacity:0.3},{duration:5000,easing:Tween.Back.easeInOut}).delay(200) 
.animate({left:"50px",top:"300px",width:"150px",height:"100px",opacity:0.8},{duration:2000,easing:Tween.Elastic.easeInOut, 
callback:function(){ 
that.disabled = false; 
} 
}); 
} 
_("btnPause").onclick = function(){ 
$m.pause(); 
this.disabled = true; 
_("btnResume").disabled = false; 
} 
_("btnResume").disabled = true; 
_("btnResume").onclick = function(){ 
$m.resume(); 
this.disabled = true; 
_("btnPause").disabled = false; 
} 
_("btnStop").onclick = function(){ 
$m.stop(); 
_("btnAnimate").disabled = false; 
}

功能实现:

/* 简单动画方法 
* 未实现单位换算 
*/ 
var $M = function(obj){ 
var elem = ("string" === typeof obj )?document.getElementById(obj):obj; 
var _this = {},props = {},timeId,isBusy = false,isPause = false; 
var queue = [],_current; 
//直线运动算法 
function Linear(t,b,c,d){ return c*t/d + b;} 
function setCss(className,value){ 
if(className == "opacity"){ 
if(document.defaultView){ 
elem.style["opacity"] = value; 
} else { 
elem.style["filter"] = 'alpha(opacity=' + 100 * value + ')'; 
} 
} else { 
elem.style[className] = value; 
} 
} 
function getCss(className){ 
if(className == "opacity"){ 
var ret = ""; 
if(document.defaultView){ 
ret = document.defaultView.getComputedStyle(elem,null)['opacity'] || 1; 
} else { 
ret = elem.currentStyle['filter']?(elem.currentStyle['filter'].match(/^alpha\(opacity=([\d\.]+)\)$/))[1]/100 : 1; 
} 
return ret.toString(); 
} else { 
return elem.style[className].toString(); 
} 
} function _move(params,easing,st,ht,callback){ 
var t = ((new Date()).getTime() - st); 
_current.t = t; 
if(isPause){return;} 
easing = easing||Linear; 
ht = ht || 500; 
for(var p in params){ 
if(!props[p]){ 
var iv = parseFloat(getCss(p)) || 0; 
var ev = parseFloat(params[p]); 
props[p] = { 
iv:iv, 
iu:iv?getCss(p).substring(iv.toString().length):null, 
ev:ev, 
eu:params[p].toString().substring(ev.toString().length) 
} 
//TODO(初始值的单位和目标值的单位不相同需要处理) 
} 
if(t >= ht){t = ht;} 
var nv = easing(t,props[p].iv,(props[p].ev - props[p].iv),ht); 
nv = parseFloat(nv); 
setCss(p,nv + props[p].eu); 
} 
if(t < ht){ 
timeId = setTimeout(function(){ 
_move(params,easing,st,ht,callback); 
},13); 
} else { 
props = {}; 
isBusy = false; 
if(callback){ 
callback(); 
} 
run(); 
} 
} 
function run(){ 
if(!isBusy && queue.length != 0){ 
var o = queue.shift(); 
var _delay = 0; 
while(o && o.delay){ 
_delay += o.delay; 
o = queue.shift(); 
} 
if(o){ 
_current = o; 
isBusy = true; 
setTimeout(function(){ 
var st = (new Date()).getTime(); 
_move(o.params,o.options.easing,st,o.options.duration,o.options.callback); 
},_delay); 
} 
} 
} 
var _this = { 
animate:function(params,options){ 
queue.push({params:params,options:options}); 
isPause = false; 
run(); 
return _this; 
}, 
delay:function(ms){ 
queue.push({delay:ms}); 
return _this; 
}, 
pause:function(){ 
isPause = true; 
return _this; 
}, 
resume:function(){ 
if(_current){ 
var o = _current; 
isPause = false; 
var st = (new Date()).getTime() - _current.t; 
_move(o.params,o.options.easing,st,o.options.duration,o.options.callback); 
return _this; 
} 
}, 
stop:function(){ 
isPause = true; 
isBusy = false; 
queue = []; 
props = {}; 
return _this; 
} 
}; 
return _this; 
}

参考地址:
https://3water.com/article/24309.htm
Javascript 相关文章推荐
Prototype使用指南之form.js
Jan 10 Javascript
jQuery.get、jQuery.getJSON、jQuery.post无法返回JSON问题的解决方法
Jul 28 Javascript
使用jQuery判断IE浏览器版本的代码
Jun 14 Javascript
JavaScript截取指定长度字符串点击可以展开全部代码
Dec 04 Javascript
vuejs2.0实现分页组件使用$emit进行事件监听数据传递的方法
Feb 22 Javascript
解决Vue中mounted钩子函数获取节点高度出错问题
May 18 Javascript
基于Vue自定义指令实现按钮级权限控制思路详解
May 23 Javascript
vue实现引入本地json的方法分析
Jul 12 Javascript
node.js 模块和其下载资源的镜像设置的方法
Sep 06 Javascript
VUE兄弟组件传值操作实例分析
Oct 26 Javascript
vue+element导航栏高亮显示的解决方式
Nov 12 Javascript
Vue 构造选项 - 进阶使用说明
Aug 14 Javascript
dess中一个简单的多路委托的实现
Jul 20 #Javascript
js 返回时间戳所对应的具体时间
Jul 20 #Javascript
javascript 数据类型转换(parseInt,parseFloat)
Jul 20 #Javascript
轻量级 JS ToolTip提示效果
Jul 20 #Javascript
javascript动画之圆形运动,环绕鼠标运动作小球
Jul 20 #Javascript
根据出生日期自动取得星座的js代码
Jul 20 #Javascript
firefox火狐浏览器与与ie兼容的2个问题总结
Jul 20 #Javascript
You might like
用PHP伪造referer突破网盘禁止外连的代码
2008/06/15 PHP
PHP代码网站如何防范SQL注入漏洞攻击建议分享
2012/03/01 PHP
PHP实现的连贯操作、链式操作实例
2014/07/08 PHP
PHP执行SQL文件并将SQL文件导入到数据库
2015/09/17 PHP
php设计模式之单例模式用法经典示例分析
2019/09/20 PHP
javascript 动态调整图片尺寸实现代码
2009/12/28 Javascript
工作中常用到的JS表单验证代码(包括例子)
2010/11/11 Javascript
js multiple全选与取消全选实现代码
2012/12/04 Javascript
javascript编写实用的省市选择器
2015/02/12 Javascript
javascript中的Base64、UTF8编码与解码详解
2015/03/18 Javascript
jquery实现的仿天猫侧导航tab切换效果
2015/08/24 Javascript
jQuery 1.9.1源码分析系列(十三)之位置大小操作
2015/12/02 Javascript
JS提交form表单实例分析
2015/12/10 Javascript
学习javascript文件加载优化
2016/02/19 Javascript
jQuery文本框得到与失去焦点动态改变样式效果
2016/09/08 Javascript
NodeJS配置HTTPS服务实例分享
2017/02/19 NodeJs
Angular在一个页面中使用两个ng-app的方法
2017/02/20 Javascript
鼠标拖动改变DIV等网页元素的大小的实现方法
2017/07/06 Javascript
js构造函数constructor和原型prototype原理与用法实例分析
2020/03/02 Javascript
微信小程序仿抖音短视频切换效果的实例代码
2020/06/24 Javascript
[01:38]2018DOTA2亚洲邀请赛主赛事第二日现场采访 神秘商人痛陈生计不易
2018/04/05 DOTA
详解python 字符串和日期之间转换 StringAndDate
2017/05/04 Python
Python+tkinter模拟“记住我”自动登录实例代码
2018/01/16 Python
python编程使用selenium模拟登陆淘宝实例代码
2018/01/25 Python
Python使用sort和class实现的多级排序功能示例
2018/08/15 Python
Python实现字符型图片验证码识别完整过程详解
2019/05/10 Python
python 一个figure上显示多个图像的实例
2019/07/08 Python
python获取天气接口给指定微信好友发天气预报
2020/12/28 Python
在线购买廉价折扣书籍和小说:BookOutlet.com
2018/02/19 全球购物
static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
2015/02/22 面试题
小学家长会邀请函
2014/01/23 职场文书
企业务虚会发言材料
2014/10/20 职场文书
个园导游词
2015/02/04 职场文书
2015年公司行政后勤工作总结
2015/05/20 职场文书
公司董事任命书
2015/09/21 职场文书
2019新员工试用期转正工作总结范文
2019/08/21 职场文书