一个简单的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 相关文章推荐
node.js中的http.createServer方法使用说明
Dec 14 Javascript
JS中artdialog弹出框控件之提交表单思路详解
Apr 18 Javascript
AngularJS基础 ng-init 指令简单示例
Aug 02 Javascript
JS中检测数据类型的几种方式及优缺点小结
Dec 12 Javascript
解决JS外部文件中文注释出现乱码问题
Jul 09 Javascript
js微信应用场景之微信音乐相册案例分享
Aug 11 Javascript
three.js 入门案例详解
Jan 23 Javascript
Vue源码解析之Template转化为AST的实现方法
Dec 14 Javascript
Vue.js结合bootstrap前端实现分页和排序效果
Dec 29 Javascript
vue无限轮播插件代码实例
May 10 Javascript
js实现数字滚动特效
Dec 16 Javascript
JS document文档的简单操作完整示例
Jan 13 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
phpmyadmin操作流程
2006/10/09 PHP
apache和php之间协同工作的配置经验分享
2013/04/08 PHP
微信支付开发订单查询实例
2016/07/12 PHP
php实现对文件压缩简单的方法
2019/09/29 PHP
基于jquery的分页控件(C#)
2011/01/06 Javascript
js propertychange和oninput事件
2014/09/28 Javascript
将json转换成struts参数的方法
2016/11/08 Javascript
AngularJS框架的ng-app指令与自动加载实现方法分析
2017/01/04 Javascript
带你快速理解javascript中的事件模型
2017/08/14 Javascript
vue2.0在table中实现全选和反选的示例代码
2017/11/04 Javascript
JS笛卡尔积算法与多重数组笛卡尔积实现方法示例
2017/12/01 Javascript
vue实现nav导航栏的方法
2017/12/13 Javascript
bootstrap动态调用select下拉框的实例代码
2018/08/09 Javascript
vue-quill-editor+plupload富文本编辑器实例详解
2018/10/19 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变rgba的a值实现)
2019/01/24 Javascript
微信小程序实现列表的横向滑动方式
2020/07/15 Javascript
[03:32]2014DOTA2西雅图邀请赛 CIS外卡赛赛前black专访
2014/07/09 DOTA
python通过zlib实现压缩与解压字符串的方法
2014/11/19 Python
python的keyword模块用法实例分析
2015/06/30 Python
python函数式编程学习之yield表达式形式详解
2018/03/25 Python
Python发送邮件功能示例【使用QQ邮箱】
2018/12/04 Python
Python字符串逆序的实现方法【一题多解】
2019/02/18 Python
Django 自定义分页器的实现代码
2019/11/24 Python
浅谈Python3实现两个矩形的交并比(IoU)
2020/01/18 Python
python适合做数据挖掘吗
2020/06/16 Python
Python venv虚拟环境配置过程解析
2020/07/08 Python
Python的3种运行方式:命令行窗口、Python解释器、IDLE的实现
2020/10/10 Python
python 调整图片亮度的示例
2020/12/03 Python
纯CSS3实现地球自转实现代码(图文教程附送源码)
2012/12/26 HTML / CSS
竞聘医务工作人员的自我评价分享
2013/11/04 职场文书
农业局学习党的群众路线教育实践活动心得体会
2014/03/07 职场文书
财务部副经理岗位职责
2014/03/14 职场文书
教师竞聘上岗演讲稿
2014/09/03 职场文书
谢师宴答谢词
2015/01/05 职场文书
工程资料员岗位职责
2015/04/13 职场文书
Nginx实现会话保持的两种方式
2022/03/18 Servers