Heim Web-Frontend Front-End-Fragen und Antworten Frontend-Entwickler müssen wissen, wie Webseiten gerendert werden

Frontend-Entwickler müssen wissen, wie Webseiten gerendert werden

Nov 29, 2016 am 09:35 AM

[Anmerkung des Herausgebers] Tatsächlich gibt es viele Artikel zum Rendern von Webseiten, aber die relevanten Informationen sind verstreut und die Diskussion ist nicht vollständig. Wenn wir dieses Thema allgemein verstehen wollen, müssen wir noch viel lernen. Daher beschloss der Webentwickler Alexander Skutin, einen Artikel zu schreiben. Er glaubt, dass dieser Artikel nicht nur Anfängern helfen kann, sondern auch für fortgeschrittene Front-End-Entwickler von Vorteil sein kann, die ihre Wissensstruktur auffrischen möchten. Die ursprüngliche Adresse

Die Übersetzung lautet wie folgt:

Das Rendern der Webseite muss in einem sehr frühen Stadium erfolgen, das bereits in der Fertigstellung des Seitenlayouts erfolgen kann. Denn Stile und Skripte haben einen entscheidenden Einfluss auf die Darstellung von Webseiten. Daher müssen professionelle Entwickler einige Techniken kennen, um in der Praxis nicht auf Leistungsprobleme zu stoßen.

In diesem Artikel wird nicht der detaillierte Mechanismus im Browser untersucht, sondern einige allgemeine Regeln vorgeschlagen. Schließlich funktionieren verschiedene Browser-Engines unterschiedlich, was die Recherche der Entwickler zu Browserfunktionen zweifellos komplizierter machen wird.

Wie führt der Browser das Rendern von Webseiten durch?

Betrachten wir zunächst die Aktionen des Browsers beim Rendern einer Webseite:

Bilden Sie das Document Object Model (DOM) basierend auf dem HTML-Code von der Serverseite.

Laden und Parse-Stile, Bilden Sie das CSS-Objektmodell.

Erstellen Sie zusätzlich zum Dokumentobjektmodell und CSS-Objektmodell einen Rendering-Baum, der aus einer Reihe von Objekten besteht, die gerendert werden sollen (in Webkit werden diese Objekte Renderer oder Rendering-Objekte genannt, und in Gecko (genannt „ Frame“ in ).) Der Rendering-Baum spiegelt die Struktur des Dokumentobjektmodells wider, enthält jedoch keine unsichtbaren Elemente wie Tags oder mit dem Attribut display:none. Im Renderbaum erscheint jede Textzeichenfolge als unabhängiger Renderer. Jedes Renderobjekt enthält sein entsprechendes DOM-Objekt oder Textblock sowie berechnete Stile. Mit anderen Worten: Der Renderbaum ist eine visuelle Darstellung des Dokumentobjektmodells.

Berechnen Sie für jedes Element im Rendering-Baum seine Koordinaten, was als Layout bezeichnet wird. Browser verwenden einen Flow-Ansatz, bei dem ein Element in einem Durchgang angeordnet wird, Tabellenelemente erfordern jedoch mehrere Durchgänge.

Abschließend werden die Elemente im Rendering-Baum endgültig im Browser angezeigt. Dieser Vorgang wird als „Malen“ bezeichnet.

Wenn der Benutzer mit der Webseite interagiert oder das Skriptprogramm die Webseite ändert und modifiziert, werden einige der oben genannten Vorgänge wiederholt ausgeführt, da sich die interne Struktur der Webseite geändert hat.

Neu zeichnen

Beim Ändern des Stils von Elementen, die keinen Einfluss auf die Position des Elements auf der Webseite haben, z. B. Hintergrundfarbe (Hintergrundfarbe), Rahmenfarbe (Rahmenfarbe) , Sichtbarkeit( Sichtbarkeit), der Browser zeichnet das Element nur einmal mit dem neuen Stil neu (dies ist ein Neuzeichnen oder Umstrukturieren des Stils).

Umfließen

Umfließen oder Neuanordnung erfolgt, wenn Änderungen den Textinhalt oder die Textstruktur oder die Elementpositionierung beeinflussen. Diese Änderungen werden normalerweise durch die folgenden Ereignisse ausgelöst:

DOM-Operationen (Hinzufügen, Löschen, Ändern oder Ändern der Elementreihenfolge);

Inhaltsänderungen, einschließlich Textänderungen innerhalb von Formularfeldern

Berechnung oder Änderung von CSS-Eigenschaften;

Stylesheets hinzufügen oder löschen;

Eigenschaften von „Klassen“ ändern;

Operationen von Browserfenstern (Zoomen, scrollen );

Pseudoklassenaktivierung(:hover).

Wie optimiert der Browser das Rendering?

Browser versuchen ihr Bestes, das Neuzeichnen/Rekonstruieren auf den Bereich des geänderten Elements zu beschränken. Bei einem Element mit fester oder absoluter Position wirkt sich die Größenänderung beispielsweise nur auf das Element selbst und seine Unterelemente aus. Die Größenänderung eines statisch positionierten Elements löst jedoch den Reflow aller nachfolgenden Elemente aus.

Eine weitere Optimierungstechnik besteht darin, den Browser die Änderungen zwischenspeichern zu lassen, wenn mehrere Teile des JavaScript-Codes ausgeführt werden, und die Änderungen dann in einem einzigen Durchgang anzuwenden, nachdem die Ausführung des Codes abgeschlossen ist. Der folgende Code löst beispielsweise nur ein Refactoring und ein Repaint aus:

var $body = $('body');
$body.css('padding', '1px'); // reflow, repaint
$body.css('color', 'red'); // repaint
$body.css('margin', '2px'); // reflow, repaint
// only 1 reflow and repaint will actually happen
Nach dem Login kopieren

Wie bereits erwähnt, löst die Änderung der Eigenschaften eines Elements jedoch einen erzwungenen Reflow aus. Dieses Verhalten tritt auf, wenn wir dem obigen Codeblock eine Codezeile hinzufügen, um auf die Eigenschaften des Elements zuzugreifen.

var $body = $('body'); $body.css('padding', '1px'); eine Eigenschaft, ein erzwungener Reflow $body.css('color', 'red'); $body.css('margin', '2px');

Das Ergebnis ist, dass der Reflow zweimal erfolgt. Daher sollten Sie Vorgänge, die auf Elementattribute zugreifen, gruppieren, um die Webseitenleistung zu optimieren. (Ausführlichere Beispiele finden Sie auf JSBin)

Manchmal muss man einen erzwungenen Reflow auslösen. Beispielsweise müssen wir demselben Element zweimal dasselbe Attribut (z. B. linken Rand) zuweisen. Zunächst sollte es auf 100 Pixel ohne Animation eingestellt sein. Als nächstes muss es über eine Übergangsanimation auf 50 Pixel geändert werden. Sie können diesem Beispiel jetzt auf JSbin folgen, aber ich werde es hier ausführlicher behandeln.

Zuerst erstellen wir eine CSS-Klasse mit Übergangseffekt: .has-transition { -webkit-transition: margin-left 1s EASY-OUT; -moz-Transition: Margin-Left 1S EASE-OUT; -transition: margin-left 1s EASY-OUT; Transition: Margin-Left 1S Easy-Out; $('#targetElemId');

Diese Ausführung funktioniert jedoch nicht. Alle Änderungen werden zwischengespeichert und erst am Ende des Codeblocks ausgeführt. Was wir brauchen, ist eine erzwungene Neuordnung, die wir mit den folgenden Änderungen erreichen können:
// remove the transition class
$targetElem.removeClass('has-transition');
// change the property expecting the transition to be   off, as the class is not there
// anymore
$targetElem.css('margin-left', 100);
// put the transition class back
$targetElem.addClass('has-transition');
// change the property
$targetElem.css('margin-left', 50);
Nach dem Login kopieren

// entferne die Übergangsklasse $(this).removeClass('has-transition');

Jetzt wird der Code wie erwartet ausgeführt.
// change the property
$(this).css('margin-left', 100);
// trigger a forced reflow, so that changes in a    class/property get applied immediately
$(this)[0].offsetHeight; // an example, other   properties would work, too
// put the transition class back
$(this).addClass('has-transition');
// change the property
$(this).css('margin-left', 50);
Nach dem Login kopieren

Praktische Vorschläge zur Leistungsoptimierung

Ich fasse die verfügbaren Informationen zusammen und mache folgende Vorschläge:

Erstellen Sie gültige HTML- und CSS-Dateien und vergessen Sie nicht anzugeben, wie die Dokument ist verschlüsselt. Im Tag sollten Stile enthalten sein und am Ende des Tags sollte Skriptcode hinzugefügt werden.

Vereinfachen und optimieren Sie CSS-Selektoren so weit wie möglich (diese Optimierung wird von Entwicklern, die CSS-Präprozessoren verwenden, fast durchgängig ignoriert) und beschränken Sie die Verschachtelung auf ein Minimum. Hier ist das Leistungsranking der CSS-Selektoren (beginnend mit den schnellsten)

Sie sollten bedenken, dass Browser Selektoren von rechts nach links verarbeiten, sodass der Selektor ganz rechts der schnellste sein sollte: #id oder .class: div * {...} // schlecht .list li {...} // schlecht .list-item {...} // gut #list .list -item {...} // gut * 1. Reduzieren Sie in Ihrem Skriptcode die DOM-Operationen so weit wie möglich. Speichern Sie alles zwischen, einschließlich Elementattributen und Objekten, wenn diese wiederverwendet werden. Bei der Durchführung komplexer Operationen ist es besser, „isolierte“ Elemente zu verwenden, die später zum DOM hinzugefügt werden können (die sogenannten „isolierten“ Elemente sind Elemente, die vom DOM getrennt und nur im Speicher gespeichert sind).
1. 识别器:#id
2. 类:.class
3. 标签:div
4. 相邻兄弟选择器:a + i
5. 父类选择器:ul> li
6. 通用选择器:*
7. 属性选择:input[type="text"]
8. 伪类和伪元素:a:hover
Nach dem Login kopieren

2. Wenn Sie jQuery zum Auswählen von Elementen verwenden, befolgen Sie bitte die Best Practices für die jQuery-Auswahl.

3. Um den Stil eines Elements zu ändern, ist die Änderung des Attributs „Klasse“ eine der effektivsten Methoden. Wenn Sie diese Änderung durchführen, ist es umso besser, je tiefer Sie sich im DOM-Rendering-Baum befinden (es hilft auch, die Logik von der Präsentation zu entkoppeln).

4. Versuchen Sie, Animationseffekte nur zu Elementen mit absoluten oder festen Positionen hinzuzufügen.

5. Deaktivieren Sie komplexe Hover-Animationen beim Scrollen (fügen Sie beispielsweise eine zusätzliche Nicht-Hover-Klasse hinzu). Leser können einen Artikel zu diesem Thema lesen.

Wenn Sie mehr Details erfahren möchten, können Sie auch diese beiden Artikel lesen:

1, Wie funktionieren Browser?

2,Rendering: Neulackieren, Reflow/Relayout, Neustil

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Erfahren Sie einige der Frontend-Entwicklungstrends, die im Jahr 2023 im Vordergrund stehen werden! Erfahren Sie einige der Frontend-Entwicklungstrends, die im Jahr 2023 im Vordergrund stehen werden! Mar 14, 2023 am 09:37 AM

Front-End-Entwicklungstrends entwickeln sich ständig weiter und einige Trends bleiben lange Zeit beliebt. Dieser Artikel fasst einige Front-End-Entwicklungstrends zusammen, die im Jahr 2023 hervorgehoben werden, und teilt sie mit Ihnen~

Wie man PHP und Angular für die Frontend-Entwicklung verwendet Wie man PHP und Angular für die Frontend-Entwicklung verwendet May 11, 2023 pm 04:04 PM

Mit der rasanten Entwicklung des Internets wird auch die Front-End-Entwicklungstechnologie ständig verbessert und iteriert. PHP und Angular sind zwei Technologien, die in der Frontend-Entwicklung weit verbreitet sind. PHP ist eine serverseitige Skriptsprache, die Aufgaben wie die Verarbeitung von Formularen, die Generierung dynamischer Seiten und die Verwaltung von Zugriffsberechtigungen übernehmen kann. Angular ist ein JavaScript-Framework, mit dem Single-Page-Anwendungen entwickelt und komponentenbasierte Webanwendungen erstellt werden können. In diesem Artikel erfahren Sie, wie Sie PHP und Angular für die Frontend-Entwicklung verwenden und wie Sie diese kombinieren

Flet: ein plattformübergreifendes Flutter-basiertes Python-Framework Flet: ein plattformübergreifendes Flutter-basiertes Python-Framework Apr 20, 2023 pm 05:46 PM

Gestern habe ich gerade eine Mikro-Überschrift über die komplette Sammlung von Python-Desktop-Entwicklungsbibliotheken gepostet und mein Kollege hat die Flet-Bibliothek entdeckt. Dies ist eine sehr neue Bibliothek, die erst im Juni dieses Jahres veröffentlicht wurde. Sie wird jedoch vom Riesen Flutter unterstützt und ermöglicht die Entwicklung von Vollplattformsoftware Alle Plattformen. Nach dem Plan des Autors wird Flutter es in Zukunft unterstützen. Ich habe es gestern kurz studiert und es ist wirklich großartig. Wir können es später für eine Reihe von Dingen verwenden. Was ist FletFlet? ist ein Framework, das die Erstellung interaktiver Mehrbenutzer-Web-, Desktop- und Mobilanwendungen in Ihrer Lieblingssprache ermöglicht, ohne dass Sie Erfahrung in der Front-End-Entwicklung haben müssen. Gastgeber

Der Unterschied und Zusammenhang zwischen Front-End- und Back-End-Entwicklung Der Unterschied und Zusammenhang zwischen Front-End- und Back-End-Entwicklung Mar 26, 2024 am 09:24 AM

Front-End- und Back-End-Entwicklung sind zwei wesentliche Aspekte beim Erstellen einer vollständigen Webanwendung. Es gibt offensichtliche Unterschiede zwischen ihnen, aber sie sind eng miteinander verbunden. In diesem Artikel werden die Unterschiede und Zusammenhänge zwischen Front-End- und Back-End-Entwicklung analysiert. Werfen wir zunächst einen Blick auf die spezifischen Definitionen und Aufgaben der Front-End-Entwicklung und der Back-End-Entwicklung. Die Front-End-Entwicklung ist hauptsächlich für den Aufbau der Benutzeroberfläche und des Benutzerinteraktionsteils verantwortlich, d. h. für das, was Benutzer im Browser sehen und bedienen. Frontend-Entwickler nutzen in der Regel Technologien wie HTML, CSS und JavaScript, um das Design und die Funktionalität von Webseiten zu implementieren

Erfahren Sie, wie Sie Sessionstorage verwenden, um die Effizienz der Front-End-Entwicklung zu verbessern Erfahren Sie, wie Sie Sessionstorage verwenden, um die Effizienz der Front-End-Entwicklung zu verbessern Jan 13, 2024 am 11:56 AM

Um die Rolle von sessionStorage zu beherrschen und die Effizienz der Front-End-Entwicklung zu verbessern, sind spezifische Codebeispiele erforderlich. Mit der rasanten Entwicklung des Internets verändert sich auch der Bereich der Front-End-Entwicklung von Tag zu Tag. Bei der Frontend-Entwicklung müssen wir häufig große Datenmengen verarbeiten und für die spätere Verwendung im Browser speichern. SessionStorage ist ein sehr wichtiges Front-End-Entwicklungstool, das uns temporäre lokale Speicherlösungen bereitstellen und die Entwicklungseffizienz verbessern kann. In diesem Artikel wird die Rolle von sessionStorage vorgestellt.

Was ist node.red? Was ist node.red? Nov 08, 2022 pm 03:53 PM

node.red bezieht sich auf Node-RED, ein Flow-basiertes Low-Code-Programmiertool zum Verbinden von Hardwaregeräten, APIs und Onlinediensten auf neue und interessante Weise. Es bietet einen browserbasierten Editor, mit dem wir Flows einfach miteinander verbinden können Sie können verschiedene Knoten im Bearbeitungsbereich bearbeiten und sie mit nur einem Klick in ihrer Laufzeit bereitstellen.

Zusammenfassung der Erfahrungen mit asynchronen JavaScript-Anfragen und Datenverarbeitung in der Front-End-Entwicklung Zusammenfassung der Erfahrungen mit asynchronen JavaScript-Anfragen und Datenverarbeitung in der Front-End-Entwicklung Nov 03, 2023 pm 01:16 PM

Zusammenfassung der Erfahrungen mit asynchronen JavaScript-Anforderungen und Datenverarbeitung in der Front-End-Entwicklung. In der Front-End-Entwicklung ist JavaScript eine sehr wichtige Sprache. Es kann nicht nur interaktive und dynamische Effekte auf der Seite erzielen, sondern auch Daten durch asynchrone Anforderungen abrufen und verarbeiten . In diesem Artikel fasse ich einige Erfahrungen und Tipps im Umgang mit asynchronen Anfragen und Daten zusammen. 1. Verwenden Sie das XMLHttpRequest-Objekt, um asynchrone Anforderungen zu stellen. Das XMLHttpRequest-Objekt wird von JavaScript zum Senden verwendet

Neue Trends im Golang-Frontend: Interpretation der Anwendungsaussichten von Golang in der Frontend-Entwicklung Neue Trends im Golang-Frontend: Interpretation der Anwendungsaussichten von Golang in der Frontend-Entwicklung Mar 20, 2024 am 09:45 AM

Neue Trends im Golang-Front-End: Interpretation der Anwendungsaussichten von Golang in der Front-End-Entwicklung. In den letzten Jahren hat sich der Bereich der Front-End-Entwicklung rasant entwickelt, und es sind in einem endlosen Strom verschiedene neue Technologien entstanden Als zuverlässige und zuverlässige Programmiersprache hat Golang auch begonnen, sich in der Front-End-Entwicklung durchzusetzen. Golang (auch bekannt als Go) ist eine von Google entwickelte Programmiersprache. Sie ist für ihre effiziente Leistung, prägnante Syntax und leistungsstarken Funktionen bekannt und wird nach und nach von Front-End-Entwicklern bevorzugt. In diesem Artikel wird die Anwendung von Golang in der Front-End-Entwicklung untersucht.

See all articles