布局引擎
布局引擎
布局层将已样式化的 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 | 一个已布局的页面 |