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 连续列表实现代码
Dec 21 Javascript
js sort 二维数组排序的用法小结
Jan 24 Javascript
jQuery实现按键盘方向键翻页特效
Mar 18 Javascript
Node.js巧妙实现Web应用代码热更新
Oct 22 Javascript
JavaScript中如何使用cookie实现记住密码功能及cookie相关函数介绍
Nov 10 Javascript
Angular.JS中的指令引用template与指令当做属性详解
Mar 30 Javascript
inner join 内联与left join 左联的实例代码
Sep 18 Javascript
微信小程序视图容器(swiper)组件创建轮播图
Jun 19 Javascript
jQuery实现数字自动增加或者减少的动画效果示例
Dec 11 jQuery
Angular6 发送手机验证码按钮倒计时效果实现方法
Jan 08 Javascript
Vue组件的使用及个人理解与介绍
Feb 09 Javascript
基于vue实现web端超大数据量表格的卡顿解决
Apr 02 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
分页显示Oracle数据库记录的类之二
2006/10/09 PHP
php入门学习知识点三 PHP上传
2011/07/14 PHP
php+mysql+ajax实现单表多字段多关键词查询的方法
2017/04/15 PHP
给页面渲染时间加速 干掉Dom Level 0 Event
2012/12/19 Javascript
Javascript基础教程之argument 详解
2015/01/18 Javascript
jQuery插件之jQuery.Form.js用法实例分析(附demo示例源码)
2016/01/04 Javascript
Javascript中匿名函数的调用与写法实例详解(多种)
2016/01/26 Javascript
javascript实现在网页中运行本地程序的方法
2016/02/03 Javascript
JS实现仿PS的调色板效果完整实例
2016/12/21 Javascript
微信小程序封装http访问网络库实例代码
2017/05/24 Javascript
Vue非父子组件通信详解
2017/06/12 Javascript
详解vue.js移动端导航navigationbar的封装
2017/07/05 Javascript
浅谈在vue中使用mint-ui swipe遇到的问题
2018/09/27 Javascript
CentOS7中源码编译安装NodeJS的完整步骤
2018/10/13 NodeJs
webpack安装配置与常见使用过程详解(结合vue)
2020/06/01 Javascript
[29:59]完美世界DOTA2联赛PWL S3 Forest vs access 第二场 12.11
2020/12/13 DOTA
python实现的各种排序算法代码
2013/03/04 Python
初步认识Python中的列表与位运算符
2015/10/12 Python
Python魔法方法功能与用法简介
2019/04/04 Python
python面向对象实现名片管理系统文件版
2019/04/26 Python
python中利用matplotlib读取灰度图的例子
2019/12/07 Python
python批量替换文件名中的共同字符实例
2020/03/05 Python
MATLAB数学建模之画图汇总
2020/07/16 Python
HTML5使用drawImage()方法绘制图像
2014/06/23 HTML / CSS
C#软件工程师英语面试题
2015/06/07 面试题
十八届三中全会感言
2014/03/10 职场文书
初中生期末评语大全
2014/04/24 职场文书
参赛口号
2014/06/16 职场文书
中学生关于梦想的演讲稿
2014/08/22 职场文书
上班离岗检讨书
2014/09/10 职场文书
教师节慰问信
2015/02/15 职场文书
2019运动会广播加油稿汇总
2019/08/21 职场文书
HR必备:销售经理聘用合同范本
2019/08/21 职场文书
前端学习——JavaScript原生实现购物车案例
2021/03/31 Javascript
Android Canvas绘制文字横纵向对齐
2022/06/05 Java/Android
MySQL约束(创建表时的各种条件说明)
2022/06/21 MySQL