Как мне создать этот цикл кода?

#jquery #loops #callback #setinterval

#jquery #циклы #обратный вызов #setinterval

Вопрос:

Я хотел бы знать, как создать приведенный ниже цикл кода, я знаю, что мне нужен какой-то обратный вызов / setInterval, но как мне это реализовать? Большое спасибо!

 $('.1').fadeIn(2500, function() {
    $('.2').fadeIn(2500, function() {
        $('.3').fadeIn(2500, function() {
            $('.3').fadeOut(2500, function() {
                $('.2').fadeOut(2500, function() {
                    $('.1').fadeOut(2500, function() {
                    });
                });
            });
        });
    });
});
  

P.S. Этот код выполняется в готовом документе

Ответ №1:

Основываясь на комментариях OP, это должен быть бесконечный цикл затухания при выходе. Попробуйте следующее

 (function () {
  var all = [1, 2, 3];
  var rev = all.reverse();

  var doFadeOut = function (index) {
    $('.'   rev[index]).fadeOut(2500, function () {
      index  ;
      if (index < rev.length) {
        doFadeOut(index);
      } else {
        doFadeIn(0);
      }
    });
  };

  var doFadeIn = function (index) {
    $('.'   all[index]).fadeIn(2500, function () {
      index  ;
      if (index < all.length) {
        doFadeIn(index);
      } else {
        doFadeOut(0);
      }
    });
  };

  doFadeIn(0);
})();
  

Комментарии:

1. Гораздо лучший шаблон. Глубоко вложенный анимационный код — плохая идея.

2. Спасибо за отличный ответ, хотя он не делал того, что я хотел (анимация не была бесцветной, я думаю, пропускает затухание в конце), я знаю, что моя вложенность была плохой практикой, но она сработала для того, что я хотел, и мой код будет использоваться только как одноразовый.

3. @Luke: Я немного опаздываю на вечеринку, и мой ответ не совсем серьезен, но он работает, и анимация плавная. 😉

Ответ №2:

Просто поместите все это в функцию, а затем вызовите саму эту функцию:

 function doFade(){
$('.1').fadeIn(2500, function() {
    $('.2').fadeIn(2500, function() {
        $('.3').fadeIn(2500, function() {
            $('.3').fadeOut(2500, function() {
                $('.2').fadeOut(2500, function() {
                    $('.1').fadeOut(2500, function() {
                         doFade()
                    });
                });
            });
        });
    });
});
}
  

Комментарии:

1. Я не понимаю вопроса. Разве вы не сделали бы то же самое, что и при наличии 3, за исключением того, что вы бы добавили / убрали еще 3 элемента

2. Это то, что мне нужно быстро собрать, я только на начальном уровне. Я попробую это, спасибо.

3. @maxedison: Я говорю, что это решение вообще не масштабируется. Если у вас есть 100 элементов, вам придется вручную ввести все это.

4. Это сработало просто отлично. Я знаю, что вы говорите, и это не очень хорошая практика, но это намного быстрее, и то, что я делаю, требует анимации только для 3 элементов.

5. @Blender — определенно вообще не масштабируется. Но ОП не предполагал, что у него было более 3 элементов или что в будущем это может вырасти до чего-то большего.

Ответ №3:

Извлеките его из document.ready. Создайте собственную функцию и вызовите ее с помощью setInterval или setTimeout в document.ready:

 function myCrazyLoop() {
    $('.1').fadeIn(2500, function() {
        $('.2').fadeIn(2500, function() {
           $('.3').fadeIn(2500, function() {
                $('.3').fadeOut(2500, function() {
                   $('.2').fadeOut(2500, function() {
                       $('.1').fadeOut(2500, function() { });
                   });
                });
           });
        });
    });
}
  

затем в document.ready:

 setInterval('myCrazyLoop()',x); // where x is your interval in miliseconds
  

или
setTimeout(‘myCrazyLoop()’,x); // то же самое …. время ожидания выполняется один раз; интервал, навсегда

Ответ №4:

 (function () {
  var all = [1, 2, 3];
  var rev = all.reverse();

  var doFadeOut = function (index) {
    $('.'   rev[index]).fadeOut(2500, function () {
      index  ;
      if (index < rev.length) {
        doFadeOut(index);
      } else {
        doFadeIn(0);
      }
    });
  };

  var doFadeIn = function (index) {
    $('.'   all[index]).fadeIn(2500, function () {
      index  ;
      if (index < all.length) {
        doFadeIn(index);
      } else {
        doFadeOut(0);
      }
    });
  };

  doFadeIn(0);
})();
  

Для меня выглядит довольно неплохо. только я бы создал массив с помощью jQuery(«classname»).
Не вводите значения жестко, если вы не уверены, что вам никогда не понадобится их изменять.

Комментарии:

1. Разве это не должно быть просто комментарием к моему ответу?

Ответ №5:

Вот способ сделать это, когда вы просто передаете массив имен классов, и он будет циклически перемещаться вверх и вниз по массиву:

 var classNameSequence = ["a", "b", "c", "d", "e", "f"];

function runSequence(sequence) {
    var next = 0;

    function doFadeIn() {
        if (next >= sequence.length) {
            --next;
            doFadeOut();
            return;
        }
        $("."   sequence[next  ]).fadeIn(2500, doFadeIn);
    }

    function doFadeOut() {
        if (next < 0) {
            next = 0;
            doFadeIn();
            return;
        }
        $("."   sequence[next--]).fadeOut(2500, doFadeOut);
    }

    doFadeIn();
}

runSequence(classNameSequence);
  

Вы можете увидеть, как это работает здесь:http://jsfiddle.net/jfriend00/cRZxk /.

Ответ №6:

Черт возьми, вот сумасшедший способ сделать это.

 var cycle = function(selector, timeout) {
    var i = 0, step = 2,
        faders = $(selector).map(function (i, val) {
            return [
                function() { $(val).fadeIn(timeout) },
                function() { $(val).fadeOut(timeout) }
            ];
        }),
        nextStep = function() {
            if ( (i >= faders.length amp;amp; step > 0) || (i <= 0 amp;amp; step < 0) ) {
                step *= -1; i  = step/2;
            }
            faders[i](); i  = step;
            setTimeout(nextStep, timeout);
        };
    nextStep();
};
  

Назовите это как:

 cycle(['.c1', '.c2', '.c3'], 1000);
  

Смотрите демонстрацию на jsFiddle.