一个指令,把垃圾素材做成高级 HTML 展示页吊打 PPT

图像

最近给客户做了几个 HTML 展示页。

设计稿图片是 AI 出的,最省事的做法:直接丢给模型,让它照着图写成 HTML。

你大概率也尝试过。

也大概率,翻过车。

设计稿看着像真产品。

代码一跑起来,立刻像十年前的模板站:字重发闷,间距散开,插画糊成一片,logo 还变形。


这时候很多人会怪模型代码能力不行。

我更倾向于另一个判断:问题通常出在任务拆分上

你让模型一次完成三件事:读懂页面结构,复刻视觉样式,还要临时画出复杂资产。

前两件它能做得不错,第三件很容易把页面拖垮。

核心认知:UI 还原要拆成三层看 —— 结构样式资产

结构和样式交给 HTML/CSS
logo、插画、产品图、3D 视觉这类东西,单独当成图片资产处理。
后面再通过截图、对比、修正,把误差一点点压下去。

这套流程跑起来后,页面会明显少一点"AI 糊出来"的味道。


1. 先把任务拆开

很多人给模型的指令只有一句:

根据这张图生成 HTML。

这句话太宽了。

它同时包含三类任务:

  • 识别页面结构
  • 复刻视觉样式
  • 生成复杂视觉资产

模型看图、认布局、估字号、写 flex/grid,都还可以。

它真正容易出问题的地方,是把本该作为图片处理的东西,硬塞进代码里

比如设计稿中间有一张空状态插画。

你让模型照图写 HTML,它可能会用 CSS 画几个圆、几段渐变,或者塞一段抽象 SVG。

最后得到的东西,轮廓像插画,细节像临时拼出来的几何块。

模型未必笨。
只是你把"生成素材"的任务塞进了"写代码"的通道。

更合理的做法,是提前告诉它:

  • 哪些元素要写成代码
  • 哪些元素只需要留位置
  • 哪些元素后面单独生成成图片

这一层拆清楚,后面才有得调。


2. SaaS 空状态页面:哪些该写代码,哪些该做资产

拿一个 SaaS 空状态页面看。

左侧栏、菜单、顶部区域、卡片、按钮、文字层级、空状态容器 —— 这些都适合用 HTML/CSS 复刻。

它们的本质是布局、颜色、字号、间距、边框和圆角。

但有两类东西不要硬画

  • 左上角的 logo
  • 中间的空状态插画

它们属于视觉资产

如果硬让模型用 CSS 或 SVG 画,结果大概率会变形。

你想要的是 logo,它给你一个"有点像 logo 的符号"。

你想要的是插画,它给你一坨颜色接近的形状。

我一般会这样处理:

  1. 先把整体 HTML 搭出来,logo 和插画的位置用灰色占位块放着
  2. 单独裁出 logo 和插画区域,作为参考图
  3. 用图生图生成高清资产,处理好透明底,再替换回页面

判断法则:把它拿掉以后,页面结构还成立吗?

logo 拿掉,导航栏还是导航栏。
插画拿掉,空状态容器还是空状态容器。
它们是贴上去的视觉层,不属于页面骨架本身。

这类东西,别交给 CSS 硬撑。

图像


3. Landing page 的右侧插画,要单独处理

再看 Landing page。

右侧那张大插图,很多人会直接从原始设计稿里裁下来用。

刚放进去好像还行,一放大就糊。

原因很简单:原图是一整张页面,分辨率分散在整张画面里。

插画只是其中一块。

你裁出来的局部,本来就达不到高清素材的标准。

不要对着低清局部继续放大。
放大只会把模糊放得更大。

更好的链路是:

  1. 局部裁图:把插画所在区域裁出来,当参考
  2. 图生图重画:保留风格、构图和主色,重新生成一张高清插画
  3. 背景处理:如果插画要叠在页面背景上,就做透明底

透明底有两种办法:

  • 接口支持 alpha 通道:直接生成透明背景 PNG,省事
  • 第三方渠道不支持透明通道:用绿幕。让模型生成纯绿色背景的插画,再用程序把绿色扣掉

逻辑不复杂:遍历像素,只要绿色明显高于红色和蓝色,并且超过阈值,就把这个像素的 alpha 设成 0

from PIL import Image
import numpy as np

img = Image.open("asset_green.png").convert("RGBA")
arr = np.array(img)
r, g, b = arr[:, :, 0], arr[:, :, 1], arr[:, :, 2]

# 绿色明显占主导的像素,判定为背景,置为透明
mask = (g > 100) & (g > r * 1.4) & (g > b * 1.4)
arr[:, :, 3][mask] = 0

Image.fromarray(arr).save("asset_transparent.png")

阈值要看实际图片调。

边缘有时还要羽化,不然会出现硬边。

绿幕不好看,但它适合后处理。

白底也能扣,遇到浅色插画更容易误伤。

很多 UI 还原翻车,问题不在布局,而在资产。

图像


4. 完整流程:6 步跑一遍

前面讲的是判断。

落到执行,可以按这 6 步走。


4.1. 第 1 步:视觉拆解

先别写代码。

让模型只看图,输出一份页面地图

先只做拆解,暂时不要结果。

可以这样问:

仔细观察这张 UI 设计稿,不要写任何代码,只输出以下信息:

1. 页面整体布局:几栏、各栏占比、主要区域划分。

2. 从上到下、从左到右的组件清单。

3. 配色:主色、背景色、文字色、强调色,给出近似 HEX。

4. 字体层级:标题、正文、辅助文字的大致字号和字重。

5. 间距和圆角风格:紧凑还是宽松,大圆角还是小圆角。

6. 复杂视觉资产:logo、插画、产品图、3D 图等,需要单独生成,别用代码画。

做完视觉拆解,你手里会有一张施工图。

后面每一块交给谁,清楚很多。


4.2. 第 2 步:资产分离

根据页面地图,把元素分成两堆。

代码负责:

  • 导航
  • 按钮
  • 表格
  • 卡片
  • 输入框
  • 普通图标
  • 文字排版
  • 分割线
  • 标签

图片负责:

  • logo
  • 复杂插画
  • 产品截图
  • 人物图
  • 3D 图
  • 品牌主视觉
  • 空状态图

分类准则:拿掉它,页面结构还成立吗?

成立 → 多半是资产。
不成立 → 多半是结构。

这里分错,后面会一直跑偏。

模型硬画资产,页面会变廉价;把普通 UI 也拿去生图,又会增加抠图和替换成本。


4.3. 第 3 步:先搭 HTML 骨架

第一版不要追像素级。

先把布局骨架搭出来:整体用 flexgrid 定比例,各区域按原图排列摆上,填入基础颜色、字号、行高和圆角。

资产位置用灰色占位块标出来,尺寸也写上。

这版只看结构:左右比例对不对,内容顺序对不对,主要区域有没有错位。
骨架歪了,细节调再多也没用。


4.4. 第 4 步:生成并替换资产

把第 2 步分出来的资产,一个个走"裁参考图 → 图生图重画 → 处理透明底"的流程。

生成时要带风格约束,比如:

扁平插画风格,主色 #4F46E5,线条简洁,背景纯绿色,用于后续抠图。

资产做好后,再替换掉灰色占位块。

这里要按占位块尺寸摆,别让图片把布局撑开。

很多页面看着廉价,根源常常在资产:插画分辨率低、logo 变形,或者资产风格和页面不在一个系统里。


4.5. 第 5 步:浏览器截图

把 HTML 放进真实浏览器渲染,然后截图。

用 Playwright 就行,重点是视口宽度要和设计稿一致

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch()
    page = browser.new_page(viewport={"width": 1440, "height": 900})
    page.goto("file:///path/to/index.html")
    page.screenshot(path="render.png", full_page=True)
    browser.close()

一定要看截图。
代码里看不出字重是否发闷,也看不出行高是否太松。
按钮宽了 8px,插画低清,阴影太脏 —— 这些都要等渲染后才露出来。


4.6. 第 6 步:对比和修正

把原始设计稿和浏览器截图放在一起看。

两种办法可以一起用:

  • 左右并排:让模型逐区域指出差异
  • 叠加差异图:把两张图缩到同尺寸后半透明叠加,或者用 ImageChops.difference 算像素差

对比的价值,是把问题变得可定位

不要只说"不像"——这句话没法执行。

你要补具体描述:

  • 标题字重太高,改成 medium
  • 这里换行位置不对,应该一行放下
  • 右侧插图偏大,缩到 80%
  • 两个按钮之间间距太松,收窄到 12px

描述越具体,模型改得越准。

继续修 → 继续截图 → 继续对比。
质量就是在这个循环里出来的。


5. 复现不像,通常落在 6 类误差里

页面不像,不要急着重写。

先归类。

误差类型 症状 修正方向
布局误差 元素位置、宽高、对齐、边距不对 flex/grid 比例和 padding/margin
字体误差 字号、字重、行高、换行位置不对 font-sizefont-weightline-height
色彩误差 背景色、边框色、阴影、按钮色偏了 用取色工具从原图取 HEX,别靠模型估
资产误差 logo、插画、产品图糊了,风格不一致 重新生成资产,调提示词
密度误差 整体太松、太挤、太压、太空 调整间距系统,不要逐个像素硬拧
响应式误差 桌面端像,移动端崩 单独写移动端断点,别指望一套样式通吃

AI 容易发现大错位,但经常忽略廉价感

廉价感通常来自字重、间距、密度和资产质量。
这几样需要人盯。
你不指出来,它可能会觉得已经差不多了。


6. 后验机制才是质量来源

AI 写完代码后,并不知道自己渲染出来像不像。

在代码层面,很多问题是隐形的:字重偏高,行高偏松,按钮宽了几个像素,插画分辨率不够。

这些都要等页面跑起来才看得见。

流程里一定要有后验机制:

渲染 → 截图 → 对比 → 修正

第一版代码只是起点。

真正的还原质量,来自后面的反复校准。

别把 UI 还原当成一次性生成任务。
把它当成一轮又一轮的误差收敛。

图像


7. Skill 自动化了哪些重复动作

上面这套流程,手动跑一遍很烦。

裁图、图生图、抠图、替换、截图、拼对比图,再把结果喂回模型。

做一次还行,做多了就想把它封起来。

我把它整理成了一个 Skill,主要自动化这些动作:

  • 识别页面里哪些资产需要单独生成
  • 对局部区域做图生图
  • 对绿幕或白底资产做抠图
  • 把资产替换回 HTML
  • 用浏览器截图
  • 生成左右对比图和布局差异图
  • 让模型基于截图继续修正

后面我会整理好放到 GitHub 开源分享给大家。

Skill 没有魔法。
它更像一套流程外壳,把重复劳动包起来。
流程没想清楚,工具只会更快地产出一版粗糙页面。


8. Codex 内置生图会让这件事轻一些

最早我以为,图生图环节必须接外部渠道。

后来发现,Codex 里已经内置了生图工具。

在 Codex 环境下,可以优先用它自己的工具生成图片,不一定要额外配置外部平台。

具体工具名以发稿时实际可用的为准,这里不写死版本号。

这点不改变方法,只是让资产处理少折腾一点。


9. 今晚可以直接用的检查清单

如果你手上正好有一张 AI 生成的 UI 设计稿,先别急着问"帮我生成 HTML"。

先问这 5 个问题:

# 问题
1 这个页面能拆成几个区域?
2 哪些元素是结构,哪些元素是资产?
3 哪些资产需要单独图生图?
4 第一版 HTML 截图和原图差在哪里?
5 这个差异属于布局、字体、颜色、资产、密度,还是响应式问题?

能回答这 5 个问题,复现效果通常会好很多。

因为你不再赌模型一次猜对。
你是在带着它校准