跳到正文

HTML to Frame:DOM 如何变成 Figma 自动布局(Auto Layout)

HTML to frame 转换原理:DOM 嵌套、框架命名、自动推断 Auto Layout、Fill 与 Center、2 px 校验、约束和诊断信息,一文讲清 HTML 转 Figma 框架。

EUREKA! · · 8 分钟阅读

把网页转成一张图片很容易。把它转成像设计师亲手搭建的 Figma 框架才是难点。一个看起来没问题、但一改标题就塌掉的框架,并不比截图好多少。

本文一步步说明 HTML to Frames 如何把 DOM 变成嵌套的 Figma 框架,它的自动布局(Auto Layout)引擎如何决定哪些内容成为堆叠,以及它为什么在保留结果之前要先检查自己的工作。

从 DOM 到框架树

网页是一棵树:body 包含区块,区块包含容器,容器包含卡片,卡片包含标题和按钮。Figma 文件同样是一棵树:框架包含框架、文本和矢量。

HTML to frame 转换的基本思路,就是把一棵树映射到另一棵树上:

  • 每个页面、每个屏幕都成为一个顶层框架。 对同一页面导入 Desktop、Tablet 和 Mobile,会并排生成三个框架。
  • 充当盒子的元素成为嵌套框架。 它们的背景、边框、圆角、阴影和裁剪都会变成框架属性。
  • 文本成为文本图层,并保留混合样式,因此一句带有加粗链接的话仍是一个文本图层。
  • SVG 成为可编辑矢量,图片成为图片填充。
  • 伪元素(::before、::after)、shadow DOM 内容以及 z-index 顺序都会被保留,图层叠放顺序与浏览器绘制的一致。

目标是一个设计师读得懂的图层面板,而不是把每个 DOM 节点都倒出来。如果你需要更细粒度的图层结构来做检查,可以使用 Detailed layers(详细图层,Pro)选项。

框架命名

顶层框架的命名方式便于你在大型文件中查找:

example.com/pricing — Desktop (1920)

名称包含域名和路径(如有查询参数也会包含),不含协议和 www,后面跟着屏幕类型及其宽度,最长 60 个字符。来源 URL 也会存储在框架上,这正是一键 Re-import(重新导入)得以实现的原因。

第 1 步:先做像素级精确的构建

引擎并不是一上来就猜测自动布局。它先构建一个保证看起来正确的版本:

  1. 页面在真实浏览器中以所选宽度渲染。对 Desktop 而言,这个宽度是 Site width(站点宽度)——插件根据页面的实际设计测量得出的宽度(满屏设计为 1920,盒式网站为盒子宽度,流式网站为 1440)。
  2. 测量每个元素的几何信息和计算样式。
  3. 使用绝对定位构建框架树,让每个图层都精确位于浏览器放置它的位置。

这个绝对定位版本就是安全网。之后的每一步都是需要证明自己的改进。

第 2 步:由内而外推断自动布局

接下来,引擎从最内层向外遍历框架。对每个框架,它查看子元素的实测几何信息,并判断:这些子元素能否描述为一个自动布局堆叠?

它会推断:

  • 方向——子元素是垂直堆叠还是水平堆叠?
  • 换行——它们是否构成换行的行,比如 CSS 网格卡片或 flex-wrap?
  • 间距——子元素之间的间距是否足够一致,可以用一个间距值表示?
  • 内边距——子元素距离框架各边有多远?
  • 对齐——它们在每个轴上是起始、居中还是末端对齐?

由内而外很重要:一张卡片的内容一旦成为整齐的垂直堆叠,这张卡片本身就可以作为外层卡片行中的单个元素来处理。

关键在于,推断基于浏览器实际渲染的结果,而不是解析 CSS。无论一行是用 flexbox、grid、浮动还是 inline-block 构建的,测量结果都一样,引擎正是以此为依据。

第 3 步:加入响应式语义

间距和内边距正确的堆叠只是开始,它还不能像响应式设计那样工作。引擎还会推断意图:

  • 居中内容 → Center。 如果内容在父级中居中,就设置为 Center 对齐,调整框架大小时它仍保持居中。
  • 有最大宽度的盒子保持居中。 全宽区块中带最大宽度的内容容器会保持其宽度并居中。
  • 等宽卡片和 flex-grow → Fill。 平分一行的卡片,或会伸展填充空间的元素,会被设置为 Fill container(填充容器)。
  • Logo … 菜单 … 图标 → 中间的间隙项变为 Fill。 在典型的页头中,真正伸缩的是各组之间的空白。引擎会把这个间隙项设为 Fill,这样页头变宽时,Logo 留在左侧,图标留在右侧。

这就是“只在一个宽度下与页面一致的框架”和“真正可以调整大小的框架”之间的区别。

第 4 步:校验每个子元素(2 px 容差)

这一步保证了设计的完整性。对某个框架应用自动布局方案后,引擎会将每个子元素的位置与原始的像素级精确布局进行比对。每个子元素都必须落在浏览器所放位置的 2 px 以内。

  • 如果所有子元素都符合,就保留该方案。
  • 如果不符合,就尝试更简单的方案——例如去掉较激进的对齐或 Fill 设置的单一堆叠。
  • 如果没有任何方案成立,该框架就保留绝对定位。

规则很简单:设计永不走样。 在复杂的区块上,你得到的自动布局框架可能少一些,但不会得到一个悄悄错位的布局。

成功率如何?在我们对真实网站的测试中,大约 86–97% 的框架推断出了自动布局——例如某个产品网站为 93%,Linear 和 Stripe 为 88%。结果取决于页面的构建方式,请把这些数字视为测量结果,而非保证。

第 5 步:为保持绝对定位的框架设置约束

保持绝对定位的框架也不会被放任不管。引擎会为它们设置合理的约束:

  • Stretch(拉伸)——用于横跨父级的元素,比如全宽背景图层。
  • Scale(缩放)——用于需要按比例缩放的元素。
  • Center(居中)——用于在父级中居中的元素。
  • Min——固定在左侧或顶部。
  • Max——固定在右侧或底部。

因此,即使是绝对定位的框架,在调整父级大小时也能表现得合理。

第 6 步:诊断信息——框架为何保持绝对定位

结果页面会报告本次导入的框架数、图层数和自动布局占比,以及缺失字体和警告。它还会列出特定框架保持绝对定位的原因。实际中,保持绝对定位的区块往往是子元素相互重叠、脱离正常文档流,或间距过于不规则、无法用一个堆叠描述的那些。

这些诊断信息有两方面用处:

  • 对设计师——你知道哪些区块需要手动转换,才能做到完全响应式。
  • 对开发者——它们往往提示布局代码比实际需要的更复杂。

CSS flexbox 和 grid 到自动布局:映射表

由于引擎以实测几何为依据,下表描述的是典型结果,而不是 CSS 属性的逐字翻译。想深入了解,请参阅 CSS flexbox 和 grid 转 Figma 自动布局。

CSS 模式典型的 Figma 结果
display: flex; flex-direction: column垂直自动布局
display: flex; flex-direction: row水平自动布局
gap(或一致的 margin)自动布局元素间距
容器上的 padding自动布局内边距
justify-content: center / align-items: centerCenter 对齐
justify-content: space-between(Logo … 菜单 … 图标)水平堆叠,间隙项设为 Fill
子项上的 flex: 1 / flex-growFill container
flex-wrap: wrap换行的自动布局行
等宽列的 display: grid换行行,各项等宽 Fill
max-width + margin: 0 auto固定宽度框架,在 Fill 父级中居中
position: absolute / 重叠图层绝对定位加约束
position: fixed / sticky 页头在 Present 模式中保持固定或吸顶
未通过 2 px 校验的不规则间距绝对定位,并列入诊断信息

实例演示:三卡片价格区块

为了让上述步骤更具体,设想一个常见的区块:顶部居中的标题和副标题,下面一行三张价格卡片,每张包含方案名称、价格、功能列表和按钮。

引擎通常会这样处理:

  1. 像素级精确构建。 每个元素都放在实测位置。区块已经看起来正确。
  2. 先处理最内层框架。 每个功能列表成为间距一致的垂直堆叠。每张卡片成为垂直堆叠——名称、价格、列表、按钮——内边距取自到卡片边缘的距离。
  3. 卡片行。 三张卡片等宽、等距并排,因此这一行成为只有一个间距值的水平堆叠,每张卡片设为 Fill,平分宽度。
  4. 标题块。 标题和副标题居中,因此成为 Center 对齐的垂直堆叠。
  5. 校验。 检查每个框架的每个子元素是否与原始位置一致。比如,如果中间卡片顶部压着一个“最受欢迎”徽标,这张卡片的方案可能无法通过 2 px 校验。引擎会尝试更简单的方案;如果仍不成立,这张卡片就保留绝对定位并加上约束——结果页面会告诉你是哪个框架。

最终得到的是一个可以调整大小的区块:拉宽框架,卡片一起变宽;编辑功能列表,卡片随之变高。启用 Components & hover states(组件与悬停状态,Pro)后,由于三张卡片结构相同,它们还可能作为同一个组件的实例导入。

实际意味着什么

打开导入的页面后,你可以:

  • 编辑标题,区块随之变高,把下面的内容往下推。
  • 修改一个间距值,收紧卡片网格。
  • 调整框架大小,看着 Fill 元素伸展,而居中内容保持不动。
  • 把卡片替换为组件实例——启用 Components & hover states(Pro)后,重复的卡片可能已经是组件了。

这就是框架树与扁平图片的区别。HTML to canvas 对比一文对此有更详细的说明。

获得更好自动布局结果的技巧

  1. 以正确的宽度导入。 让 Desktop 使用 Site width,并用 Responsive set(响应式套组)添加 Tablet 和 Mobile,以便检查每个断点。
  2. 隐藏浮层。 开启 Hide cookie banners & popups(隐藏 Cookie 横幅和弹窗),避免固定对话框覆盖区块、迫使其使用绝对定位。
  3. 捕获稳定状态。 捕获时动画会被冻结;对于加载较晚的内容,Extra wait(额外等待,Pro)会有帮助。
  4. 先查看诊断信息,再动手转换。它们会准确告诉你该关注哪些框架。
  5. 需要确认图层与线上页面一致时,使用 Reference screenshot(参考截图,Pro)。

了解更多

获取插件,导入一个你熟悉的页面。理解这个引擎最快的方法,就是调整结果的大小,看看哪些部分稳如磐石。

常见问题

HTML to Frames 是读取我的 CSS 来创建自动布局的吗?
它依据浏览器的实测几何信息,而不是解析 CSS 规则。页面在真实浏览器中渲染,测量每个元素,再根据元素实际所在位置推断堆叠、换行、间距、内边距和对齐。因此,只要渲染结果足够规整,无论使用 flexbox、grid 还是较老的布局技术,都能生成自动布局。
2 px 校验有什么作用?
对某个框架应用自动布局方案后,会将每个子元素的位置与原始的像素级精确布局进行比较,每个子元素都必须在 2 px 以内。如果有任何子元素偏移更多,就尝试更简单的方案;如果没有方案成立,该框架保留绝对定位。插件正是借此确保设计永不走样。
为什么有些框架保持了绝对定位?
当没有任何自动布局方案通过校验时,框架就保持绝对定位,例如子元素重叠、元素脱离正常文档流或间距不规则。结果页面会列出每个此类框架的原因。这些框架仍会获得 Stretch、Scale、Center、Min 或 Max 等约束,因此在调整父级大小时表现合理。
一个页面有多少会变成自动布局?
在我们对真实网站的测试中,大约 86% 到 97% 的框架推断出了自动布局,例如某个产品网站为 93%,Linear 和 Stripe 为 88%。占比取决于页面的构建方式,请把这些数字视为我们测试中的测量结果,而不是对每个页面的保证。
导入的框架如何命名?
顶层框架使用域名和路径(以及查询参数,如有),后面跟着屏幕类型和宽度,例如 example.com/pricing — Desktop (1920)。协议和 www 会被去掉,名称最长 60 个字符。来源 URL 也存储在框架上,方便你之后一键重新导入。

别再手动重画网页了。

粘贴一个链接,几秒钟就能得到真实、可编辑、响应式的 Figma 图层。免费起步——每月 10 次导入。