一个简单的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 相关文章推荐
漂亮的widgets,支持换肤和后期开发新皮肤
Apr 23 Javascript
javascript jQuery $.post $.ajax用法
Jul 09 Javascript
js 小数取整的函数
May 10 Javascript
基于Asp.net与Javascript控制的日期控件
May 22 Javascript
js下将字符串当函数执行的方法
Jul 13 Javascript
jQuery简单创建节点的方法
Sep 09 Javascript
微信小程序 图片边框解决方法
Jan 16 Javascript
用director.js实现前端路由使用实例
Jan 27 Javascript
js定时器实现倒计时效果
Nov 05 Javascript
js实现鼠标拖拽缩放div实例代码
Mar 25 Javascript
vue与django集成打包的实现方法
Nov 11 Javascript
js+audio实现音乐播放器
Sep 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
《星际争霸》各版本雷兽特点图文解析 雷兽不同形态一览
2020/03/02 星际争霸
PHP实现多图上传和单图上传功能
2018/05/17 PHP
WordPress伪静态规则设置代码实例
2020/12/10 PHP
使用js操作css实现js改变背景图片示例
2014/03/10 Javascript
jquery checkbox 勾选的bug问题解决方案与分析
2014/11/13 Javascript
jQuery实现瀑布流布局详解(PC和移动端)
2020/09/01 Javascript
轻松学习jQuery插件EasyUI EasyUI创建CRUD应用
2015/11/30 Javascript
jquery简单倒计时实现方法
2015/12/18 Javascript
AngularJS上拉加载问题解决方法
2016/05/23 Javascript
不使用script导入js文件的几种方法
2016/10/27 Javascript
js学习总结之DOM2兼容处理顺序问题的解决方法
2017/07/27 Javascript
浅谈JS中的反柯里化( uncurrying)
2017/08/17 Javascript
基于JavaScript实现带数据验证和复选框的表单提交
2017/08/23 Javascript
turn.js异步加载实现翻书效果
2019/07/25 Javascript
深入解读VUE中的异步渲染的实现
2020/06/19 Javascript
javascript实现页面的实时时钟显示示例
2020/08/06 Javascript
python解析文件示例
2014/01/23 Python
Python 的 Socket 编程
2015/03/24 Python
python实现的守护进程(Daemon)用法实例
2015/06/02 Python
Python安装第三方库的3种方法
2015/06/21 Python
python解决汉字编码问题:Unicode Decode Error
2017/01/19 Python
一个Python最简单的接口自动化框架
2018/01/02 Python
Python浅复制中对象生存周期实例分析
2018/04/02 Python
python word转pdf代码实例
2019/08/16 Python
Python 转换文本编码实现解析
2019/08/27 Python
Django框架 querySet功能解析
2019/09/04 Python
python元组的概念知识点
2019/11/19 Python
Python读取配置文件(config.ini)以及写入配置文件
2020/04/08 Python
NARS化妆品官方商店:美国彩妆品牌
2017/08/26 全球购物
外贸学院会计专业应届生求职信
2013/11/14 职场文书
财务学生的职业生涯发展
2014/02/11 职场文书
优秀教师演讲稿
2014/05/06 职场文书
跑操口号
2014/06/12 职场文书
2016公司中秋节寄语
2015/12/07 职场文书
使用RedisTemplat实现简单的分布式锁
2021/11/20 Redis
python manim实现排序算法动画示例
2022/08/14 Python