搜索

首页  >  问答  >  正文

javascript - jquery动画队列的自动添加和执行

$(function() {
    $('#btn').click(function(){
      $(".test").animate({width:'+=256'},2500);
      $(".test").animate({height:'+=256'},2500);
      $(".test").queue(function(){ 
          $(this).css({'backgroundColor':'black'});
          // $(this).dequeue(); //顺利执行
      });
      $(".test").dequeue(); 
      $(".test").animate({width:'-=256'},2500);
      $(".test").animate({height:'-=256'},2500);
    });
  });

上面的代码会让前两个动画并行执行, 后续的动画却不会.

由此引发了我的两个问题:

  1. 一个动画包括了进入队列和动画执行两个步骤. 诸如$(".test").animate({width:'+=256'},2500);这样添加的动画, 是先把所有的动画添加到动画队列, 再执行吗?
    可不可以理解为$(".test").animate({width:'+=256'},2500);这行代码只是为动画队列添加了一个动画, 而并不是执行这个动画? 那这个动画的执行又是在哪一步实现的?

  2. 动画队列都是无阻塞的, 而为队列添加函数(.queue方法)并不是一个动画, 为什么没有提前添加到动画队列中, 而是等前两个动画都执行完了才添加.

问题描述得有点逻辑不清晰, 等我继续思考一下怎么把他描述清楚, 望能大概理解我意思的大神不嫌弃解答一下, 谢谢!

巴扎黑巴扎黑2834 天前676

全部回复(2)我来回复

  • 高洛峰

    高洛峰2017-04-11 12:10:36

    按手册说的,animate如果不指定queue参数的话,默认值是true,就是统一把效果加到默认的“fx”队列里(实体引用是 $.fx );queue传的参数如果是function的话就是callback,相当于在动画队列的末尾加了个回调,所以才会在最后执行(如果是array的话就是显式构造动画队列);dequeue的作用是取出动画队列里的东西并执行,所以它才是动画队列执行的关键。
    平时一般都喜欢用velocity写动画,jQ的动画其实不怎么碰……
    手机换电脑了,补充点代码:

    //如果是在 $.fx 队列的中间插东西
    $(function() {
        $('#btn').click(function() {
            $(".test")
                .animate({width:'+=256'},2500)
                .animate({height:'+=256'},2500)
                .queue(function(next) { 
                    $(this).css({'backgroundColor':'black'});
                    next(); //继续往后执行
                })
                .animate({width:'-=256'},2500)
                .animate({height:'-=256'},2500);
         });
    });
    //如果是在 $.fx 队列的末尾加回调
    $(function() {
        $('#btn').click(function() {
            $(".test")
                .animate({width:'+=256'},2500)
                .animate({height:'+=256'},2500)
                .animate({width:'-=256'},2500)
                .animate({height:'-=256'},2500)
                .queue(function() { 
                    $(this).css({'backgroundColor':'black'});
                    $(this).dequeue();
                });
         });
    });
    //如果某一步动画想和上一步并发执行
    $(function() {
        $('#btn').click(function() {
            $(".test")
                .animate({width:'+=256'},2500)
                .animate({height:'+=256'},2500)
                .animate({width:'-=256'},{duration:2500,queue:false}) //并发执行
                .animate({height:'-=256'},2500);
         });
    })

    另外手册可以参考这里: http://www.jquery123.com/

    回复
    0
  • PHPz

    PHPz2017-04-11 12:10:36

    个人理解,那不是动画队列,叫函数队列,这样楼主应该懂了吧?

    http://www.w3school.com.cn/jq...

    http://www.tuicool.com/articl...

    回复
    0
  • 取消回复