Mootools Fx小议

其实谈不上什么"小议", 有空的时候看看Mootools的源码,觉得Fx动画类的实现确实很妙,Fx的本质就是对一个数值量进行控制, 通过Fx.Transition扩展的曲线函数来确定数值变化的速度. 这一原理作用到DOM元素的style属性上, 就出现了让人兴奋的animation效果. Fx的源码并不难理解, 而且方法很清晰, 一开始看的时候, 觉得Fx的set方法有点奇怪:

set: function(now){
    return now;
}

 总想找到类似:

this.now...

 这样的代码, 觉得Fx的实例应该有个属性来记录当前的变化的值, 又看到其step中的用法:

step: function(now){
		if (this.options.frameSkip){
			var diff = (this.time != null) ? (now - this.time) : 0, frames = diff / this.frameInterval;
			this.time = now;
			this.frame += frames;
		} else {
			this.frame++;
		}

		if (this.frame < this.frames){
			var delta = this.transition(this.frame / this.frames);
			this.set(this.compute(this.from, this.to, delta));
		} else {
			this.frame = this.frames;
			this.set(this.compute(this.from, this.to, 1));
			this.stop();
		}
	}

 很容易看出来:

this.compute(this.from, this.to, delta)

 此语句返回当前变化的值. 再稍微一想(比如Fx.Tween的实现), set方法最终要override才有意义. 基于这样的原理我自己写了个NumFx, 实现一个范围内数字的变化:

输出效果很有意思, 你可以明显的感受到数字变化的速度, 我们通过覆写set方法, 在实例每步调用step方法的过程中通过set来更新当前的值, 通过覆写step方法,增加了自定义事件step的触发.这样页面上就能实时的反应结果了.

最后,我想说:mootools, more than awesome! 欢迎讨论 : )

posted @ 2012-02-08 21:43  MrPrime  阅读(528)  评论(0编辑  收藏  举报