2013-02-14 11 views
6

verwende Ich habe ein paar Klassen: hide ist display: none und transparent ist opacity: 0. Das Element pr_container hat -webkit-transition: opacity 1s. Der folgende JQuery-basierte Code macht ein Element in einem animierten fasion erscheinen:CSS-Übergänge funktionieren nicht, wenn ich Timeout

pr_container.removeClass("hide"); 
setTimeout(function() { pr_container.removeClass("transparent"); }, 0); 

Allerdings, wenn ich setTimeout entfernen und stattdessen nur die zweite Klasse entfernen, gibt es keine Animation. Warum?

Edit: Ich bin das neueste Chrome, ich habe noch anderen Browser nicht aktiviert.

Edit: Ich habe versucht, beiden Anrufe in dem gleichen setTimeout Rückruf setzen - keine Animation. Es geht also eindeutig um Trennung.

Edit: hier ist der jsFiddle: http://jsfiddle.net/WfAVj/

+0

Wie rufen Sie diesen Code? Kannst du mir einen Einblick geben, was passiert? – FixMaker

+0

@Lorax hier ist es: http://jsfiddle.net/WfAVj/ –

+0

Wenn Sie jQuery verwenden, gibt es einen Grund, möchten Sie die Animation von CSS-Übergang behandelt werden? Die Verwendung von ['.animate()'] (http://api.jquery.com/animate/) oder ['.fadeTo()'] (http://api.jquery.com/fadeTo/) würde wahrscheinlich besser ergeben Cross-Browser-Funktionalität. –

Antwort

3

Sie können einen Übergang machen, wenn Sie display Eigenschaft zur gleichen Zeit ändern. Damit es funktioniert, musst du dein Element auf andere Weise verstecken. Zum Beispiel:

.hide { 
    height: 0; 
    width: 0; 
    /* overflow: hidden; padding: 0; border: none; */ 
} 

http://jsfiddle.net/dfsq/WfAVj/1/

+0

Leider funktioniert es nicht, wenn ich 'Position: fixed' Elemente im Inneren haben, und ich mache :( –

+0

Noch eine Frage: Woher weiß der Browser, ob ich jetzt eine andere Klasse hinzufügen/entfernen werde oder ob ich 'removeclass (" hide ") zuletzt lege, wird es dann die Animation gut machen? –

+0

Aber wenn du' removeClass ('hide') 'das letzte in diesem Fall werden Sie keine Änderungen sehen – dfsq

0

nur die "transperent" Klasse produzieren Animation .. "verstecken" ist Instant. So starten Sie die Animation und, wenn nötig "verstecken" nach 1 Sekunde:

test.addClass("transparent"); 
//hide after 1 sec, when the animation is done 
setTimeout(function() {test.addClass("hide"); }, 1000); //1000ms = 1sec 

http://jsfiddle.net/WfAVj/4/

+0

Das war nicht der Teil, um den ich mir Sorgen machte :) –

3

Es gibt keine vernünftige "curve" für den Transit von einem display Status zu einem anderen, so in der aktuellen Implementierung von Browsern, jeder Übergang das irgendwie beinhaltet display wird am Ende ohne Übergang überhaupt enden.

Mit diesem Code:

pr_container.removeClass("hide"); 
pr_container.removeClass("transparent"); 

können Sie sich vorstellen, die beiden Anweisungen in einer einzigen „Sperrung“ Warteschlange auszuführen, so praktisch Browser das Element class="hide transparent"-class="" macht, und wie oben erwähnt, die hide Klasse praktisch macht einen bestehenden Übergang ungültig.

von

pr_container.removeClass("hide"); 
setTimeout(function() { pr_container.removeClass("transparent"); }, 0); 

Sie verwenden gesagt Browser die „transparent“ Klasse entfernen „so bald wie möglich, aber nicht in der gleichen Warteschlange“, so Browser entfernt zuerst „verstecken“, und bewegt sich dann auf. Das Entfernen von "transparent" geschieht, wenn der Browser denkt, dass er eine Ressource übrig hat, wodurch der Übergang nicht ungültig wird.

0

von Vorschlägen in der verknüpften Frage verwenden, habe ich eine Version, die ich mit zufrieden bin:

.test { 
    -webkit-transition: visibility 1s, opacity 1s; 
} 

.hide { 
    visibility: hidden; 
} 

.transparent { 
    opacity: 0; 
} 

http://jsfiddle.net/xKgjS/

Edit: jetzt die beiden Klassen sogar zu einem kombiniert werden können!

Danke an alle!

+1

Verwenden von' Sichtbarkeit: versteckt' ist nicht das Gleiche als 'display: none': http://jsfiddle.net/xKgjS/1/ Aber das ist in Ordnung, wenn es Ihrem Bedarf entspricht. – Passerby

Verwandte Themen