CSS-Übergang, der nicht ausgelöst wird
Ich bin momentan dabei, ein DOM-element (div), indem es auf dem DOM, dann eine änderung seiner Breite alle in einem schnellen Treffer in javascript. Diese in der Theorie sollte der Auslöser einer CSS3 transition, aber das Ergebnis ist direkt von A nach B, ohne den übergang zwischen.
Wenn ich die Breite ändern durch einen separaten test-click-Ereignis funktioniert auch alles wie erwartet.
Hier mein JS und CSS:
JS (jQuery):
var div = $('<div />').addClass('trans').css('width', '20px');
$('#container').append(div);
div.css('width', '200px');
CSS (nur mozilla für die minute):
.trans {
-moz-transition-property: all;
-moz-transition-duration: 5s;
height: 20px;
background-color: cyan;
}
Bin ich Durcheinander hier, oder ist das "all in one quick hit" nicht die Art, wie Dinge getan werden sollte?
Alle Hilfe wird sehr geschätzt.
InformationsquelleAutor der Frage Kong | 2011-08-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ein sauberer Ansatz, der sich nicht auf setTimeout, ist das Lesen der css-Eigenschaft in Frage, bevor Sie es:
Arbeiten hier:
http://jsfiddle.net/FYPpt/144/
Wie erklärt, unten in den Kommentaren von Lucero, es zu tun auf diese Weise ist notwendig, um zu zwingen, den browser zu berechnen, die einen tatsächlichen Wert anstatt "auto", "Erben" oder ähnlich. Ohne einen tatsächlichen Wert, wird der browser nicht wissen, wie der neue Wert sein, eine änderung von der vorherigen.
InformationsquelleAutor der Antwort Torin Finnemann
hier sind zwei Möglichkeiten, dies zu tun.
1 - CSS transitions
mithilfe
setTimeout
dieaddClass
Methode wird ausgeführt, nachdem statt zusammen mit dem vorhergehenden Skript, so dass dietransition
Ereignis wird ausgelöst,Beispiel jsfiddle
jQuery:
CSS:
2 - jQuery -
.animate()
FunktionBeispiel jsfiddle
jQuery:
CSS:
InformationsquelleAutor der Antwort MikeM
Versuchen Sie den Aufruf von jQuery
.offset()
Methode.Wenn der browser erhält den offset, löst er eine reflow/repaint/layout-Ereignis, das ermöglicht, die übergänge zu arbeiten.
Sehen diese Geige: http://jsfiddle.net/FYPpt/199/
Siehe auch -- http://gent.ilcore.com/2011/03/how-not-to-trigger-layout-in-webkit.html
InformationsquelleAutor der Antwort theozero
In Antwort auf-der-bounty:
Wenn Sie nicht den Luxus haben zu wissen, welche Immobilie wird umgestellt oder einfach glaube nicht, dass es eine gute übung, um Kraft, ein
setTimeout
zu bekommen, eine animation auf Feuer, Sie können erzwingen, dass ein reflow in einer anderen Art und Weise.Dem Grund, dass
setTimeout
funktioniert in Erster Linie aufgrund der Tatsache, dass Sie verursacht eine vollständige Dokument Umfließen in der Zwischenzeit, auch wenn die Dauer festgelegt ist0
. Das ist nicht der einzige Weg, um die Ursache für reflow.Link zu einem fiddle
JavaScript
Mit diesem JavaScript-wir sind zufällig Zugabe von zwischen 1 und 10
div
Elemente, und klicken Sie dann einer von denen zufällig und hinzufügen derwide
Klasse.Werden Sie feststellen, eine ungerade Zeile JavaScript in dort nämlich
x[0].offsetHeight
. Dies ist der Dreh-und Angelpunkt der ganzen operation. AufrufoffsetHeight
löst das Dokument Umfließen, ohne mit einem setTimeout oder das Abfragen der CSS-Wert.Was ein reflow ist in Bezug auf den DOM:
Also bitte seien Sie vernünftig, wie Sie diese Funktionen verwenden. Nicht zu viel von einer Besorgnis bei den meisten modernen Browsern (wie jQuery ist berüchtigt für das brennen mehrere fließt), aber immer noch etwas zu prüfen vor dem hinzufügen etwas wie diese Lösung alle über Ihre website.
Wichtiger Hinweis: Dies ist nicht mehr oder weniger effizient sein als eine
setTimeout
nennen. Dies ist nicht eine Magische Kugel Lösung, und es tut die gleiche Sache unter der Haube.Hier ist das entsprechenden CSS-Referenz:
InformationsquelleAutor der Antwort Josh Burgess
als @onetrickpony wurde gefragt, was ist, wenn alle Regeln werden in der CSS-Datei und sollten nicht Hinzugefügt werden, die in der JS-Funktion.
Basiert auf der Antwort von Torin Finnemann, nur mit einer leichten Veränderung:
Hinzufügen eines extra-Klasse, wo die Regeln definiert sind:
new-rules
in der CSS die Klasse vordefiniert:
jetzt gibt es keine Notwendigkeit, Kribbeln mit den JS bei änderung der CSS. Ändern Sie in der CSS-Datei bei
new-rules
🙂http://jsfiddle.net/FYPpt/201/
InformationsquelleAutor der Antwort MMachinegun
Erstellt ein neues DIV-element und fügt die 'trans' - Klasse, die auf das element, um das Feuer der CSS-übergang
InformationsquelleAutor der Antwort mike510a