动画队列

队列

  • 队列的本质是一个数组,对队列的理解先从数组的push和shift开始。push是从数组尾端插入新的元素,shift是从数组首端删除元素;分别对应队列中得queue和dequeue。
  • jquery所有动画基于animate方法,而animate的动画默认保存在名为fx的动画队列中。
  • queue就是将动画放进队列中,dequeue就是将动画从队列中删除并执行它。

jQuery : queue() 方法

queue() 方法显示或操作在匹配元素上执行的函数队列

.queue(queueName,newQueue)

queueName 可选。字符串值,包含序列的名称。默认是 fx, 标准的效果序列。
每个元素均可拥有一到多个由 jQuery 添加的函数队列。在大多数应用程序中,只使用一个队列(名为 fx)。

动画队列

队列运行在元素上异步地调用动作序列,而不会终止程序执行。典型例子时调用元素上的多个动画方法。例如:

$('#foo').slideUp()
         .fadeIn();

它的执行顺序是元素先slideUp后再fadeIn,slideUp和fadeIn有先后顺序。jquery会默认地将它们放进名为fx的队列中,我们可以这样认为:

var fx = [slideUp, fadeIn];

//相当于
$('#foo').queue('fx', fx);

//第一步:出列第一个元素slideUp并执行它
$('#foo').dequeue('fx');    //fx = ['inprogress', fadeIn]

//第二步:出列第二个元素fadeIn并执行它
$('#foo').dequeue('fx');    //fx = ['inprogress']

//第三步,队列fx为空,动画执行完毕
fx = [];

通过不断的dequeue,fx每个元素逐个依次出列执行,直至队列没有元素。
也可以这样理解

$box.hide(1000, function(){
   $box.show(1000, function(){
     $box.fadeOut('slow',function(){
       $box.fadeIn('slow',function(){
         $box.slideUp(function(){
           $box.slideDown(function(){
             console.log('动画执行完毕')
           })
         })
       })
     })
   })
})
//等价于
$box.hide(1000)
    .show(1000)
    .fadeOut()
    .fadeIn()
    .slideUp()
    .slideDown(function(){
      console.log('真的完毕了')
    })

注意:

  • 当通过 .queue() 添加函数时,我们应当确保最终调用了 .dequeue(),这样下一个排队的函数才能执行
  • 当这样写代码时:
  $('#foo').slideUp().fadeIn().css({'width':'200px'});

它的执行顺序是元素宽度马上变成200px的同时,slideUp也在执行,slideUp执行完后再执行fadeIn

自定义动画

简单的动画不能满足需求的时候,jquery提供了自定义动画行为的方法

.animate( properties [, duration ] [, easing ] [, complete ] )

properties是一个CSS属性和值的对象,动画将根据这组对象移动。

$('#btn').click(function() {
  $('#foo').animate({
    opacity: 0.25,
    left: '+=50',
  }, 5000, function() {
    console.log('执行完毕')
  });
});

.clearQueue

清除动画队列中未执行的动画

.finish

停止当前动画,并清除动画队列中所有未完成的动画,最终展示动画队列最后一帧的最终状态

.stop( [clearQueue ] [, jumpToEnd ] )

停止当前正在运行的动画
clearQueue(default: false)
jumpToEnd(default: false)

    $('#btn6').click(function(){
      //停止当前动画
      $('.box').stop()
    })
    $('#btn7').click(function(){
      //停止当前动画,并清除未执行的动画队列
      $('.box').stop(true, false)
    })
    $('#btn8').click(function(){
      //停止当前动画,并清除未执行的动画队列,并且当前动画展示最终状态
      $('.box').stop(true, true)
    })
    $('#btn9').click(function(){
      //停止当前动画,并清除未执行的动画队列,并且当前动画展示最终状态
      $('.box').finish()
    })

你可能感兴趣的:(动画队列)