Layout-Engine
Layout-Engine
Die Layout-Ebene wandelt ein gestyltes DOM in Geometrie um: einen Box-Baum, dann Fragmente mit Größen und Positionen. Sie ist die Phase nach den berechneten Stilen, und ihre Ausgaben sind einfache Python-Objekte, die Sie inspizieren können.
Vom DOM zum Box-Baum
build_box_tree() erzeugt ein BoxRoot von BoxNode Einträgen aus einem gestylten Dokument, wobei jedes Elementmodell über classify_display() gegen die Display-Aufzählung klassifiziert wird. ComputedStyle und EdgeSizes enthalten die pro-Box-Stile und Box-Modell-Messungen.
Block-Layout
layout_block_tree() führt ein Block-Level-Layout über den Box-Baum aus und erzeugt ein FragmentRoot, das BlockFragment Einträge mit aufgelöster Geometrie enthält.
Inline-Layout
Inline-Inhalt wird zu ShapedRun und InlineTextFragment Teilen geformt, zu LineFragment Zeilen zusammengefügt über layout_inline_fragments() und flush_inline_run().
Pagination
paginate_fragments() teilt die Fragmentausgabe in PageFragment Seiten, wobei BreakHints beachtet wird, mit PageMarginBoxes zur Modellierung von Seitenrandbereichen und flush_page() zum Abschluss jeder Seite.
Tipps und bewährte Verfahren
- Ermitteln Sie berechnete Stile vor dem Layout — der Boxbaum leitet sich von gestylten Elementen ab
- Untersuchen Sie
EdgeSizes, wenn Box-Dimensionen falsch aussehen; margins und padding werden dort aufgelöst - Behalten Sie in Ihrem mentalen Modell den Boxbaum und den Fragmentbaum getrennt: Boxen beschreiben die Struktur, Fragmente beschreiben die platzierte Geometrie
Häufige Probleme
| Problem | Ursache | Lösung |
|---|---|---|
| Leere Fragmentausgabe | Layoutlauf auf einem ungestylten oder leeren Baum | Stylesheets und Inhalte zuerst anhängen |
| Unerwartete Anzeigeklassifizierung | Berechneter display des Elements weicht von der Annahme ab | Überprüfen Sie das Ergebnis von classify_display() für die Box |
| Seitenumbrüche an ungewöhnlichen Stellen | Umbruchhinweise nicht gesetzt | Stellen Sie BreakHints für paginate_fragments() bereit |
FAQ
Was ist der Unterschied zwischen einer Box und einem Fragment?
Boxen (BoxNode) beschreiben die aus Stilvorlagen abgeleitete Layoutstruktur; Fragmente (BlockFragment, LineFragment) sind die platzierten Ergebnisse mit Geometrie.
Unterstützt die Engine die Paginierung?
Ja — paginate_fragments() erzeugt PageFragment Seiten mit Randboxen.
Woher kommen Textläufe?
Inline-Inhalt wird zu ShapedRun-Objekten geformt und zu LineFragment-Zeilen zusammengesetzt.
API Reference Zusammenfassung
| Klasse/Methode | Beschreibung |
|---|---|
build_box_tree | Leiten Sie den Box-Baum aus einem gestylten DOM ab |
layout_block_tree | Führe das Blocklayout über den Boxbaum aus |
layout_inline_fragments | Inline-Inhalt in Zeilen zusammenführen |
paginate_fragments | Fragmente in Seiten aufteilen |
BoxNode | Eine Box in der Layoutstruktur |
PageFragment | Eine gestaltete Seite |