jQuery animate 是 jQuery 中常用的动画效果方法,它可以让元素在一定时间内实现平滑过渡。
jQuery animate 的底层实现原理是通过定时器 setInterval 不断的修改元素的 CSS 属性,从而实现动画效果。
接下来我们来看一下 jQuery animate 的源码实现:
jQuery.fn.animate = function( prop, speed, easing, callback ) { var empty = jQuery.isEmptyObject( prop ), optall = jQuery.speed( speed, easing, callback ), // 默认动画选项 doAnimation = function() { // 空对象不执行动画 if ( empty ) { optall.complete.call( this ); return; } var animationData = jQuery.Animation( this, jQuery.extend( {}, prop ), optall ), endEvent = "animationend webkitAnimationEnd oAnimationEnd MSAnimationEnd", $this = $( this ); animationData.done = optall.complete; if ( optall.queue === false ) { $this.off( endEvent ); animationData.run( 1 ); } else { $this.queue( optall.queue, function( next ) { $this.off( endEvent ); animationData.run( 1 ); next(); }); } }; return empty || optall.queue === false ? doAnimation.call( this ) : this.queue( optall.queue, doAnimation ); };
在这段代码中,我们可以看到首先通过 jQuery.isEmptyObject 判断属性对象 prop 是否为空;如果不为空则通过 jQuery.Animation 方法创建动画对象 animationData ,并将动画完成后的回调函数 optall.complete 赋值给 animationData.done。
接下来通过判断 optall.queue 是否为 false 来决定动画执行方式:如果为 false,则直接执行动画,否则将动画函数 doAnimation 加入到事件队列中。
最后通过一个 endEvent 事件来监听动画结束的时机,并在动画结束后执行回调函数。