0

Я написал сценарийInfinite петельные вертикальный слайдер, без паузы

setInterval(function(){ 
    $('#vslides').animate({ 
    top: "-=1960" 
    }, 60000, function(){         
    $('.vslide:last').after($('.vslide:first')); 
    $('#vslides').css('top', '0px'); 
    }); 
}, 60000); 

Он работает хорошо, прокручивает почти 2000px изображение в минуту, но, в конце концов останавливается. Мне нужно это, чтобы продолжить следующий образ (одно и то же изображение, только что повторилось) и продолжайте ... Я пробовал несколько вещей, но, похоже, не понимаю. Как сделать его непрерывным и удалить стоп/паузу в конце интервала?

+0

У вас установлен интервал, начинающийся только с каждой минуты. – Chev

+0

правильно, так что такое умная альтернатива? – Xeuce

+0

Я пишу ответ :) – Chev

ответ

2

Вам нужна какая-то рекурсивная функция. Вот решение, которое обеспечивает единую функцию для анимации одного элемента, но также принимает функцию обратного вызова. Затем мы создаем вторую функцию, которая будет рекурсивно перебирать все элементы в завернутом наборе, вызывать нашу анимационную функцию и передавать обратный вызов, который увеличит наш индекс и снова вызовет нашу функцию recurse, чтобы анимировать следующий элемент.

// slides an element 
function slideIt($elem, callback) { 
    /* begin animation */ 
    $elem.animate({ 
    top: "-=1960" 
    }, 60000, function() { 

    /* animation complete do whatever you need here */ 

    if (callback) { 
     /* a callback was provided, invoke it */ 
     callback(); 
    } 
    }); 
} 

var $elems = $('.all-my-elements'); 
var index = 0; 

// slides a wrapped set of elements one at a time 
function slideRecurse() { 
    var $elem = $elems.eq(index); 
    slideIt($elems.eq(index), function() { 
    /* increment index and call slideRecurse again */ 
    index++; 
    // continue animating indefinitely 
    // we're at the end so start over 
    if (index === $elems.length) { 
     index = 0; 
    } 
    setTimeout(slideRecurse, 0); // no delay. Just using it to queue up the next call on its own stack. 
    }); 
} 

// begin sliding all of my $elems one by one 
slideRecurse(); 
+0

i'm gettting this error ... Uncaught TypeError: $ elems.at не является функцией – Xeuce

+0

Извините , замените все '.at' на ['.eq'] (http://api.jquery.com/eq/). Я изменил ответ. – Chev

+0

[Вот демонстрация] (http://codepen.io/Chevex/pen/yNXKMB?editors=101), где я использую этот ответ для постепенного исчезновения, а затем во всех элементах по одному за раз на неопределенный срок. – Chev