[Ctrl+A 全选 注:引入外部Js需再刷新一下页面才能执行]
以上可以支持object和数组selector的功能,暂可以称为【功能一】,
【功能二】
支持回调函数callback,也就是可以实现咱们常说的chain-animate,链式变换。具体是通过onFinish参数来实现的。核心源码很简单,就是在一个变换完毕之后判断有没有onFinish,如果有就调用:
复制代码 代码如下:
var animimg = function () {
var i = -1, o;
while( o = self.tweens[++i] ) {
var cTime = (new Date()).getTime() - o.start;
if (cTime < o.duration) {
for (var k in o.val) {
var m = o.val[k];
o.obj[k] = Math.ceil(o.ease(m.from, m.diff, cTime/o.duration)) + (o.cssMode ? 'px' : 0);
}
} else {
cTime = o.duration;
for (var k in o.val) {
var m = o.val[k];
o.obj[k] = Math.ceil(o.ease(m.from, m.diff, cTime/o.duration)) + (o.cssMode ? 'px' : 0);
}
self.tweens.splice(i, 1);
self.tweensCnt--;
if (o.onFinish) o.onFinish (o.params);
self.stop();
}
if (!o.cssMode) o.obj.onTween();
}
};
下面是通过递归调用实现chain-animate的一个演示:
[Ctrl+A 全选 注:引入外部Js需再刷新一下页面才能执行]
到这里,相信以前做过类似工作的同学们都觉得这还不够,毕竟如果只实现所有和‘盒模型'沾边的属性的变换应该都不算难事。比如高宽,padding,margin,left,top等等这些可以用像素做单位的属性。他们的变换都可以统一起来。但是如果要实现颜色变换,透明度变换呢,恐怕就不是我的短短几十百来行代码就可以做到的。
是的,我承认,要把颜色,透明度等等所有属性变换都封装起来,需要做的判断就不是一点两点了。所以呢,在这里,我也没有对“盒模型”以外的属性变换做封装。但并不代表没有想到他们的实现方法。
既然写死在代码里要费事,那就我们自己调用的时候多写两句代码不就好了吗,毕竟代码是死的,人是活的。我这里做了个cssMode的参数判断(思路是借鉴一个老外的)。代码成本很低。如果不是可以用px做单位的属性,我们可以自己控制它的样式变换。比如实现背景色变换:
复制代码 代码如下:
function test3 (id) {
Hongru.anim(id, {
cssMode: false, // animation will be handled by an external function
onTween : function () {
// custom function, can be as simple or as complex as needed
this.style.background = "RGB("+this.r+","+this.g+","this.b")";
},
from : { r: 0, g: 0, b: 0 },
to: { r: 255, g: 128, b: 100 }
});
}
把cssMode设置为false之后,会执行onTween里的代码,这样就可以自行控制样式的变换了,如上。演示如下:
[Ctrl+A 全选 注:引入外部Js需再刷新一下页面才能执行]
同样,透明度也可以自行设置,
[Ctrl+A 全选 注:引入外部Js需再刷新一下页面才能执行]
好了,鉴于篇幅和时间,此文基本都在介绍功能,对代码没怎么细讲,有兴趣的同学可以自己看看,反正源码也贴出来了,而且原理都不难。
另外,在这个函数使用中,Hongru.kill(id)是停止指定对象的变换。Hongru.reset()是停止所有正在变换的效果。至于Hongru本身,大家可以随意更改。