Motor de Layout
Motor de Layout
A camada de layout converte um DOM estilizado em geometria: uma árvore de caixas, depois fragmentos com tamanhos e posições. É a fase após os estilos computados, e suas saídas são objetos Python simples que você pode inspecionar.
Do DOM à Árvore de Caixas
build_box_tree() produz uma BoxRoot de BoxNode entradas a partir de um documento estilizado, classificando o modelo de exibição de cada elemento via classify_display() contra a enumeração Display. ComputedStyle e EdgeSizes carregam o estilo por caixa e as medições do modelo de caixa.
Layout de Bloco
layout_block_tree() realiza o layout em nível de bloco sobre a árvore de caixas, produzindo uma FragmentRoot contendo BlockFragment entradas com geometria resolvida.
Layout Inline
O conteúdo inline é modelado em peças ShapedRun e InlineTextFragment, montadas em linhas LineFragment via layout_inline_fragments() e flush_inline_run().
Pagination
paginate_fragments() divide a saída de fragmentos em PageFragment páginas, respeitando BreakHints, com PageMarginBoxes modelando áreas de margem da página e flush_page() finalizando cada página.
Dicas e Melhores Práticas
- Resolva estilos computados antes do layout — a estrutura de caixas deriva dos elementos estilizados
- Inspecione
EdgeSizesquando as dimensões das caixas parecem incorretas; margens e preenchimento são resolvidos lá - Mantenha a árvore de caixas e a árvore de fragmentos distintas em seu modelo mental: caixas descrevem a estrutura, fragmentos descrevem a geometria posicionada
Problemas Comuns
| Problema | Causa | Correção |
|---|---|---|
| Saída de fragmento vazia | Execução de layout em uma árvore sem estilo ou vazia | Anexe folhas de estilo e conteúdo primeiro |
| Classificação de exibição inesperada | O display computado do elemento difere da suposição | Verifique o resultado classify_display() para a caixa |
| Quebras de página em locais estranhos | Dicas de quebra não definidas | Forneça BreakHints para paginate_fragments() |
FAQ
Qual é a diferença entre uma caixa e um fragmento?
Caixas (BoxNode) descrevem a estrutura de layout derivada dos estilos; fragmentos (BlockFragment, LineFragment) são os resultados posicionados com geometria.
O motor lida com paginação?
Sim — paginate_fragments() produz PageFragment páginas com caixas de margem.
De onde vêm as sequências de texto?
O conteúdo em linha é moldado em objetos ShapedRun e montado em linhas LineFragment.
API Reference Resumo
| Classe/Método | Descrição |
|---|---|
build_box_tree | Derive a árvore de caixas a partir de um DOM estilizado |
layout_block_tree | Execute o layout de blocos sobre a árvore de caixas |
layout_inline_fragments | Monte o conteúdo inline em linhas |
paginate_fragments | Divida fragmentos em páginas |
BoxNode | Uma caixa na estrutura de layout |
PageFragment | Uma página formatada |