как заставить анимацию выполняться в бесконечном цикле

#javascript #jquery

#javascript #jquery

Вопрос:

у меня запущен текущий код

MyTry

что я хочу сделать, так это заставить анимацию идти в бесконечном цикле, как это сделать??

я хочу снова вызвать ту же функцию, или я не знаю, что

просто анимация повторяется снова и снова, когда заканчивается последний элемент

 (function($) {
$.fn.fade = function() {
        return this.each(function(index, item) {
            var $this = $(this).siblings();
            $(item).hide().stop();
            if ($(item).index() == $(this).siblings().length - 1) {
                $(item).delay(5000 * index).fadeIn('slow').delay(3500).fadeOut('slow', function() { 
                    /* here is the last element finishing  */
                });

            } else {
                $(item).delay(5000 * index).fadeIn('slow').delay(3500).fadeOut('slow');

            }
        });
    };
    
})(jQuery);
 $('.tst').fade();
  

РЕДАКТИРОВАТЬ: я оставил анимацию запущенной и пришел, чтобы проверить ответы
, поэтому я увидел странное поведение

как это исправить

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

1. В английском языке в начале предложений используются заглавные буквы.

Ответ №1:

Самый простой способ — присвоить функции имя и вызвать ее снова: http://jsfiddle.net/pimvdb/SxTgy/4 /.

 $.fn.fade = function x() {
        var _this = this; // keep the 'this' value
  

После окончательной анимации вызовите x снова, передав this значение, которое оно имело:

 x.call(_this); // same as x() but it sets the 'this' value inside it correctly
  

Обратите внимание, что такие «выражения именованных функций» имеют определенные особенности в IE8- .

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

1. причуды в каждом браузере пытаются уменьшить время на 1/10 и посмотреть, как это будет сделано

2. @Qchmqs: Вы устанавливаете затухание сразу. Возможно, было бы лучше анимировать # 1, затем, когда он будет завершен, начните анимировать # 2 и т. Д. (вроде рекурсивно). Тогда вы уверены, что вторая начинается после первой.

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

4. я использовал 7 элементов li, чтобы ясно видеть, что первые запуски для всех из них, второй цикл составляет всего 6, и в итоге у вас будет только два элемента, которые исчезают и выходят одновременно

Ответ №2:

Попробуйте это (хотя вам придется адаптировать его к своей структуре плагинов):

 var elements = $('ul > li');
(function fade(idx) {
  $(elements).eq(idx || 0).fadeIn(1500).fadeOut(1500, function () {
    fade(idx < elements.length - 1 ? idx   1 : 0);
  });
}());
  

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

1. Есть ли какие-либо проблемы со стеком в этом решении? Я не думал, что JavaScript настолько умен в оптимизации подобных вызовов функций, но было бы здорово, если бы это было так…

2. @Weston C: fade здесь не вызывает себя напрямую, поэтому стек не растет. Когда fade() выполняется, он может завершиться после выполнения функций jQuery, потому что он еще не вызывает обратный вызов.