2016-07-28 49 views
3

Vielen Dank für das Einchecken!anfrageAnimationFrame wartet nicht auf den nächsten Frame

Also soweit ich weiß (es kann falsch sein) JavaScript requestAnimationFrame-Methode funktioniert (ein wenig) wie SetTimeout, außer dass es nicht für eine gewisse Zeit wartet, sondern für das nächste Bild gerendert werden soll.

Dies kann für viele Dinge verwendet werden, aber was ich hier erreichen möchte, ist ein CSS-basierter JavaScript-gesteuerter Fade-Effekt. Hier ist das, was der Code wie mit Erklärung aussieht:

//This line makes the element displayed as block from none 
//but at this point it has an opacity value of 0 
this.addClass('element__displayed'); 

//here i am waiting a frame so that the previously added 
//display value takes effect 
window.requestAnimationFrame(function(){ 
    //adding opacity: 1 for fade effect 
    this.addClass('element__visible'); 
}.bind(this)); 

Mein Problem hier ist, dass, obwohl das Element seines CSS-Übergang eingerichtet hat und ich warte auf den Anzeigewert gerendert werden, erhalte ich keinen Übergang es erscheint nur in.

(es funktioniert, wenn ich setTimeout (..., 1000-1060) verwenden, aber setTimeout ist eine Performance-Engpass im Vergleich zu request)

Bitte versuchen sie nicht, eine alternative zu geben Lösung für einen verblassenden Effekt, weil meine Frage nicht der Effekt ist, aber warum der animationFrame nicht funktioniert!

Vielen Dank!

+0

Können Sie eine Demo –

+0

teilen zeigen die CSS bitte –

+0

https://jsfiddle.net/arunpjohny/zwgsv3ys/1/ - –

Antwort

3

I denken requestAnimationFrame ist nicht garantiert, auf den nächsten Frame zu warten. Paul Irish writes

Alle raFS in Ihren Event-Handler der Warteschlange wird im gleichen Rahmen durchgeführt werden. Alle in einer rAF eingereihten rAFs werden im nächsten Frame ausgeführt.

Wenn Ihr Demo angepasst, funktioniert es für mich jetzt auf Chrome: https://jsfiddle.net/ker9zpjs/

Ich fand einmal diese Helfer, die seitdem in meinem Werkzeugkasten ist:

var nextFrame = function(fn) { raf(function() { raf(fn); }); }; 

Aber ich muss gestehen, dass mein Antwort ist nicht vollständig erforscht, wenn jemand bessere Informationen finden könnte, würde ich es auch schätzen.

+0

' Alle rAFs, die in einer rAF eingereiht sind, werden im nächsten Frame ausgeführt. "Das scheint eine Lüge zu sein. –

+0

@ H.B .: Haben Sie Referenzen oder Beispiele, die dies unterstützen? – ernesto

+0

Ich hatte ein Problem mit WebVR, obwohl diese Artefakte von dem externen Gerät mit seinen eigenen rAF-Schleifen sein könnten. Ich würde das tiefer untersuchen müssen, vielleicht ist das tatsächliche Verhalten nicht einmal richtig unter Verwendung z.B. der Chrome-Profiler. –