一个简单的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 相关文章推荐
JavaScript的9个陷阱及评点分析
May 16 Javascript
Js动态创建div
Sep 25 Javascript
javascript 密码强度验证规则、打分、验证(给出前端代码,后端代码可根据强度规则翻译)
May 18 Javascript
使用jQuery的将桌面应用程序引入浏览器
Nov 19 Javascript
基于jquery点击自以外任意处,关闭自身的代码
Feb 10 Javascript
原生Js实现元素渐隐/渐现(原理为修改元素的css透明度)
Jun 24 Javascript
jQuery实现跟随鼠标运动图层效果的方法
Feb 02 Javascript
js生成验证码并直接在前端判断
May 15 Javascript
JavaScript如何实现组合列表框中元素移动效果
Mar 01 Javascript
浅谈javascript中遇到的字符串对象处理
Nov 18 Javascript
微信小程序 简单DEMO布局,逻辑,样式的练习
Nov 30 Javascript
vue实现五子棋游戏
May 28 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三元运算符知识汇总
2015/07/02 PHP
php设计模式之适配器模式实例分析【星际争霸游戏案例】
2020/04/07 PHP
JS 对象介绍
2010/01/20 Javascript
jquery 图片Silhouette Fadeins渐显效果
2010/02/07 Javascript
js封装的textarea操作方法集合(兼容很好)
2010/11/16 Javascript
js限制文本框输入长度两种限制方式(长度、字节数)
2012/12/19 Javascript
基于jquery异步传输json数据格式实例代码
2013/11/23 Javascript
JavaScript的常见兼容问题及相关解决方法(chrome/IE/firefox)
2013/12/31 Javascript
javascript跨域的4种方法和原理详解
2014/04/08 Javascript
js Object2String方便查看js对象内容
2014/11/24 Javascript
AngularJS入门教程之MVC架构实例分析
2016/11/01 Javascript
javascript 利用arguments实现可变长参数
2016/11/21 Javascript
深究AngularJS中$sce的使用
2017/06/12 Javascript
vue.js实例todoList项目
2017/07/07 Javascript
微信小程序实现拖拽 image 触摸事件监听的实例
2017/08/17 Javascript
vue 2.0项目中如何引入element-ui详解
2017/09/06 Javascript
vue使用pdfjs显示PDF可复制的实现方法
2018/12/14 Javascript
JavaScript判断数据类型有几种方法及区别介绍
2020/09/02 Javascript
jQuery实现简单全选框
2020/09/13 jQuery
跟老齐学Python之集成开发环境(IDE)
2014/09/12 Python
python取均匀不重复的随机数方式
2019/11/27 Python
centos7中安装python3.6.4的教程
2019/12/11 Python
keras之权重初始化方式
2020/05/21 Python
HTML5 Canvas的性能提高技巧经验分享
2013/07/02 HTML / CSS
Ancheer官方户外和运动商店:销售电动自行车
2019/08/07 全球购物
美国价格实惠的在线眼镜网站:Zeelool
2020/12/25 全球购物
简单的辞职信范文
2014/01/18 职场文书
工作决心书范文
2014/03/11 职场文书
实习指导老师评语
2014/04/26 职场文书
生物科学专业自荐书
2014/06/20 职场文书
基层工作经验证明样本
2014/11/16 职场文书
质检员岗位职责
2015/02/03 职场文书
英文辞职信范文
2015/05/13 职场文书
python基于opencv批量生成验证码的示例
2021/04/28 Python
MySQL 亿级数据导入导出及迁移笔记
2021/06/18 MySQL
漫画「请问您今天要来点兔子吗?」最新杂志彩页公开
2022/03/24 日漫