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 相关文章推荐
基于JQuery框架的AJAX实例代码
Nov 03 Javascript
JavaScript高级程序设计(第3版)学习笔记4 js运算符和操作符
Oct 11 Javascript
javascript操作select元素实例分析
Mar 27 Javascript
jquery实现具有嵌套功能的选项卡
Feb 12 Javascript
Web性能优化系列 10个提升JavaScript性能的技巧
Sep 27 Javascript
jquery popupDialog 使用 加载jsp页面的方法
Oct 25 Javascript
vuejs2.0运用原生js实现简单的拖拽元素功能示例
Feb 24 Javascript
原生js简单实现放大镜特效
May 16 Javascript
使用Vue.js和Flask来构建一个单页的App的示例
Mar 21 Javascript
Node.js中的不安全跳转如何防御详解
Oct 21 Javascript
微信小程序实现类似微信点击语音播放效果
Mar 30 Javascript
Ajax异步刷新功能及简单案例
Nov 20 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常用代码大全(新手入门必备)
2010/06/29 PHP
PHP 中检查或过滤IP地址的实现代码
2011/11/27 PHP
php实现利用phpexcel导出数据
2013/08/24 PHP
PHP实现支持SSL连接的SMTP邮件发送类
2015/03/05 PHP
laravel 实现根据字段不同值做不同查询
2019/10/23 PHP
javascript 流畅动画实现原理
2009/09/08 Javascript
判断ie的两种简单方法
2013/08/12 Javascript
JavaScript动态改变div属性的实现方法
2015/07/22 Javascript
jQuery入门基础知识学习指南
2015/08/14 Javascript
js实现简单的省市县三级联动效果实例
2016/02/18 Javascript
使用Javascript实现选择下拉菜单互移并排序
2016/02/23 Javascript
解析javascript瀑布流原理实现图片滚动加载
2016/03/10 Javascript
webpack学习教程之publicPath路径问题详解
2017/06/17 Javascript
vuejs实现递归树型菜单组件
2018/01/13 Javascript
jQuery实现的页面详情展开收起功能示例
2018/06/11 jQuery
element vue Array数组和Map对象的添加与删除操作
2018/11/14 Javascript
node实现爬虫的几种简易方式
2019/08/22 Javascript
深入理解redux之compose的具体应用
2020/01/12 Javascript
在pycharm中开发vue的方法步骤
2020/03/04 Javascript
python中常用的九种预处理方法分享
2016/09/11 Python
Python解析并读取PDF文件内容的方法
2018/05/08 Python
Python实现的knn算法示例
2018/06/14 Python
python检测文件夹变化,并拷贝有更新的文件到对应目录的方法
2018/10/17 Python
如何更优雅地写python代码
2019/07/02 Python
Django REST framework 单元测试实例解析
2019/11/07 Python
python 控制台单行刷新,多行刷新实例
2020/02/19 Python
巴西补充剂和维生素购物网站:Natue
2019/06/17 全球购物
英国时尚高尔夫服装购物网站:Trendy Golf
2020/01/10 全球购物
餐饮业的创业计划书范文
2013/12/26 职场文书
财会专业毕业生自荐信
2014/07/09 职场文书
九华山导游词
2015/02/03 职场文书
2016年劳模先进事迹材料
2016/02/25 职场文书
公司年会主持词范文!
2019/05/07 职场文书
react中props 的使用及进行限制的方法
2021/04/28 Javascript
centos7安装mysql5.7经验记录
2022/05/02 Servers
Python自动化实战之接口请求的实现
2022/05/30 Python