一个简单的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 相关文章推荐
clientX,pageX,offsetX,x,layerX,screenX,offsetLeft区别分析
Mar 12 Javascript
jquery获取URL中参数解决中文乱码问题的两种方法
Dec 18 Javascript
javascript操作ul中li的方法
May 14 Javascript
gulp-htmlmin压缩html的gulp插件实例代码
Jun 06 Javascript
Bootstrap分页插件之Bootstrap Paginator实例详解
Oct 15 Javascript
JS实现微信摇一摇原理解析
Jul 22 Javascript
javascript 判断用户有没有操作页面
Oct 17 Javascript
浅谈如何使用 webpack 优化资源
Oct 20 Javascript
JavaScript实现职责链模式概述
Jan 25 Javascript
vue实例中data使用return包裹的方法
Aug 27 Javascript
JS常见内存泄漏及解决方案解析
May 30 Javascript
javascript实现拼图游戏
Jan 29 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
mysq GBKl乱码
2006/11/28 PHP
PHP中PDO基础教程 入门级
2011/09/04 PHP
分享PHP-pcntl 实现多进程代码
2016/09/30 PHP
PHP实现的函数重载功能示例
2018/08/03 PHP
PHP查找一列有序数组是否包含某值的方法
2020/02/07 PHP
滚动条变色 隐藏滚动条与双击网页自动滚屏显示代码
2009/12/28 Javascript
javascript学习笔记(十三) js闭包介绍(转)
2012/06/20 Javascript
防止按钮在短时间内被多次点击的方法
2014/03/10 Javascript
javascript中函数作为参数调用的方法
2015/02/09 Javascript
浅析javascript的return语句
2015/12/15 Javascript
深入探究AngularJS框架中Scope对象的超级教程
2016/01/04 Javascript
java中String类型变量的赋值问题介绍
2016/03/23 Javascript
jQueryUI中的datepicker使用方法详解
2016/05/25 Javascript
详解闭包解决jQuery中AJAX的外部变量问题
2017/02/22 Javascript
vue下拉列表功能实例代码
2018/04/08 Javascript
vue 组件中添加样式不生效的解决方法
2018/07/06 Javascript
微信小程序中使用wxss加载图片并实现动画效果
2018/08/13 Javascript
Webstorm2016使用技巧(SVN插件使用)
2018/10/29 Javascript
js实现坦克移动小游戏
2019/10/28 Javascript
vue解决使用$http获取数据时报错的问题
2019/10/30 Javascript
vue 子组件watch监听不到prop的解决
2020/08/09 Javascript
vue elementui tree 任意级别拖拽功能代码
2020/08/31 Javascript
解决vue-router 嵌套路由没反应的问题
2020/09/22 Javascript
Python实现图片转字符画的示例代码
2017/08/21 Python
用python打印1~20的整数实例讲解
2019/07/01 Python
python uuid生成唯一id或str的最简单案例
2021/01/13 Python
css3个性化字体_动力节点Java学院整理
2017/07/12 HTML / CSS
儿科主治医生个人求职信
2013/09/23 职场文书
英文版餐饮运营管理求职信
2013/11/06 职场文书
实习报告评语
2014/04/26 职场文书
实习生评语
2014/04/26 职场文书
高中升旗仪式演讲稿
2014/09/09 职场文书
蛋糕店创业计划书范文
2014/09/21 职场文书
高中诗歌鉴赏教学反思
2016/02/16 职场文书
Python机器学习实战之k-近邻算法的实现
2021/11/27 Python
vue项目proxyTable配置和部署服务器
2022/04/14 Vue.js