2016-06-01 10 views
2

Als Teil eines Simon-Spiels möchte ich die Span-Tags der Reihe nach animieren (Hintergrundänderung mit CSS).Animieren von Spannen der Reihe nach

function animateGeneratedPattern(){ 

    //alert(generatedPattern);//pattern generated randomly in advance. 
    var i=0; 
    while(i<generatedPattern.length){ 

    switch(generatedPattern[i]){ 

     case 1: 

     animateRed(); 
     setTimeout(animateRed,500); 
     break; 

     case 2: 

     animateGreen(); 
     setTimeout(animateGreen,500); 
     break; 

     case 3: 

     animateBlue(); 
     setTimeout(animateBlue,500); 
     break; 

     case 4: 

     animateYellow(); 
     setTimeout(animateYellow,500); 
     break; 

    } 

    i++; 
    } 

} 

Für jede geeignete Farbe, ich bin mit dieser Art von Funktion zwischen Hintergründe wechseln:

function animateYellow(){ 

    $("#4").toggleClass("animateYellow"); 

} 

ich es geschafft haben, den Hintergrund zu ändern, aber alle Spannweiten verfärben sich zur gleichen Zeit. Was ändere ich, um es sequenziell anstatt gleichzeitig zu machen? Hier

Voll Code: http://codepen.io/jpninanjohn/pen/JKoYqR?editors=1010

+1

Sie können eine Warteschlange erstellen und dann in der Reihenfolge ausführen, in der Sie die Elemente mit einem Timeout platzieren. Mit diesem Modus sparen Sie viele Zeilen und Kopfschmerzen. –

+0

Ist nicht meine Implementierung von 'generatedPattern' als Array auch eine Warteschlange hier ?? – leoOrion

Antwort

2

Ihre Implementierung Anwendungen verwenden versuchen hinzufügen generatedPattern als Array und nicht als Warteschlange. Um es als Warteschlange zu verwenden, arbeiten Sie nur mit dem Element [0] und spleißen das Element [0] vor der nächsten Iteration ab. Jede Iteration richtet die nächste Iteration ein, nachdem ausgeführt wurde. Zum Beispiel, versuchen Sie dies:

function animateGeneratedPattern() { 
    function animateNextPattern(lightup) { 
     if (!generatedPattern || generatedPattern.length === 0) { 
      return; 
     } 

     switch(generatedPattern[0]) { 
      case 1: 
       animateRed(); 
       break; 
      case 2: 
       animateGreen(); 
       break; 
      case 3: 
       animateBlue(); 
       break; 
      case 4: 
       animateYellow(); 
       break; 
     } 
     if (lightup) { 
      // Long delay before turning light off 
      setTimeout(function() { 
       animateNextPattern(false); 
      }, 500); 
     } 
     else { 
      generatedPattern.splice(0, 1); 
      // Small delay before turning on next light 
      setTimeout(function() { 
       animateNextPattern(true); 
      }, 10); 
     } 
    } 

    animateNextPattern(true); 
} 

JSFiddle of this here Ihre CSS und HTML verwenden, welche die Animation arbeiten.

+0

Schöne ... Vielen Dank – leoOrion

2

Ihre while-Schleife wird Schleife durch alle Zahlen sofort. Alle Zeitüberschreitungen werden gleichzeitig ausgelöst. Sie müssen Ihr Skript verzögern (wahrscheinlich so etwas wie setTimeout(function(){--yourfunctionhere--}, 1000);

leid, dass ich mit kann es nicht tun, auf mobilen

+0

Also sollte ich meine while-Schleife auch mit einem Timeout verzögern ?? – leoOrion

+1

Werfen Sie einen Blick auf die Antwort @ghost_dad gab, es ist eine wirklich gute Idee. – mcky

3

Das Problem ist, dass die while Schleife fast augenblicklich jede der Animationsfunktionen durchläuft, mit dem gleichen .. 500 ms Verzögerung die gleiche i Variable, wir diejenigen staffeln kann hier ein aktualisierter codepen: http://codepen.io/thecox/pen/ezmVEy?editors=1010

Grundsätzlich aktualisieren nur jeder der switch Aussagen die Verzögerung durch die Iteration der Schleife zu multiplizieren:

setTimeout(animateRed,500 * i); 

Passen Sie die Verzögerungslänge nach Bedarf an. Lassen Sie mich wissen, ob das Sinn macht.

+0

Diese Art von Arbeiten. Das Problem besteht nun darin, dass der Übergang der längeren Timeouts dazu führt, dass dieser bestimmte Bereich in dem animierten Zustand ist, selbst wenn der nächste Bereich animiert ist. Ich möchte, dass jeder Bereich animiert wird und dann in den ursprünglichen Zustand zurückkehrt, bevor ich zur nächsten Animation von span gehe ... – leoOrion

+1

Deshalb habe ich erwähnt, die Verzögerungslänge nach Bedarf anzupassen (sollte mindestens so lang wie die vorherige Animation sein). Um ehrlich zu sein, der Aktivierungszustand für jedes Quartal ist so subtil, dass es wirklich schwierig war, meine Lösung überhaupt zu testen. :) –

2

nur die unterschiedlichen Werte setTimeouts machen, dh 500, 1000

Oder Sie könnten eine .delay (500) vor toggleClass

oder CSS, Übergang Verzögerung

+0

Meinst du - $ ("# 4"). ToggleClass ("animateYellow").Verzögerung (500); – leoOrion

+0

nein, delay (500) .toggleClass() statt. Es gibt viele Möglichkeiten, Elemente sequenziell zu machen. Am einfachsten ist es, wenn Sie Ihre Timeouts auf andere Werte setzen. –

Verwandte Themen