对于 jQuery 的动画的设计我们要分 2 个层面理解:
动画的源码:
animate: function(prop, speed, easing, callback) { doAnimation = function() { var anim = Animation(this, args, optall); }; this.queue(optall.queue, doAnimation); }
这个代码缩减了,但是我们上面提到的最重要的 2 点这里都涉及到了:通过 queue 调度动画的之间的衔接,Animation 方法执行单个动画的封装。
jQuery 在 queue 的调度上涉及了一个关键的处理:同步与异步代码同时执行,同步收集动画序列,异步调用序列,看看整个调用的流程是这样的:
以上是整个动画的调度一个流程,其实都是利用队列异步的空闲然后执行同步的代码,这样在处理上是没有浪费资源的,而且精确度也是最高的。
<!doctype html> <html> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8"/> <script src="http://code.jquery.com/jquery-latest.js"></script> <title>动画结构</title> </head> <body> <div id="clickme"></div> <img id="book" alt="" width="100" height="123" style="position: relative; left: 10px;background:red" /> <script type="text/javascript"> var book = $('#book'); function animate() { book.animate({ opacity: 0.25, left: '+=50', height: 'toggle' }, { duration: 1000, step: function(now, fx) { var data = fx.elem.id + ' ' + fx.prop + ': ' + now; console.log(data) // $('body').append('<div>' + data + '</div>'); }, progress: function() { console.log('progress') }, complete: function() { console.log('动画完成') } }).animate({ opacity: 1, left: '-=50', height: 'toggle' }, { duration: 1000, step: function(now, fx) { var data = fx.elem.id + ' ' + fx.prop + ': ' + now; console.log(data) // $('body').append('<div>' + data + '</div>'); }, progress: function() { console.log('progress') }, complete: function() { console.log('动画完成') animate(); } }) } animate(); </script> </body> </html>