2009-02-04 6 views
49

Welche Arten von Aktivitäten werden Reflow der Webseite mit DOM auslösen?Wann findet Reflow in einer DOM-Umgebung statt?

Es scheint, dass es verschiedene Sichtweisen gibt. Laut http://www.nczonline.net/blog/2009/02/03/speed-up-your-javascript-part-4/ passiert es

  • Wenn Sie einen DOM-Knoten hinzufügen oder entfernen.
  • Wenn Sie einen Stil dynamisch anwenden (z. B. element.style.width = "10px").
  • Wenn Sie eine Messung abrufen, die berechnet werden muss, z. B. Zugriff auf offsetWidth, clientHeight oder einen berechneten CSS-Wert (über getComputedStyle() in DOM-kompatiblen Browsern oder currentStyle in IE).

jedoch gemäß http://dev.opera.com/articles/view/efficient-javascript/?page=3 triggert Messung nur unter Reflow wenn bereits Reflow-Aktion in der Warteschlange gestellt.

Hat jemand noch mehr Ideen?

+0

Verschiedene Browser verhalten sich unterschiedlich. – some

+9

Außer wenn sie sich gleich verhalten. ;) – coderjoe

+0

Schauen Sie sich Paul Irish's Rede über [Vermeiden von Reflows] an (https://youtu.be/q_O9_C2ZjoA?t=4m23s): Reflows werden durch Änderungen in Höhe, Breite, OffsetWidth usw. verursacht. Absolute Positionierung tut [löst nicht Reflow] (https://developers.google.com/speed/articles/reflow?hl=de). – ruhong

Antwort

43

Beide Artikel sind korrekt. Man kann mit Sicherheit davon ausgehen, dass immer, wenn Sie etwas tun, das vernünftigerweise die Dimensionen von Elementen im DOM erfordert, berechnet wird, dass Sie den Reflow auslösen.

Darüber hinaus, so weit ich sagen kann, sagen beide Artikel das gleiche.

Der erste Artikel sagt Reflow passiert, wenn:

Wenn Sie eine Messung abzurufen, die, wie Zugriff auf offset, client oder über berechnete CSS-Wert (über getComputedStyle berechnet werden muss() in DOM-kompatiblen Browsern oder currentStyle in IE), während DOM-Änderungen in die Warteschlange gestellt werden.

Der zweite Artikel heißt es:

Wie bereits erwähnt, kann der Browser für Sie mehr Änderungen Cache und Reflow nur einmal, wenn diese Änderungen alle werden. Beachten Sie jedoch, dass Messungen des Elements es zwingen, zu reflow, damit die Messungen korrekt sind. Die Änderungen können oder werden nicht sichtbar überstrichen, aber der Reflow selbst muss immer noch hinter den Kulissen geschehen.

Dieser Effekt wird erzeugt, wenn Messungen durchgeführt werden unter Verwendung von Eigenschaften wie offset oder unter Verwendung von Methoden wie getComputedStyle. Auch wenn die Nummern nicht verwendet werden, genügt es, wenn Sie nur eine der beiden verwenden, während sich der Browser noch im Cache befindet, um den versteckten Reflow auszulösen. Wenn diese Messungen wiederholt durchgeführt werden, sollten Sie in Betracht ziehen, sie nur einmal zu nehmen und das Ergebnis zu speichern, das später verwendet werden kann.

Ich nehme an, dass sie dasselbe bedeuten, was sie früher sagten.Opera wird sich bemühen, Werte zu cachen und Reflow für Sie zu vermeiden, aber Sie sollten sich nicht auf seine Fähigkeit verlassen, dies zu tun.

Für alle Absichten und Zwecke glauben Sie einfach, was sie beide sagen, wenn sie sagen, dass alle drei Arten von Wechselwirkungen Reflow verursachen können.

Prost.

+0

Gibt es eine Möglichkeit, ein Repaint (zusätzlich zum Reflow) zu erzwingen? Um eine große Seite in kleinen Schritten zu rendern und somit die vom Endbenutzer wahrgenommene Rendering-Geschwindigkeit zu erhöhen. –

+0

@coderjoe, "die Messungen des Elements zwingen ihn zum Reflow" warum werden sie nicht in den Browsern zwischengespeichert? Was passiert, wenn ich getComputedStyle gleich 3 Mal hintereinander angerufen habe? Werde ich 3 Reflows haben? – faressoft

1
document.body.style.display = 'none'; 
document.body.style.display = 'block'; 

Dies löst oft diese unverständlichen Layout Bugs.

+0

Ich lief in einen ie6 Fehler, der ein swf an falscher Stelle anzeigt. Gelöst durch Setzen von 'swfObj.style.display =" block "' – aztack

+28

Wow, müssen Sie noch IE6 unterstützen? Bleib stark, Soldat. –

3

Sehen Sie sich den Abschnitt "Durch Eigenschaft getriggerter Lesezugriff ausgelöst" von Understanding Internet Explorer Rendering Behaviour an, wobei der folgende Code im IE eine Rendering-Aktivität verursacht.

function askforHeight() { 
    $("#lower").height(); 
} 
Verwandte Themen