jQuery - 在单个函数上循环多个动画/创建动画数组,以便每个动画都不同,然后重新开始

jQuery - cycle through multiple animations on single function / create array of animations so every animation is different and then it starts over

每次在单个函数上出现动画时,我都需要有多个动画循环或随机变化。

目前有淡入淡出,我想要循环播放,例如淡入淡出、切换、动画等

这是我的代码,我需要它用于:

var items = $(".items").on("click", "div", function() {
    var not = $.map($(".items div").not(this), function(el) {
      return $(el).index(".items div")
    });
    var next = not[Math.floor(Math.random() * not.length)];
    var index = $(this).index(".items div"); 
    var elems = $(">div", items).toArray();
    [elems[next], elems[index]] = [elems[index], elems[next]];
  $(this).add(items.find("div").eq(next)).fadeTo(600, 0, function() {
    items.html(elems).find("div").fadeTo(600, 1)
  });
});

我在任何地方都找不到关于这个的任何信息,但我看到它被用在一些脚本中,非常感谢你的想法

初始版本更简单,但由于交换的效果回调被调用两次而略有错误。新版本在底部:

JSFiddle: https://jsfiddle.net/TrueBlueAussie/w8cmvu1m/5/

在此示例中,转换使用 .then()

排队
$(function() {

  // Swap the html of two elements
  var swap = function($elements) {
    var val = $elements.eq(0).html();
    $elements.eq(0).html($elements.eq(1).html());
    $elements.eq(1).html(val);
  };

  // Array of effects functions - each takes 2 jQuery elements and swaps the values while not visible
  // Each returns a promise that resolves once the animation has completed
  var effects = [
    // fade in/out
    function($elements) {
      return $elements.fadeOut(function() {
        swap($elements);
      }).fadeIn().promise();
    },
    // Animate
    function($elements) {
      return $elements.slideUp(function() {
        swap($elements);
      }).slideDown().promise();
    }
  ];

  // Start with a resolved promise
  var promise = $.when();

  // Delegated handler for click on items
  $(document).on("click", ".items div", function() {
    // All items except this one
    var $item = $(this);
    var $notThis = $(".items div").not($item);

    // Randomly choose another item
    var $other = $notThis.eq(Math.floor(Math.random() * $notThis.length));

    // Randomly choose an effect
    var effect = Math.floor(Math.random() * effects.length);
    promise = promise.then(effects[effect]($item.add($other)));
  });
  var interval = setInterval(function() {
    var $items = $('.items div');
    $items.eq(Math.floor(Math.random() * $items.length)).click()
  }, 3000);
});

已更新:https://jsfiddle.net/TrueBlueAussie/w8cmvu1m/6/

我使用 deferreds 和 promises 纠正了双重回调问题,但对解决方案不满意:

  var effects = [
    // fade in/out
    function($elements) {
        var def = $.Deferred();
      $elements.fadeOut(500).promise().always(function() {
        swap($elements);
        $elements.fadeIn(500).promise().always(function(){
            def.resolve();
        });
      });
      return def.promise();
    },
    // Animate
    function($elements) {
        var def = $.Deferred();
      $elements.slideUp(500).promise().always(function() {
        swap($elements);
        $elements.slideDown(500).promise().always(function(){
            def.resolve();
        });
      });
      return def.promise();
    }
  ];