javascript简易缓动插件(源码打包)


Posted in Javascript onFebruary 16, 2012

要求如下:
可以开始、暂停(线性、非线性tween都支持)、继续、结束
支持多个样式并行
最好不依赖于某个框架下运行
文件尺寸越小越好
他找了一下现有的一些插件或者库,鲜有能满足或者比较均衡的,我在这个要求下,写了一个比较简陋的动画组件,基本满足了这个需求。先上代码
在线演示:http://demo.3water.com/js/2012/animate/
打包下载:animate_jquery.rar
html部分:

<!DOCTYPE html> 
<html> 
<head> 
<meta charset="utf-8" /> 
<title>animate</title> 
<script type="text/javascript" src="tangram-1.5.0.core.js"></script> 
<script type="text/javascript" src="jquery.min.js"></script> 
<style> 
html,body,ul,li{padding:0;margin:0;} 
#anim{width:50px;height:50px;background:red;position:absolute; top:30px;left:0;} 
</style> 
</head> 
<body> 
<div> 
<input type="button" value="start" onclick="an.start()" /> 
<input type="button" value="pause" onclick="an.pause()" /> 
<input type="button" value="resume" onclick="an.resume()" /> 
<input type="button" value="stop" onclick="an.stop()" /> 
<a target="_self" id="demolink" href="animate.html?demo=1" />auto start,pasue,then resume</a> 
</div> 
<div id="anim"></div> 
</body></html>

animate部分:
function animate(options){ 
this.from = options.from;//如果没有from,就计算出from 
this.to = options.to || {}; 
this.onStart = options.onStart || empty;//以下是一些回调函数,就不采用事件机制了 
this.onStop = options.onStop || empty; 
this.onAnimate = options.onAnimate || empty; 
this.onContinue = options.onContinue || empty; 
this.onPause = options.onPause || empty; 
var element = options.element; 
var duration = options.duration || 300;//变化的总时长,单位是ms 
var pending = false;//是不是已经暂停了,如果还木有开始的话,该值也是true 
var timer = null; 
var mixin = options.mix; 
var defaultState = this.from || getState(element, this.to);//原始的数据 
var thiz = this; 
//获取最初始的样式 
function getState(ele, targetStyles){ 
var obj = {}; 
var i = 0; 
for (var p in targetStyles) 
{ 
i++; 
obj[p] = parseFloat(mixin.getStyle(ele, p)); 
} 
if(i == 0){ 
return null; 
} 
return obj; 
} 
function empty(){} 
function animate(from, to, elapse){ 
var startTime = (new Date).getTime() + (elapse ? - elapse : 0);//如果有第三个参数,证明是从一个暂停开始的,那么就设置startTime为当前时间减去暂定时已经逝去的时间,如果只有两个参数,那么逝去时间就是0 
timer = setInterval(function(){ 
var endTime = (new Date).getTime(); 
if(endTime - startTime < duration){ 
thiz.onAnimate(); 
currentElapse = endTime - startTime; 
for(var p in from){ 
if(from.hasOwnProperty(p)){ 
var currentPropertyStyle = mixin.compute(currentElapse, from[p], to[p]-from[p], duration); 
mixin.setStyle(element, p, currentPropertyStyle); 
} 
} 
} 
else{ 
thiz.stop(thiz.to); 
} 
}, 16); 
} 
this.start = function(){ 
if(pending){ 
this.resume(); 
} 
else{ 
this.onStart(); 
animate(defaultState, this.to); 
} 
} 
this.stop = function(){ 
clearInterval(timer); 
var styles = this.to; 
for(var p in styles){ 
if(styles.hasOwnProperty(p)){ 
mixin.setStyle(element, p, styles[p]); 
} 
} 
this.onStop(); 
} 
this.pause = function(){ 
clearInterval(timer); 
pending = true; 
this.onPause(); 
} 
this.resume = function(){ 
pending = false; 
this.onContinue(); 
animate(defaultState, this.to, currentElapse); 
} 
}

使用部分:
var mixinT = { 
getStyle:baidu.dom.getStyle, 
setStyle:baidu.dom.setStyle, 
compute:function(t, b, c, d){ 
//return t*c/d + b; 
if (t==0) return b; 
if (t==d) return b+c; 
if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b; 
return c/2 * (-Math.pow(2, -10 * --t) + 2) + b; 
} 
}; 
var mixinJQ = { 
getStyle:function(ele, styleName){ 
return $(ele).css(styleName); 
}, 
setStyle:function(ele, styleName, styleValue){ 
$(ele).css(styleName, styleValue); 
}, 
compute:function(t, b, c, d){ 
return b+ t*c/d; 
} 
}; 
var an = new animate({ 
element:document.getElementById('anim'), 
//from:{'width':100, 'height':100, left:0, top:30}, 
to:{left:500}, 
mix:mixinT, 
duration:2000 
}); 
if(/demo=1/.test(location.search)){ 
var demolink = baidu.g('demolink'); 
demolink.href= 'animate.html'; 
demolink.innerHTML = 'back'; 
an.start(); 
setTimeout(function(){ 
an.pause(); 
resume(); 
}, 1200); 
function resume(){ 
setTimeout(function(){an.resume()}, 1000); 
} 
}

上面是一个完整demo的代码。做几点说明:
代码尺寸足够小了,一共才100行,gzip后连1k都不到。
满足了可以start、pause、resume、stop的需求,赠送了几个回调函数:D。
可以支持多个样式一起变化。
采用了一个mixin变量,传进来三个函数需要在执行动画时的操作,getStyle、setStyle、compute,我感觉这三个确实和用户的选择有关系,前两个可能和框架有关,第三个和用户采用的变化计算方式有关,之所以传进去四个参数,主要是和主流的tween类能适应起来,可以参考http://www.robertpenner.com/easing/和http://www.actionscript.org/resources/articles/170/1/Flash-MX-2004-Undocumented-TweenEasing-Classes-Documented/Page1.html。我给的例子用了tangram和jquery俩类库,分别对应了两个mixin对象,做一下简单的适配,就能用了。
一些“私有”变量和函数放闭包里了,这样初始化一个animate的时候,对象是干净的,但是缺点就是占用内存多了,每个实例都维护自己的方法。
使用的时候,可以不提供options.from,函数会根据额options.to来计算from中对应样式的值,这很大程度上依赖于mixin提供的方法够不够强大,所以这一块还是有bug 的,不过,80%的功能够用了。麻雀虽小,五脏俱全了。
Javascript 相关文章推荐
javascript实现仿银行密码输入框效果的代码
Dec 13 Javascript
javascript 构建一个xmlhttp对象池合理创建和使用xmlhttp对象
Jan 15 Javascript
jquery select 设置默认选中的示例代码
Feb 07 Javascript
javascript实现了照片拖拽点击置顶的照片墙代码
Apr 03 Javascript
js实现input框文字动态变换显示效果
Aug 19 Javascript
Bootstrap每天必学之附加导航(Affix)插件
Apr 25 Javascript
js设置随机切换背景图片的简单实例
Nov 12 Javascript
JS实现的集合去重,交集,并集,差集功能示例
Mar 13 Javascript
详解基于vue的服务端渲染框架NUXT
Jun 20 Javascript
详解可以用在VS Code中的正则表达式小技巧
May 14 Javascript
Vue-CLI 3 scp2自动部署项目至服务器的方法
Jul 24 Javascript
在vue中实现echarts随窗体变化
Jul 27 Javascript
基于jquery的textarea发布框限制文字字数输入(添加中文识别)
Feb 16 #Javascript
js URL参数的拼接方法比较
Feb 15 #Javascript
javascript题目,重写函数让其无限相加
Feb 15 #Javascript
用JQUERY增删元素的代码
Feb 14 #Javascript
修改jQuery Validation里默认的验证方法
Feb 14 #Javascript
利用jquery的获取JS文件中的字符串内容
Feb 14 #Javascript
js 金额文本框实现代码
Feb 14 #Javascript
You might like
PHP 5.0对象模型深度探索之属性和方法
2008/03/27 PHP
php数据库连接时容易出错的特殊符号问题
2010/09/01 PHP
Firefox下提示illegal character并出现乱码的原因
2010/03/25 Javascript
jquery isType() 类型判断代码
2011/02/14 Javascript
15个款优秀的 jQuery 图片特效插件推荐
2011/11/21 Javascript
IE不支持getElementsByClassName最终完美解决方案
2012/12/17 Javascript
提高jQuery性能的十个诀窍
2013/11/14 Javascript
Jquery 实现checkbox全选方法
2015/01/28 Javascript
jquery分割字符串的方法
2015/06/24 Javascript
JS设置cookie、读取cookie
2016/02/24 Javascript
Node.js返回JSONP详解
2016/05/18 Javascript
分享JS数组求和与求最大值的方法
2016/08/11 Javascript
js实现把图片的绝对路径转为base64字符串、blob对象再上传
2016/12/29 Javascript
Vue按需加载的具体实现
2017/12/02 Javascript
关于react中组件通信的几种方式详解
2017/12/10 Javascript
webpack打包多页面的方法
2018/11/30 Javascript
详解小程序中h5页面onShow实现及跨页面通信方案
2019/05/30 Javascript
Vue指令实现OutClick的示例
2020/11/16 Javascript
利用Vue实现简易播放器的完整代码
2020/12/30 Vue.js
[01:30]DOTA2上海特锦赛现场采访 Loda倾情献唱
2016/03/25 DOTA
Python 类的继承实例详解
2017/03/25 Python
Python实现爬虫设置代理IP和伪装成浏览器的方法分享
2018/05/07 Python
用python 实现在不确定行数情况下多行输入方法
2019/01/28 Python
python中的协程深入理解
2019/06/10 Python
python logging日志模块原理及操作解析
2019/10/12 Python
利用Python将图片中扭曲矩形的复原
2020/09/07 Python
HTML5通过调用canvas对象的getContext()方法来获取绘图环境
2014/06/23 HTML / CSS
main 函数执行以前,还会执行什么代码
2013/04/17 面试题
中科创达面试题
2016/12/28 面试题
教学器材管理制度
2014/01/26 职场文书
办公自动化专业大学生职业规划书
2014/03/06 职场文书
2014年党课学习心得体会
2014/07/08 职场文书
机械专业毕业生自我鉴定2014
2014/10/04 职场文书
小学生毕业评语
2014/12/26 职场文书
商业计划书如何写?关键问题有哪些?
2019/07/11 职场文书
如何解决.cuda()加载用时很长的问题
2021/05/24 Python