一个简单的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 相关文章推荐
JS 自动安装exe程序
Nov 30 Javascript
javascript 有趣而诡异的数组
Apr 06 Javascript
jQuery contains过滤器实现精确匹配使用方法
Apr 12 Javascript
jquery控制左右箭头滚动图片列表的实例
May 20 Javascript
jquery dialog open后,服务器端控件失效的快速解决方法
Dec 19 Javascript
js实现同一个页面多个渐变效果的方法
Apr 10 Javascript
基于JavaScript短信验证码如何实现
Jan 24 Javascript
jQuery原理系列-css选择器的简单实现
Jun 07 Javascript
js实现带缓动动画的导航栏效果
Jan 16 Javascript
Vue + Webpack + Vue-loader学习教程之相关配置篇
Mar 14 Javascript
JQuery用$.ajax或$.getJSON跨域获取JSON数据的实现代码
Sep 23 jQuery
vuex提交state&amp;&amp;实时监听state数据的改变方法
Sep 16 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代码优化及php相关问题总结
2006/10/09 PHP
php使用get_class_methods()函数获取分类的方法
2016/07/20 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
strpos() 函数判断字符串中是否包含某字符串的方法
2019/01/16 PHP
PHP设计模式之工厂模式(Factory Pattern)的讲解
2019/03/21 PHP
JavaScript实际应用:innerHTMl和确认提示的使用
2006/06/22 Javascript
JavaScript效率调优经验
2009/06/04 Javascript
js判断浏览器类型为ie6时不执行
2014/06/15 Javascript
轻松掌握JavaScript装饰者模式
2016/08/27 Javascript
Bootstrap3 图片(响应式图片&amp;图片形状)
2017/01/04 Javascript
js实现文字列表无缝滚动效果
2017/06/23 Javascript
JS+canvas画一个圆锥实例代码
2017/12/13 Javascript
Vue不能检测到Object/Array更新的情况的解决
2018/06/26 Javascript
详解为生产环境编译Angular2应用的方法
2018/12/10 Javascript
Node.js操作MongoDB数据库实例分析
2020/01/19 Javascript
小程序中手机号识别的示例
2020/12/14 Javascript
[01:15:36]加油刀塔第二期网络版
2014/08/09 DOTA
[04:50]2019DOTA2高校联赛秋季赛四强集锦
2019/12/27 DOTA
Python Socket编程入门教程
2014/07/11 Python
python获取指定目录下所有文件名列表的方法
2015/05/20 Python
利用Python破解验证码实例详解
2016/12/08 Python
python 通过字符串调用对象属性或方法的实例讲解
2018/04/21 Python
Python 实现文件读写、坐标寻址、查找替换功能
2019/09/11 Python
Python利用逻辑回归分类实现模板
2020/02/15 Python
详解Open Folder as PyCharm Project怎么添加的方法
2020/12/29 Python
你应该知道的30个css选择器
2014/03/19 HTML / CSS
详解HTML5中的拖放事件(Drag 和 drop)
2016/11/14 HTML / CSS
The North Face北面英国官网:美国著名户外品牌
2017/12/13 全球购物
goodhealth官方海外旗舰店:新西兰国民营养师
2017/12/15 全球购物
Ajxa常见问题都有哪些
2014/03/26 面试题
大学生水文观测实习自我鉴定
2013/09/29 职场文书
教师对学生的寄语
2014/04/03 职场文书
党的群众路线教育实践活动总结报告
2014/04/28 职场文书
效能监察建议书
2014/05/19 职场文书
中文专业求职信
2014/06/20 职场文书
JavaScript使用canvas绘制坐标和线
2021/04/28 Javascript