2013-06-15 17 views
5

Wie kann ich einen Übergang kontinuierlich in D3.js ausführen?D3.js: einen Übergang kontinuierlich ausführen?

Zum Beispiel sagen, ich möchte die body Farbe von rot nach blau und wieder zurück, kontinuierlich ändern (ich nicht, das wäre schrecklich, aber geh mit ihm).

Dies ist, wie ich es einmal tun würde:

d3.select("body").transition().duration(1000).style("background-color", "red"); 

Wie würde ich es ständig tun?

Die nächsten Beispiele, die ich gesehen habe, verwenden d3.timer, aber ich bin mir nicht sicher, ob es einen besseren Weg gibt, es zu tun.

Antwort

5

Sie können transition.each() und das "Ende" -Ereignis verwenden. Der Code würde ungefähr wie folgt aussehen.

function myTrans() { 
    d3.select("body").transition().duration(1000).style("background-color", "red") 
     .each("end", function() { 
     d3.select(this).transition().duration(1000).style("background-color", "blue") 
      .each("end", function() { myTrans(); }); 
     }); 
} 
+4

Das ist großartig, danke. Obwohl ich ein bisschen nervös bin, dass es den Browser irgendwann zum Absturz bringen könnte - wird es nach und nach immer mehr Speicherplatz einnehmen? – Richard

+0

@Richard dies ist eine rekursive Funktion (wie es sich selbst nennt), so sollte es einen Fehler in Bezug auf die Stapelgröße überschritten werden einige Schwelle werfen. – SumNeuron

+0

@SumNeuron Es ruft sich rekursiv, aber asynchron auf, so dass es niemals einen Call-Stack-Größenfehler auslöst. – jessepinho

1

Für D3 Version 4 Sie haben zu verwenden .on statt .each (basierend auf Lars Antwort):

function myTrans() { 
    d3.select("body").transition().duration(1000).style("background-color", "red") 
     .on("end", function() { 
     d3.select(this).transition().duration(1000).style("background-color", "blue") 
      .on("end", function() { myTrans(); }); 
     }); 
}