在动画算法与设计的小节中我都把动画一些相关的东西单独提出来分析了,其实 jQuery 的动画的原理就是这样的,这一节我们把设计与算法融合在一起来实现一个伪 jQuery 的动画模块。
在 jQuery 的设计中 ready、ajax、动画都是支持 Promise 这个概念的,也就是通过 Deferred 提供了一个抽象的非阻塞的解决方案,它创建一个 promise 对象,其目的是在未来某个时间点返回一个响应,对应的也就是 done、fail、progress、complete、always等方法,所以在第一部分理解 Deferred 对象是非常重要的,这样才能读懂这类设计。
具体的代码我们可以如右图所示,这里我们开始解释下其设计的目的。
book.animate({ left: '500' }, { duration: 2000 })
就这个动画而言,我们要涉及几个问题,left:500 其实是最终的坐标值。
那么完成这个 left 动画我们至少需要:
每一种属性其实都是有各自的变换的一个算法,包括计算开始值、变化值、时间等等,所以我们必须给每一个变换的属性都进行一个包装,用来封装各自的相关数据,那么我们其实可以用一个类来构造跟属性变化相关的一些信息,如 Tween 类。
通过一个 Tween 类构造出来的缓动对象,其实就是针对每一个属性的封装对象,这样我们只需要设计一个定时器,在指定的时间内调用 Tween 生成的这些对象就可以了,Tween 内部控制着各自属性的状态改变。
具体右边的实现代码涉及了如下几个部分了:
其实动画的整个设计就是这么简单的,代码的复杂是因为还兼容了各种不同情况的处理,比如实现 deferred 机制,针对宽高变化的 overflow 处理,针对 display 为 inline 情况下的处理,那么这些都是一些预处理的机制,在对应的 defaultPrefilter 函数中就能找到,我们没有必要是单独实现了。
其实动画的设计,我们可以学到一个很重要的一点: 封装变化,把每一个属性变化都独立封装一个对象,让其自己管理与控制。
请验证,完成请求
由于请求次数过多,请先验证,完成再次请求
打开微信扫码自动绑定
绑定后可得到
使用 Ctrl+D 可将课程添加到书签
举报
目前暂无任何问答
实战
实战
实战
实战
实战