2016-05-26 3 views
0

Я пытаюсь анимировать все LI в последовательности, но код анимирует все LI сразу.SetTimeout on vanilla JS on [] forEach.call не работает в последовательностях

Я не мог найти полезный ответ в любом месте, я знаю, как это сделать в JQuery, но что-то здесь не складывается.

Я попытался добавить Timeout к обработчику события и вызываемой функции, оба подхода не работают.

Это функция

function changeLi() { 
    setTimeout(function() { 
    [].forEach.call(li, function(li) { 
     li.style.transform = "translateX(200px)"; 
    }, 900); 
    }); 
} 

Ссылка на codepen:

http://codepen.io/damianocel/pen/PzYXmv

Я пытался добавить stopPropagation/preventDefault на вызов, но это не помогло.

+0

Вашего соответствия скобки перепуталось. Исправьте его и правильно открепите свой код. – Bergi

+0

У вас возникло фундаментальное непонимание [как работает setTimeout] (https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout). Также [stopPropagation] (https://developer.mozilla.org/en-US/docs/Web/API/Event/stopPropagation) и [preventDefault] (https://developer.mozilla.org/en-US/docs/ Web/API/Event/preventDefault), оба из которых применяются только к событиям. – Hamms

+0

Вы используете 'setTimeout', как если бы он работал как' sleep'. См. [Здесь] (преобразование цикла Python while в Javascript) для решений. – Bergi

ответ

4

С кодом возникает несколько проблем. Во-первых, 900 не является параметром вашего setTimeout, а скорее forEach.call. Это кажется просто ошибкой.

Во-вторых, даже если выше фиксировано, ваш код будет просто набор один тайм-аут для 900ms в будущем, то перебрать все ваши li-е в списке и превратить их сразу. Я считаю, что вы действительно хотите сделать, это цикл по всем вашим элементам и определить тайм-аут для запуска в будущем, когда каждый из них запускает определенное количество времени из предыдущего. Поскольку forEach предоставляет индекс, вы можете использовать статическое количество ms и несколько его по текущему индексу вашего списка li, чтобы анимировать дальше от прямо сейчас.

Я считаю, что на самом деле вы ищете что-то вроде этого, который перебирает в список Ли, и устанавливаете преобразование происходить по каждому пункту 100мса от предыдущего:

function changeLi() { 
    [].forEach.call(li, function(li, i) { 
    setTimeout(function() { 
     li.style.transform = "translateX(200px)"; 
    }, 100 * i); 
    }); 
} 
+0

Это несколько работает, но останавливается после двух итераций. Он правильно анимирует первый элемент, а затем выполняет анимацию всего UL сразу. Есть ли способ использовать bind() для контекста «this»? –

+0

Просто для того, чтобы уточнить, вы правы, я действительно пытаюсь получить преобразования, которые будут происходить последовательно после определенного таймфрейма. –

+0

Отлично, только что видел ваше редактирование, это работает безупречно сейчас :-) –