一个简单的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 01 Javascript
jQuery-serialize()输出序列化form表单值的方法
Dec 26 Javascript
BOOTSTRAP时间控件显示在模态框下面的bug修复
Feb 05 Javascript
Backbone.js框架中简单的View视图编写学习笔记
Feb 14 Javascript
浅谈JavaScript中面向对象的的深拷贝和浅拷贝
Aug 01 Javascript
基于Bootstrap和jQuery构建前端分页工具实例代码
Nov 23 Javascript
BootStrapTable 单选及取值的实现方法
Jan 10 Javascript
详解基于 axios 的 Vue 项目 http 请求优化
Sep 04 Javascript
解决vue项目nginx部署到非根目录下刷新空白的问题
Sep 27 Javascript
深入理解Vue.js轻量高效的前端组件化方案
Dec 10 Javascript
如何解决.vue文件url引用文件的问题
Jan 18 Javascript
Node快速切换版本、版本回退(降级)、版本更新(升级)
Jan 07 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
ThinkPHP水印功能实现修复PNG透明水印并增加JPEG图片质量可调整
2014/11/05 PHP
PHP中list方法用法示例
2016/12/01 PHP
详细解读php的命名空间(二)
2018/02/21 PHP
PHP实现的大文件切割与合并功能示例
2018/04/10 PHP
PHP与以太坊交互详解
2018/08/24 PHP
基于ThinkPHP删除目录及目录文件函数
2020/10/28 PHP
JavaScript中的函数嵌套使用
2015/06/04 Javascript
分步解析JavaScript实现tab选项卡自动切换功能
2016/01/25 Javascript
JavaScript中push(),join() 函数 实例详解
2016/09/06 Javascript
JS实现的走迷宫小游戏完整实例
2017/07/19 Javascript
AngularJS实现的获取焦点及失去焦点时的表单验证功能示例
2017/10/25 Javascript
Vue.js在数组中插入重复数据的实现代码
2017/11/17 Javascript
Angular学习教程之RouterLink花式跳转
2018/05/03 Javascript
Canvas实现微信红包照片效果
2018/08/21 Javascript
jquery实现联想词搜索框和搜索结果分页的示例
2018/10/10 jQuery
微信小程序实现自动定位功能
2018/10/31 Javascript
解决微信小程序中转换时间格式IOS不兼容的问题
2019/02/15 Javascript
NodeJs入门教程之定时器和队列
2019/03/08 NodeJs
前端Electron新手入门教程详解
2019/06/21 Javascript
layui插件表单验证提交触发提交的例子
2019/09/09 Javascript
JavaScript的变量声明与声明提前用法实例分析
2019/11/26 Javascript
一个计算身份证号码校验位的Python小程序
2014/08/15 Python
Django读取Mysql数据并显示在前端的实例
2018/05/27 Python
python dataframe向下向上填充,fillna和ffill的方法
2018/11/28 Python
python爬虫模拟浏览器访问-User-Agent过程解析
2019/12/28 Python
Python任务自动化工具tox使用教程
2020/03/17 Python
Python docutils文档编译过程方法解析
2020/06/23 Python
python redis存入字典序列化存储教程
2020/07/16 Python
一文详述 Python 中的 property 语法
2020/09/01 Python
纯CSS3编写的的精美动画进度条(无flash/无图像/无脚本/附源码)
2013/01/07 HTML / CSS
美国玛丽莎收藏奢华时尚商店:Marissa Collections
2016/11/21 全球购物
俄罗斯游戏商店:Buka
2020/03/01 全球购物
完美实现CSS垂直居中的11种方法
2021/03/27 HTML / CSS
淘宝好评语大全
2014/05/05 职场文书
2019运动会广播加油稿汇总
2019/08/21 职场文书
HTML中实现音乐或视频自动播放案例详解
2022/05/30 HTML / CSS