一个简单的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 刷新页面的代码小结 推荐
Apr 02 Javascript
JavaScript 内置对象属性及方法集合
Jul 04 Javascript
公共js在页面底部加载的注意事项介绍
Jul 18 Javascript
Javascript获取统一管理的提示语(message)
Feb 03 Javascript
一个字符串中出现次数最多的字符 统计这个次数【实现代码】
Apr 29 Javascript
使用AngularJS 跨站请求如何解决jsonp请求问题
Jan 16 Javascript
js,jq,css多方面实现简易下拉菜单功能
May 13 Javascript
ReactNative实现图片上传功能的示例代码
Jul 11 Javascript
jQuery轮播图实例详解
Aug 15 jQuery
详解vue中多个有顺序要求的异步操作处理
Oct 29 Javascript
JavaScript this关键字指向常用情况解析
Sep 02 Javascript
小程序自定义圆形进度条
Nov 17 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/03/17 PHP
laravel-admin表单提交隐藏一些数据,回调时获取数据的方法
2019/10/08 PHP
分享十五个最佳jQuery 幻灯插件和教程
2010/03/27 Javascript
深入理解JavaScript系列(16) 闭包(Closures)
2012/04/12 Javascript
javascript文件中引用依赖的js文件的方法
2014/03/17 Javascript
基于BootStarp的Dailog
2016/04/28 Javascript
JS中this上下文对象使用方式
2016/10/09 Javascript
js基础之DOM中document对象的常用属性方法详解
2016/10/28 Javascript
js实现简单的网页换肤效果
2017/01/18 Javascript
jquery仿京东侧边栏导航效果
2017/03/02 Javascript
Node.js中的require.resolve方法使用简介
2017/04/23 Javascript
前端图片懒加载(lazyload)的实现方法(提高用户体验)
2017/08/21 Javascript
jQuery响应滚动条事件功能示例
2017/10/14 jQuery
原生js实现移动端触摸轮播的示例代码
2017/12/22 Javascript
浅析Vue 生命周期
2018/06/21 Javascript
vue 弹窗时 监听手机返回键关闭弹窗功能(页面不跳转)
2019/05/10 Javascript
JS回调函数深入理解
2019/10/16 Javascript
vue中移动端调取本地的复制的文本方式
2020/07/18 Javascript
实例讲解Python中global语句下全局变量的值的修改
2016/06/16 Python
利用Python爬虫给孩子起个好名字
2017/02/14 Python
Python表示矩阵的方法分析
2017/05/26 Python
python读取与写入csv格式文件的示例代码
2017/12/16 Python
python爬取各类文档方法归类汇总
2018/03/22 Python
Python生成一个迭代器的实操方法
2019/06/18 Python
Python3+Appium实现多台移动设备操作的方法
2019/07/05 Python
python 利用已有Ner模型进行数据清洗合并代码
2019/12/24 Python
python json 递归打印所有json子节点信息的例子
2020/02/27 Python
在django admin详情表单显示中添加自定义控件的实现
2020/03/11 Python
Python urllib.request对象案例解析
2020/05/11 Python
python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5
2020/12/01 Python
纯CSS改变webkit内核浏览器的滚动条样式
2014/04/17 HTML / CSS
Lacoste澳大利亚官网:服装、鞋类及配饰
2018/11/14 全球购物
小学校园文化建设汇报材料
2014/08/19 职场文书
乡镇组织委员个人整改措施
2014/09/16 职场文书
小学中队活动总结
2015/05/11 职场文书
Redis实现分布式锁的五种方法详解
2022/06/14 Redis