2016-05-26 8 views
0

シーケンス内のすべてのLIをアニメーション化しようとしていますが、コードはすべてのLIを一度にアニメーション化しています。バニラJSのSetTimeout forEach.callがシーケンス内で動作しない

どこでも役に立つリプライが見つかりませんでした.Jqueryでこれを行う方法はわかりましたが、ここでは何も追加されません。

イベントハンドラと呼び出された関数にタイムアウトを追加しようとしましたが、どちらの方法も機能しません。

codepenにこの機能です

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

リンク:

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

コードにはいくつかの問題があります。まず、900setTimeoutのパラメータではなく、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

これはいくらか働いていますが、2回の反復後に停止します。 最初のItemを適切にアニメートし、UL全体を一度にアニメートします。 "this"コンテキストにbind()を使用する方法はありますか? –

+0

ちょうど明確にするために、あなたは正しいです、私は確かに変換が所定の時間枠の後に順番に起こるようにしようとします。 –

+0

完璧な、ちょうどあなたの編集を見た、これは完璧に今働く:-) –

関連する問題