jQuery的缓动函数不给力,既然要写,先把需求列好:
1. 动画类型有:linear, easeIn, easeOut, easeInOut
2. 可以在缓动过程中改变属性,也可以是调用函数,并改变函数的参数(后者是我的初衷,jq只支持属性 )
动画是怎样产生的?学过Flash的人应该知道帧,帧就是一个画面,通常一秒25帧,也就一秒播放25个画面,如此快速的放过去,静态也成了动态(当然,前提是25个画面不是同一个画面,囧。。。)
难道做动画要画N多图,好吧,这叫“逐帧动画”,如果你很闲大可以这么干,因为这样做的效果绝对是顶级的,毫无瑕疵的。但是我一点都不闲,我画画的水平连幼儿园都教不了,所以这条路可以直接枪毙。
接下来进入正题,Flash中还有关键帧的概念,举个例子,关键帧A,物体box的宽高为100,关键帧B,box的宽高为50,A与B之间有25帧,接着我们从A播放到B,效果就是box在1秒内不断缩小,这叫“补间动画”。
这里涉及到三个东西:动画对象(box),动画属性(width, height),动画时间(1秒)
我们要做的事就是在某个时间点确定动画属性的值
常见的动画有四种类型,介绍一下:
linear:线性动画,即匀速
easeIn:速度从小到大,即淡入
easeOut :速度从大到小,即淡出
easeInOut:开始时速度从小到大,结束时速度从大到小,即淡入淡出
====================下面这段爱看不看,估计看着挺无聊的===========================
其实说到缓动,就不得不提Robert Penner,他发明了N多缓动公式,举个例子
我还是解释一下吧:
设当前变化量为X,则
t / d = X / c,所以X = c * t / d,然后X + b就可以获得当前属性值
再看一个稍复杂的:
这个有淡入效果,也就是说动画开始时,值的变化量从小到大。
可以发现两者唯一的区别就是 t / d 和 (t /= d) * t,刚才说了t / d是一个>=0 && <=1的比值,暂取名为a,而(t /= d) * t就相当于Math.pow(a, 2)。
为什么要平方呢?
1. 首先a >= Math.pow(a, 2)是肯定的
2. 每次调用函数时,t / d 这个比值也是匀速变大的,比如第1次调用时是0.1(平方0.01),第2次调用时是0.2(平方0.04)等,那第10次调用时,肯定是1没错吧,这时候 c * 1 + b,动画就到此结束了
3. 第2点证明了比值越小,值的变化量就越小,比值越大,值的变化量就越大,如果不用平方而是三次方,那淡入效果就更明显了。
举个两个例子,可以看出一些规律,公式大体便是 当前属性值 = 总变化量 * 增量系数 + 初始值, 其中,增量系数根据不同算法各有不同。
====================继续往下看吧===========================
增量系数的算法,必须收藏啊!!
你会发现有Quad,Cubic,Quart之类的字眼,这些到底是啥意思呢,这里我给出Flash的Tweener 官方文档,一看便知了(如果下面是空白,表示在缓冲,为了看到这么好的演示,耐心等会吧)
根据上述知识点,我的动画函数便出炉了