Heim  >  Artikel  >  Web-Frontend  >  用js实现的模拟jquery的animate自定义动画(2.5K)_jquery

用js实现的模拟jquery的animate自定义动画(2.5K)_jquery

WBOY
WBOYOriginal
2016-05-16 18:22:47950Durchsuche

后来发现还不错。不如继续写下去。
这个版本基本上跟jquery的animate一样了。
我是说效果基本上一样了。(效率还没测试过。);
如果有专业测试人员 帮我测试下。
1:功能说明
  兼容主流浏览器。
1:支持回调函数;
  2:支持级联动画调用;
3:支持delay动画队列延迟;
  4:支持stop停止动画;
5:支持opacity透明度变化;
6:支持+= -= *= /=操作;
7:支持单位操作(px, %);
2:使用说明
jelle(A).animate(B, C, D);
A:需要执行动画的dom元素ID;
B:动画的主要参数传递{key,val,key2,val2};比如{width:'100px',height:'+=100px',opacity:0.5},
opacity--透明度变化 支持+= -= *= /=操作。
C:动画执行用时,以毫秒为单位;[可选 默认500毫秒];
D:回调函数;[可选]
3:方法说明
1:animate()方法
jelle('cc').animate({width:'100px'},300,function(){alert('完成')});// 是 cc 的宽度在300毫秒的时间变化到100px 动画结束 弹出 ‘完成'
2:stop()方法
jelle('cc').stop();//停止正在 cc 对象上播放的动画。
3:delay()方法
jelle('cc').delay(1000).animate({width:'100px'});//cc 的宽度发生变化 将被延迟1秒执行。
我会一直把他完善下去。

复制代码 代码如下:

var jelle = function(id){
var $ = function(id){ return document.getElementById(id); },
elem = $(id),//对象
f = 0, _this = {}, lazy = 10, lazyque = 10,// f动画计数器 lazy动画延迟 lazyque队列延迟
// 算子你可以改变他来让你的动画不一样
tween = function(t, b, c, d){ return - c * (t /= d) * (t - 2) + b},
// adv 用于+= -= *= /=操作
adv = function(val, b){
var va, re= /^([+-\\*\/]=)([-]?[\d.]+)/ ;
if (re.test(val)){
var reg = val.match(re);
reg[2] = parseFloat(reg[2]);
switch ( reg[1] ){
case '+=':
va = reg[2];
break;
case '-=':
va = -reg[2];
break;
case '*=':
va = b*reg[2] - b;
break;
case '/=':
va = b/reg[2] - b;
break;
}
return va;
}
return parseFloat(val) - b;
}
// elem.animate 读取用于当前dom元素上的动画队列
elem.animate = elem.animate || [];
//stop 功能要使用的
jelle[id]= {};
jelle[id]['stop'] = true;
//alert(jelle[id]['stop'])
// 统一队列入口 用于方便设置延迟,与停止
_this.entrance = function(fn, ags, lazytime){
//fn 调用函数 ags 参数 lazytime 延迟时间
setTimeout(function(){
fn(ags[0], ags[1], ags[2]);
}, (lazytime || 0));
}
// 停止动画 此方法还不能用
_this.stop = function(){
jelle[id]['stop'] = false;
elem.animate.length=0;
$(id).animate.length=0;
return _this;
}
// 队列操作
_this.queue = function(){
if (elem.animate && ++f == elem.animate[0].length){
f = 0;// 清空计数器
elem.animate[0].callback ? elem.animate[0].callback.apply(elem) : false;
// 判断是否有动画在等待执行
if (elem.animate.length > 1){
elem.animate[0].callback = elem.animate[1].callback;
elem.animate = $(id).animate || [];// 从dom对象上获取最新动画队列
elem.animate.shift();// 清除刚执行完的动画队列
$(id).animate = elem.animate;// 把新的队列更新到dom
var ea = elem.animate[0];
// 循环播放队列动画
for(var i = 0; i ea[i][0] === 'opacity' ? _this.entrance(_this.alpha, [ea[i][1], ea[i][2]], lazyque):
_this.entrance(_this.execution, [ea[i][0], ea[i][1], ea[i][2]], lazyque);
}
}else{
elem.animate.length = 0; // 队列清楚
$(id).animate.length = 0; // 队列清楚
}
}
}
//设置lazy方法,以后的队列动画延迟时间
_this.delay = function(val){
lazyque = val;
return _this;
}
//动画变化
_this.execution = function(key, val, t){
//alert(val)
var s = (new Date()).getTime(), d=t || 500 ,
b = parseFloat(elem.style[key]) || 0 ,
c = adv(val, b) ,// adv用于设置高级操作比如 += -= 等等
un = val.match(/\d+(.+)/)[1];// 单位
(function(){
var t = (new Date()).getTime() - s;
if (t > d){
t = d;
elem.style[key] = parseInt(tween(t, b, c, d)) + un;
_this.queue(); // 操作队列
return _this;
}
elem.style[key] = parseInt(tween(t, b, c, d)) + un;
jelle[id]['stop'] && setTimeout(arguments.callee, lazy);
// _this.entrance(arguments.callee,[1,1,1],lazy);
// arguments.callee 匿名函数递归调用
})();
}
// 入口
_this.animate = function(sty, t, fn){
// sty,t,fn 分别为 变化的参数key,val形式,动画用时,回调函数
var len = elem.animate.length;// len查看动画队列长度
elem.animate[len] = [];
elem.animate[len].callback = fn;
//多key 循环设置变化
for(var i in sty){
elem.animate[len].push([i, sty[i], t]);
if(len == 0){
i == 'opacity' ? _this.entrance(_this.alpha, [sty[i], t], lazyque) :
_this.entrance(_this.execution, [i, sty[i], t], lazyque);
}
}
$(id).animate = elem.animate;//把新的动画队列添加到dom元素上
return _this;
}
// 透明度变化的代码
_this.alpha = function(val, t){
var s = (new Date()).getTime(),
d = t || 500, b, c;
if( document.defaultView ){
b = document.defaultView.getComputedStyle(elem,null)['opacity'] || 1,
c = adv(val,b) * 100;
(function(){
var t = (new Date()).getTime() - s;
if(t > d){
t = d;
elem.style['opacity'] = tween(t, (100 * b), c, d) / 100;
_this.queue(); // 队列控制
return _this;
}
elem.style['opacity'] = tween(t, (100 * b), c, d) / 100;
jelle[id]['stop'] && setTimeout(arguments.callee, lazy);
})()
}else{
b = elem.currentStyle['filter'] ?
(elem.currentStyle['filter'].match(/^alpha\(opacity=([\d\.]+)\)$/))[1]/100 : 1;
c = adv(val, b) * 100;
(function(){
var t = (new Date()).getTime() - s;
if (t > d){
t = d;
elem.style['filter']='alpha(opacity='+ tween(t, (100 * b), c, d) +')';
_this.queue(); // 队列控制
return _this;
}
elem.style['filter'] = 'alpha(opacity='+ tween(t, (100*b) , c, d) +')';
jelle[id]['stop'] && setTimeout(arguments.callee, lazy);
})()
}
}
return _this;
}


代码打包下载

程序可能每天都在修改。如果想要最新的ainimate 可以email联系我。

上面的代码已经不是最新的了。

这两天又修正了几个错误的地方。
本文来自博客园 jelle 博客 http://www.cnblogs.com/idche/
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn