布局引擎

布局引擎

布局层将已样式化的 DOM 转换为几何形状:一个盒子树,然后是带有尺寸和位置的片段。它是计算样式之后的阶段,其输出是可供检查的普通 Python 对象。


从 DOM 到盒子树

build_box_tree() 从已样式化的文档生成一个包含 BoxNode 条目的 BoxRoot,通过 classify_display() 对照 Display 枚举来对每个元素的显示模型进行分类。ComputedStyle 和 EdgeSizes 携带每个盒子的样式和盒模型测量值。

块级布局

layout_block_tree() 在盒子树上执行块级布局,生成一个包含 BlockFragment 条目并已解析几何形状的 FragmentRoot。

行内布局

行内内容被塑造成 ShapedRun 和 InlineTextFragment 块,通过 layout_inline_fragments() 和 flush_inline_run() 组装成 LineFragment 行。

Pagination

paginate_fragments() 将片段输出拆分为 PageFragment 页,遵循 BreakHints,并使用 PageMarginBoxes 对页边距区域进行建模,flush_page() 完成每页的最终处理。


提示与最佳实践

  • 在布局之前解析计算样式 — 框树源自已样式化的元素
  • 当框尺寸异常时检查 EdgeSizes;外边距和内边距在此处解析
  • 在你的思维模型中保持框树和片段树的区分:框描述结构,片段描述已放置的几何形状

常见问题

问题原因修复
空片段输出布局在未加样式或空树上运行首先附加样式表和内容
意外的显示分类元素的计算 display 与假设不符检查 classify_display() 结果以获取该框
页面在奇怪的位置换页未设置换页提示提供 BreakHints 给 paginate_fragments()

FAQ

盒子和片段之间有什么区别?

盒子(BoxNode)描述由样式派生的布局结构;片段(BlockFragment、LineFragment)是具有几何形状的放置结果。

引擎是否处理分页?

是的 — paginate_fragments() 生成带有页边框的 PageFragment 页面。

文本运行来自哪里?

行内内容被塑造成 ShapedRun 对象,并组装成 LineFragment 行。


API Reference 摘要

类/方法描述
build_box_tree从已样式化的 DOM 推导盒子树
layout_block_tree在盒子树上运行块布局
layout_inline_fragments将行内内容组装成行
paginate_fragments将片段拆分为页面
BoxNode布局结构中的一个盒子
PageFragment一个已布局的页面

另请参阅

 中文