2016-11-15 3 views
2

У меня проблемы с созданием ступенчатой ​​анимации. Я пробовал это, чтобы анимировать элементы из массива («поле») с задержкой каждого другого элемента на 10 мс. Но он не работает с setTimeout. Значение «i» добавляется после истечения таймаута. Любой совет, как это сделать ?эффект шага с петлей

var box=[] 
for (var i = 0; i < document.getElementsByClassName('box').length; i++){box.push(document.getElementsByClassName('box')[i])} 
    for (var i = 0; i < box.length; i++) { 
     setTimeout(function() {box[i].style.transform="translateX(150px)"},i*10) 
    } 

Любая помощь или совет apprecaited, спасибо заранее.

ответ

1

Ответ включает в себя использование IIFE, чтобы зафиксировать в примитивном значении i в момент SetTimeout выполняется.

var box=[] 
for (var i = 0; i < document.getElementsByClassName('box').length; i++){box.push(document.getElementsByClassName('box')[i])} 
    for (var i = 0; i < box.length; i++) { 
     (function (i) { 
      setTimeout(function() {box[i].style.transform="translateX(150px)"},i*10) 
     }(i)) // This copies the value. 
    } 
+0

это перемещает все элементы сразу, я понятия не имею, почему – Matija

+0

@Matija вы пробовали большее значение как 'я * 100', чтобы увидеть, если он слишком быстро для того, что вы делаете? - Мне пришло в голову, что вы использовали 'i' в двух циклах. Возможно, вы можете изменить его на 'j'. – Brian

+0

yep Я пробовал даже 1000, я записал «i» для консоли и получил числа от 0 до 49, есть 50 элементов в массиве ящиков – Matija

1

Вы можете сделать этот код намного чище, как это:

var boxes = document.getElementsByClassName('box'); 

    for (var i = 0; i < boxes.length; i++) { 
     (function (i) { 
      setTimeout(function() {boxes[i].style.transform="translateX(150px)"},i*200) 
     }(i)) // This copies the value. 
    } 

Вам не нужно, чтобы подтолкнуть их в массив для доступа к ним.

здесь является рабочей скрипкой: https://jsfiddle.net/w8wbmozs/52/