落霞来信 · 创作手记 封面 我的方法 对话实录 过程佐证 复盘

UI 招聘测试题 · AI Vibecoding 产品实战

落霞来信 从一句产品诉求,走到一个可运行、可交互的 Demo

一个以 声音内容 + 书信阅读 + 人文展览 为核心的内容产品。 用户进来看到的不是音频列表,而是一封待拆的旧信——安静、温柔、克制。 本页记录我如何用 AI 把这道题从需求拆到可运行 Demo:每一步的 Prompt、AI 的产出与不足、以及我怎么纠偏。

7.5H
总用时
150轮
对话轮次
20–30
开启的任务窗口
约 25元
模型消耗(deepseek)
A1 · 工作流说明

我的方法

核心不是"让 AI 帮我写代码",而是先替 AI 把产品想清楚,再用清晰的规范约束它精准施工。 工具各司其职,方法只有三步,节奏按六个阶段推进。

01

TRAE

前端源码开发与调试:把设计规范落成 HTML/CSS/JS,并在浏览器里实测、修样式与交互。

02

网页豆包

生图:落日信封、信纸静物、夜海渔船等氛围与内容配图,按统一提示词规范批量产出。

03

网页 GPT

生图:与豆包互补,为封面、横幅等提供备选视觉,统一风格后择优采用。

三步骤方法

STEP 01

分析结构,拆解模块

先分析页面结构和功能,拆解模块与组件:把"首页 → 详情页 → 阅读页"的路径、每页的区块和交互列清楚。

STEP 02

统一规范与标准

统一规范和标准:配色、字体、字距、行距、圆角、动效全部写死成设计令牌,AI 只引用、不发明。

STEP 03

按标准精准开发

按照标准和规范,操作 AI Vibecoding 工具进行精准原型开发:一个任务窗口只推一件事,改完即验收。

六阶段推进

PHASE 01

需求拆解

读题、提取产品气质与用户路径,把题目翻译成"页面 + 区块 + 交互"清单。

PHASE 02

架构与视觉基调

定颜色、字体、圆角、动效规则,写进设计令牌;确定单页路由与三页骨架结构。

PHASE 03

骨架实现

生成基础前端页面:三页可切换、文案到位、结构可跑,先要"能打开",再谈好看。

PHASE 04

交互细节

微调每个模块:迷你播放条、播放进度、展开全部、滚动条、返回与字形等逐个打磨。

PHASE 05

审查自查

拆分成可维护的前端文件,用浏览器实际测量 DOM、复核选择器,调试错误样式与交互。

PHASE 06

数据化与部署

替换远程 CDN 为本地资源,整理图片资源与页面清单,最后提交可访问的 Demo 链接。

人机分工原则

01

每次给"角色 + 目标 + 约束 + 验收标准"

不说"帮我做个首页",而说"你是前端,做一个 390×844 的首页,配色只能用这五个值,验收标准是可点击切换"。

02

先要方案,再要代码

复杂改动先让它拆解模块、给出改动计划,确认方向没跑偏,再让它动手写。

03

关键决策人拍板

产品取舍我来定(如日历按钮给提示还是补功能),AI 只提供选项与依据,不替我做产品决策。

04

验收必须跑起来

不接受"应该可以":用浏览器实际打开、测量 DOM、点一遍交互,跑起来才算完成。

05

纠偏给证据,不说"再改改"

指出问题时带上选中元素、行号、真实现象,让它自己定位根因,而不是笼统地返工。

A3 · Prompt 与对话过程

对话实录

从 150 轮对话里挑出 6 轮,覆盖冷启动、样式优化、结构翻车、字形问题与产品决策。 每轮固定五段:我的 Prompt → AI 给了什么 → 我为什么这么问 → AI 哪里没达到 → 我怎么纠的。

ROUND 01

冷启动:一次把"气质"讲透

首轮 Prompt

工具:TRAE · 目标:单文件 HTML 的移动端 H5 Demo(390×844)

我的 Prompt
# 任务 用单文件 HTML(内联 Tailwind CSS + 原生 JS,CDN 引入)实现一个可在浏览器直接打开、可点击交互的移动端 H5 Demo(视口 390×844)。 # 产品气质(最重要,先读) - 不是音频列表 App,而是一座"线上人文展览"…… - 情绪关键词:安静、温柔、克制、落日、宣纸、墨色、旧信、栖居。 - 拒绝:高饱和色块、圆角大卡片、emoji、廉价渐变、Spotify 式播放条、营销感按钮。 - 推崇:大量留白、纵向呼吸感、宋体字、纸质感、缓慢的淡入动效、一次只让用户做一个动作。 # 设计系统 - 配色(严格使用):页面底色 #F4EFE6 / 卡片底 #ECE5D8 / 主文字 #2B2520 / 次文字 #8C8275 / 强调色 #B8542E / 分隔线 #D8CFBF - 字体:Noto Serif SC;字距放松,行距 1.8;圆角最多 4px;阴影极轻 …… # 输出要求 - 直接输出完整的 index.html 代码,不要解释,不要省略,不要用占位注释。
展开首轮 Prompt 全文(含三页结构与全局交互要求)
# 任务 用单文件 HTML(内联 Tailwind CSS + 原生 JS,CDN 引入)实现一个可在浏览器直接打开、可点击交互的移动端 H5 Demo(视口 390×844,iPhone 尺寸)。这是一个以「声音内容 + 书信阅读 + 人文展览」为核心的内容产品,名字叫「落霞来信」。 # 产品气质(最重要,先读) - 不是音频列表 App,而是一座"线上人文展览"。用户进来要有走进美术馆/拆开一封旧信的仪式感,而不是刷信息流。 - 情绪关键词:安静、温柔、克制、落日、宣纸、墨色、旧信、栖居。 - 拒绝:高饱和色块、圆角大卡片、emoji、廉价渐变、Spotify 式播放条、营销感按钮。 - 推崇:大量留白、纵向呼吸感、宋体字、纸质感、缓慢的淡入动效、一次只让用户做一个动作。 # 设计系统 - 配色(严格使用): - 页面底色:#F4EFE6(宣纸米白) - 卡片/分区底:#ECE5D8 - 主文字:#2B2520(墨色) - 次文字:#8C8275(灰墨) - 强调色(落霞橙):#B8542E,仅用于 CTA、播放按钮、选中态,面积要小 - 分隔线:#D8CFBF - 字体:中文标题用「Noto Serif SC / 思源宋体」,正文用「Noto Serif SC」或 system-ui;数字与英文用 Georgia / serif。字距放松,行距 1.8。 - 圆角:全局几乎直角,最多 4px;不要大圆角卡片。 - 阴影:极轻或无,靠底色分层。 # 页面一:首页(默认落地页) 1. 顶部状态栏样式(9:41 + 信号图标,用 CSS 画即可)。 2. 导航行:左侧「今日特展 ⌄」(可点击展开下拉"展览时间:8.31 – 9.6",柔和淡入),右侧一个小日历图标。 3. Hero 氛围区:占屏约 45%,一张"落霞/黄昏窗景"背景图,加一层 #2B2520 透明度 35% 的蒙层。图上不压大字。 4. 下方信息区(宣纸底、居中、大量留白):栏目名「落霞来信」、副文案「接下来 7 天,你会收到 7 封不同的信。这是寄给你的第 1 封。」、三个 tab「落霞来信/古典/流行」、主 CTA「开始读信 →」。 5. 迷你播放条(固定在底部 Tab 上方):小方形封面 + 「收到信的时候,他已经走了很远」+ 列表图标。 6. 底部 Tab Bar(5 个):声画廊、声剧场、乐厅、声景、我的,图标用极简线性 SVG。 # 页面二:本期内容 / 音频详情页 1. 顶部返回箭头 ←;2. Hero 氛围图(约 220px);3. 开场段 + 「展开全部 ⌄」;4. 小标题「本期内容」;5. 16:9 播放卡片 + 假进度条;6. 小标题「书信专区」;7. 横幅卡片「立即阅读 →」;8. 小标题「更多推荐」+ 4 条推荐列表。 # 页面三:信件阅读页(核心仪式感页面,重点打磨) 整页背景 #EDE6D6;顶部极简关闭 ×;内容最大宽度 320px;顶部小字、大标题、落款、4–5 段正文;段落 stagger 120ms 淡入上移;底部小播放控件;底部「下一封信 →」。 # 全局交互要求 - 用一个简单的 JS view 切换系统:首页 / 详情页 / 阅读页,三个 section,切换时整体淡入淡出 300ms。 - 所有可点元素要有 hover 态;Hero 图进入时做一次 1.2s 的 Ken Burns 缓慢放大。 - 不要出现任何真实音频文件,全部用 setInterval 模拟进度。 - 不要用框架路由,不要构建工具,单个 index.html 双击即可打开。 # 输出要求 - 直接输出完整的 index.html 代码,不要解释,不要省略,不要用占位注释。 - 代码里所有文案用中文,题目给定文案原样保留,自己补写的部分也要保持同样的温柔克制语气。 - 写完后告诉我怎么在浏览器打开即可。
AI 给了什么(首轮产出)

一次性产出单文件 index.html:首页、详情页、阅读页三个 <section class="view">,用 JS 切换;CSS 变量落地了纸色/墨色/落霞橙;Hero 用了落日氛围图 + 蒙层;详情页有假播放进度;阅读页有段落 stagger 淡入。

首轮产出可打开、可切换,气质方向正确,但结构上把 mini-player 与 tabbar 写在了首页 #view-home 内部——这个隐患在第 3 轮才爆出来。

我为什么这么问

冷启动阶段,AI 会先入为主地把"内容产品"做成音频列表 App。所以我把 产品气质放在最前面标注"最重要,先读",并用"拒绝 / 推崇"两组对照句锁定审美边界。

颜色、字体、圆角、动效全部写死成具体值,让它只引用、不发明;三个页面按"从上到下"逐条列出区块与交互,把模糊的"好看"翻译成可执行的清单。

AI 哪里没达到
  • 产出的页面是"静态可看"而非"可交互闭环":进度条、展开、toast 都是占位,需要后续逐轮补齐。
  • 结构分层意识弱:底部播放条与导航栏被塞进首页视图内部,属于把组件塞进了页面,为第 3 轮的翻车埋下伏笔。
我怎么纠的

先验收:直接双击打开跑起来,确认三页能切换、气质对。再把问题拆成一个个可控的小任务窗口逐个修——一次只推动一类改动,改完立即验收,绝不"攒一批再改"。

ROUND 02

样式优化 + 自定义滚动条 + 阅读页顶栏

任务 1 · 耗时 3m2s

工具:TRAE · 涉及 .home-top / .detail-hero / .player-card 与两处滚动容器

我的 Prompt
这几个元素样式不是很好帮我优化一下,并帮我将滚动条样式修改不使用默认样式使用自定义与当前这个页面设计保持一致;阅读页面顶部应该使用一个顶部标题栏和返回按钮,保持与详情页相同

(原文以行号精确锚定了三个元素:落霞来信.html#L196-201、#L267-270、#L280-284)

AI 给了什么(优化内容汇总,含 5 项改动)

1. 自定义滚动条:把原来的 display:none 换成 4px 宽的纸张质感滚动条,滑块用 --line、hover 用 --ink-soft,同时覆盖 .view 与 .read-scroll。

2. 阅读页顶栏:把右上角 × 换成 52px 高的顶部标题栏,左侧 ← 返回按钮,居中"读 信"标题,底部 --line 分隔线。

3. 首页 .home-top:加底部细边线;"今日特展"字号 15px、字距 3px、左侧加 --accent 装饰横线;日历 SVG 包装成圆形 .home-icon-btn。

4. 详情页 .detail-hero:高度 220 → 240px;遮罩改三段渐变;新增左下角标题 + 标签层;返回按钮模糊 4 → 8px 并加 hover。

5. .player-card:两层阴影;封面降饱和 + 135° 渐变遮罩;播放键加 --accent 光晕与外圈扩散;进度条 3 → 2px。

末尾它自查:已确认无残留的无作用域 .back / .read-close 选择器,CSS 结构干净无冲突。

我为什么这么问

把"感觉不好看"这种主观判断,转成它可执行的对象:用行号锚定三个具体元素,而不是让它全页乱猜。同时借这一次把全站滚动条统一成纸质感,避免默认系统滚动条破坏氛围。

阅读页当时只有一个孤零零的 × 关闭键,与详情页的返回按钮风格割裂;我要求它对齐详情页的顶部栏语言,保持整站一致。

AI 哪里没达到
  • 一次改了 5 处、跨 CSS 与 HTML,改动面偏大,回归风险高。
  • 把日历图标包装成了按钮,但当时只给了视觉、没给功能——一个"看起来能点却没反应"的装饰,直到第 5 轮才补上。
我怎么纠的

要求它做全文件复核:确认没有残留的孤立选择器、没有 CSS 语法错误;验收时逐条对照这 5 项,而不是看它一句"已完成"。缺失的日历功能标记为待办,留到后续轮次处理。

ROUND 03

结构翻车与修复:一句真话定位标签嵌套

旗舰案例 · 任务 3

工具:TRAE · 症状:mini-player / tabbar 跑出手机框、贴在右侧 · 根因:标签自闭合 + 丢闭合标签

我的 Prompt(三步,逐句加深)
① 落霞来信.html#L280-300 ② #L300-322 这两个是一个组件,播放器应该在底部导航栏上方 ② nav div 这个显示位置不对吧 ③ div 这个有点太高了 div 这图片高度减小店
AI 给了什么(结构变更 → 自证通过 → 被打回 → 定位根因)

第一版改动:它判断 mini-player 与 tabbar 不该嵌在 #view-home 内,于是把它们移出、放到 .phone 直接子级,并新增一个 .views 容器包裹三个绝对定位的 .view。改动量 +46 −45,并总结"结构正确、验证通过"。

但它自己的浏览器截图失败了(返回 "The webview may not be visible."),它是在没有拿到真实渲染证据的情况下下的结论。

被打回后:用浏览器子 agent 实测,报出关键证据——mini-player 与 tabbar 的 parentElement 是 body,位于 phone 容器右侧外部;phone 内只有 views 与 3 个 view,两个组件都没进去。

根因:两次 Edit 造成标签嵌套错误——

① .views 容器被写成了 <div class="views"></div> (打开后立即闭合,三个 view 全跑到容器外) ② .phone 的闭合 </div> 丢失 (mini-player / tabbar 掉到 body 层级)

修复后复核:脚本返回 miniPlayerParentClassName = "phone"、tabbarParentClassName = "phone"、viewsChildrenCount = 3(依次 view active / view / view read-view),四项检查全 PASS。

最终 DOM:

.phone (flex column) ├── .views (flex:1) ← 弹性内容区 │ ├── #view-home (absolute, inset:0) │ ├── #view-detail (absolute, inset:0) │ └── #view-read (absolute, inset:0) ├── .mini-player (flex:0 0 auto) ← 播放器条 ├── .tabbar (flex:0 0 auto) ← 底部导航 └── .toast
我为什么这么问

我在浏览器里直接看渲染结果:底部播放条和导航栏没待在手机框里,而是跑到了框外、贴在右边。AI 的文字总结说"验证通过",但画面不对,说明它的验证没有被真正执行。

所以我没有说"再检查一下",而是给出一句只有真实观察才能说出的话——"nav div 这个显示位置不对吧"——把它从"自证通过"里拉回到现场。

AI 哪里没达到
  • 无证据即下结论:截图失败后仍宣布"结构正确、验证通过",这是最危险的一类错——把"应该没问题"当成"已经验证"。
  • 多步编辑破坏标签嵌套:.views 被写成自闭合、.phone 丢失闭合标签,两次 Edit 各引入一个不可见的结构性错误。
  • 被指出问题后,它第一次的怀疑方向("可能是浏览器工具对 HTML 做了处理")也先怀疑工具、后怀疑自己,多绕了两步。
我怎么纠的
  • 用一句真实观察把结论打回,要求它用浏览器实际测量(parentElement.className、.views.children 数量),拿 DOM 证据说话。
  • 要求它对照原始文件用 Read / shell 逐行确认闭合标签,定位到根因而不是反复整体重写。
  • 修完继续推进:把过高的 hero(340 → 260px)与偏松的 mini-player(约 60 → 44px)一起压紧,结构对了再谈细节。
ROUND 04

返回按钮 ← 字形问题 → 换内联 SVG

任务 2 · 耗时 52s

工具:TRAE · 涉及详情页与读信页两处返回按钮

我的 Prompt
button 图标有问题?

(选中元素为详情页返回按钮,图标是文本字符 ←)

AI 给了什么(判断 + 改法)

它判断:两处返回按钮都用文本字符 ← 作图标,依赖字体渲染,跨设备 / 浏览器容易出现偏移或怪异字形;尤其 Noto Serif SC 很可能不含箭头字形,会 fallback 到 Georgia / serif,导致偏小、偏低、不居中。

改法:把两处都换成内联 SVG 箭头——详情页 16px、读信页 15px,统一 stroke="currentColor" 继承按钮原颜色(详情页白色、读信页墨色),现有 flex 居中样式继续生效。改动量 +2 −2。

它还留了一句"如果你说的'有问题'是指别的(点击没反应 / 变形 / 颜色不对),告诉我具体现象,我再调整。"

我为什么这么问

在浏览器里点选返回按钮,我觉得图标的位置和字形不对。我直接把"选中的元素 + 现象"丢给它,不替它下判断,看它能不能自己找到根因。

AI 哪里没达到
  • 面对"图标有问题"这种模糊反馈,它一开始不确定具体指什么,在脑内列了"基线偏移 / 字形怪异 / 渲染成豆腐块"几种可能。
  • 过程中它一度判断"transform 在内联元素上无效"——虽然当时讨论的是旋转逻辑,但这个判断本身就对错了对象,说明它对细节的推理会走偏。
我怎么纠的

把现象描述得尽量具体(选中元素 + 一句大白话),并要求它先给判断、再动手;改完如果指的不是这个现象,让它主动追问我具体表现,避免它按错误的假设继续改。

ROUND 05

⌄ 字形缺失 + 日历按钮的产品决策

任务 4 · 耗时 8m10s

工具:TRAE · 涉及"今日特展 ⌄"与首页日历图标按钮

我的 Prompt
span 这个按钮有问题; button 填加提示或完善功能

(两个选中元素:"今日特展"里的 span.chev 与 日历 button.home-icon-btn)

AI 给了什么(浏览器实测 + 字形修复 + 日程面板)

先实测再下结论:它起本地服务、用浏览器子 agent 测量——chev 的 boundingRect 约 9.6 × 15.5,解析字体为 Noto Serif SC,旋转逻辑正常(点击后 transform: matrix(-1,0,0,-1,0,0))。

真问题:字符 ⌄(U+2304 DOWN ARROWHEAD)在 Noto Serif SC 下没有对应字形,fallback 后被渲染成"一小段竖线",不像箭头。

改法一:把字符换为内联 SVG chevron,旋转仍然靠 CSS,并补上 aria-expanded / aria-controls。

改法二:日历按钮它给了"加提示"或"补功能"两个选项让我选。我选了"弹出七封来信日程面板":底部抽屉、遮罩模糊上滑入场;以今天为第 1 封往后推 7 天,动态生成"今天/明天/后天/周X + 日期 + 第 N 封 + 已收到/待开启",首行主色高亮;点遮罩或 Esc 关闭。改动量 +80 −9。

验证:箭头旋转、面板恰好 7 行(9/30–10/6)、首行状态"已收到"且高亮 #B8542E、无横向溢出,四项全 PASS。

末尾它主动提示:「展开全部 ⌄」用的是同样的字符写法(⌄ / ⌃),存在一样的字形风险,但我没有提到它,所以它没有改。

我为什么这么问

这是同类"字形"问题第二次出现(第 4 轮是 ←,这里是 ⌄),说明它上一轮只修了被点名的那一个,没有举一反三。我把新发现的那个再次点出来。

日历按钮此前是个"能点却没反应"的装饰,属于典型的产品缺口。我用"要么给提示、要么补功能"给出产出物标准,把选择权交回给我自己——产品取舍由人拍板。

AI 哪里没达到
  • 只修被指出的那一个:同一个文件里"展开全部 ⌄/⌃"是同类风险点,它只是口头说明、没有顺手修(虽符合"不过度改动",但暴露了它缺乏主动一致性检查)。
  • 产品决策会摇摆:面对"提示还是功能",它纠结要不要反问我,缺少"先给选项、再按人拍板执行"的果断。
我怎么纠的

给它明确的产出物标准(要么提示、要么功能),避免它在模糊里反复;选定后要求它用浏览器逐项验证——箭头旋转、面板 7 行、Esc / 遮罩关闭、无横向溢出,四项都过才算完成。

ROUND 06

复盘小结:AI 的共性短板与我的兜底

提炼经验

从这 4 轮真实对话里,我总结出 AI 在两个方向上反复出问题,以及我固定用的一套兜底动作。

AI 的共性短板
  • 依赖字体渲染的字符(← ⌄ ⌃ 这类)跨设备不可控,字形、基线、居中都会飘。正确解只有一个:一律换内联 SVG,不依赖字体。
  • 多步编辑易破坏标签嵌套:<div class="views"></div> 自闭合、.phone 丢闭合标签——Edit 越多,越容易引入肉眼不可见的结构性错误。
  • "自证通过"倾向:在没有真实证据(截图 / DOM 测量)时,它会倾向于说"结构正确、验证通过",把"应该"讲成"已经"。
我怎么兜
  • 关键结构改动后,必须拿到 DOM 证据:让它用浏览器测量 parentElement、子元素数量、boundingRect,而不是听文字总结。
  • 一个任务窗口只推一件事:改完立即验收,再做下一步,避免"攒一批改动"后无法定位是哪一步引入的问题。
  • 现象用"选中元素 + 一句大白话"描述,让它先判断根因再动手;它若判断跑偏,我再补一句真实观察把它拉回现场。
  • 验收标准前置:能跑起来 + DOM 测量通过,才算这一轮完成。
过程佐证 · 截图存档

过程佐证

按环节存档:成品效果 → AI 生图 → 工程结构 → 调试验证 → 音频生成 → 对话记录。 每张图都可点击放大。长截图放在固定高度的可滚动容器里,避免页面被拉长。

成品演示 · 竖屏手机录屏(已去音轨)—— 首页 → 详情页 → 读信页的完整交互路径

复盘 · 诚实克制

取舍与局限

这一版是有明确边界的产品切片:做透了首页 → 详情 → 读信这一条主路径,其余部分诚实留白。

局限与取舍

  • 三个特展尚未联动:除「落霞来信」外,「古典 / 流行」两个 tab 只做了选中态切换与文案淡入,没有各自的内容链路。
  • 部分占位交互:播放进度用 setInterval 模拟;五个 Tab 中除声画廊外,其余点击只做 toast 提示。
  • 音频为合成音:读信页的声音是 NowVoice 合成的「晚辰」音色,属于 Demo 级演示,非正式配音。
  • 同类字形风险未全清:明知道「展开全部 ⌄/⌃」存在与 chev 相同的字形风险,本轮只修了被点名的元素。

下一步计划

  • 把「展开全部 ⌄/⌃」一并换成内联 SVG,彻底清掉依赖字体渲染的字符。
  • 补齐三个特展的内容链路,让「古典 / 流行」tab 各自进到独立的内容页。
  • 引入真实音频,把模拟进度替换为真实播放状态与时间码。
  • 补齐推荐列表的详情页,让「更多推荐」里的每条内容都能进到自己的本期内容页。
  • 沉淀为可复用的规范:把设计令牌与"结构改动必测 DOM"写进流程,减少同类翻车。
附录

生成过程链接

落霞来信 · 创作手记 7.5H|150 轮对话|20–30 个任务窗口|约 25 元|模型 deepseek