创新方案
需要为 iOS App Store…
当你要为 iOS App 生成符合 App Store 规范的营销风格截图(含多语言、多主题、4 种分辨率)时,用单文件 Next.js 生成器渲染 HTML 画布并导出 PNG。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
需要为 iOS App Store 快速通用
解决思路
- 用 `npx skills add ParthJadhav/app-store-screenshots` 安装技能(当前项目);加 `-g` 全局安装;加 `-a claude-code` 指定某个 agent;也可手动 `git clone https://github.com/ParthJadhav/app-store-screenshots ~/.claude/skills/app-store-screenshots`
- 生成任何东西之前,先向用户询问品牌色、字体、功能卖点、风格方向、slide 数量和 locales
- 脚手架出一个最小 Next.js + TypeScript + Tailwind 项目,目录为:`public/mockup.png`(iPhone 边框,屏幕区域透明)、`public/app-icon.png`、`public/screenshots/`(可按 locale 嵌套)、可选 `public/screenshots-ipad/`、`src/app/layout.tsx`(字体设置)、`src/app/page.tsx`(整个生成器放在这一个文件里)、`package.json`、`next.config.ts`
- 把整个截图生成器写在单个 `src/app/page.tsx` 中;跑起 dev server,浏览器打开后点击任意截图即可导出 PNG
- 在 page.tsx 里用 `THEMES` 定义主题预设(bg / fg / accent / font),例如 clean-light `#F6F1EA` / `#171717` / `#5B7CFA` / Inter、dark-bold `#0B1020` / `#F8FAFC` / `#8B5CF6`、warm-editorial `#F7E8DA` / `#2B1D17` / `#D97706` / Playfair Display;不硬编码颜色,全部走主题 token
- 定义 `EXPORT_SIZES`:6.9" 1320×2868(设计基准)、6.5" 1284×2778、6.3" 1206×2622、6.1" 1125×2436
- 用 `SLIDES` 数组描述每张 slide:id、headline(可含 `\n`,配 `whiteSpace: "pre-line"` 换行)、subheadline、screenshot 路径、layout(`phone-left` / `phone-right` / `phone-center`)
- 实现 `ScreenshotSlide` 组件:在 1320×2868 画布上用绝对定位放标题(约 top 180、left/right 80、fontSize 96、fontWeight 800、lineHeight 1.1)和副标题(top 520、left 80、fontSize 48、accent 色),并按 layout 把手机 mockup 贴到左/右/居中
- 手机 mockup 用 660×1430 容器:app 截图以 `position:absolute; top:28px; left:24px; width:612px; borderRadius:52px` 放在底层,`mockup.png` 以 `position:absolute; inset:0; width:100%` 盖在上层——截图在边框后面,而不是塞进边框里
- 写 `exportSlide(ref, slideId, size, locale, themeName)`:`scale = w / 1320`,调用 `toPng(ref.current, { width: w, height: h, style: { transform: \`scale(${scale})\`, transformOrigin: 'top left' } })`,再创建 `<a>` 设 `download = \`slide-${slideId}-${locale}-${themeName}-${size}in.png\`` 并 click 触发下载
- 主页面加控件:主题切换按钮、`Export All` 按钮(双层循环遍历所有 slide × 所有尺寸导出)、以及每张 slide 下方的各尺寸单独导出按钮
- 多语言:截图按 `public/screenshots/{locale}/home.png` 组织,并用 `COPY` 字典按 locale + slide id 提供 headline / subheadline
- RTL 支持:判断 locale 是否属于 `['ar','he','fa']`,用 `dir=\"rtl\"` 和 `textAlign: right` 的 `LocaleCanvas` 包裹内容,让 RTL 布局显得原生而非机械镜像
- 依赖:`next ^14.0.0`、`react ^18.0.0`、`react-dom ^18.0.0`、`html-to-image ^1.11.11`;devDependencies:`typescript ^5.0.0`、`@types/react ^18.0.0`、`@types/node ^20.0.0`、`tailwindcss ^3.4.0`、`autoprefixer ^10.4.0`、`postcss ^8.4.0`
- 用包管理器启动(优先 bun):`bun install && bun dev`,或 `pnpm install && pnpm dev`、`yarn && yarn dev`、`npm install && npm run dev`;然后打开 http://localhost:3000
- 导出前 `await document.fonts.ready`,并用 `next/font` 或在画布 div 内嵌 `<style>` 加载字体(只在 `layout.tsx` 里加不够),避免导出时字体缺失
- 所有图片从 `/public` 同源提供;若从 CDN 加载,给 `<img>` 加 `crossOrigin="anonymous"`,否则 html-to-image 会导出空白/白图,并在控制台排查 CORS 报错
- 始终以 1320×2868(6.9")为设计基准向下缩放导出,并给 `toPng()` 显式传 `width`/`height` 和正确的 scale transform;不要设计小图再放大,否则模糊
- 初始 app 截图统一用 6.1" 模拟器抓取,避免后续再做分辨率调整
- 设计原则一:截图是广告不是文档——每张 slide 只卖一个想法
- 设计原则二:1 秒规则——标题在 App Store 缩略图尺寸下也必须可读
- 设计原则三:相邻 slide 变换布局——不要两张相邻 slide 用同一个手机位置(`phone-left` / `phone-right` / `phone-center`)
- 设计原则四:风格由用户驱动——不硬编码颜色,一切从主题 token 流出
- 设计原则五:第一张 slide 放最强的用户收益,而不是最复杂的功能
- 导出前逐项核对质量清单:标题约 1 秒内只传达一个想法;第一张 slide 以最强用户收益开场而非功能;相邻 slide 手机位置布局不同;装饰元素服务信息而不遮挡 UI;缩到最小导出尺寸(6.1")后文案与构图仍正确;RTL locale 已设 `dir=\"rtl\"` 且布局自然(不是机械镜像)
- mockup 与截图错位时:用自带的 `mockup.png`(已量好透明屏幕区域),app 截图用 `position: absolute` 放在边框下层,起始偏移用 `top: 28px, left: 24px`(针对 660px 宽 mockup)
适用边界 · 注意事项
- 目标不是 iOS App Store(例如 Android / Google Play 或其他分发渠道)时,尺寸与规范都不适用
- 需要的是真实设备原生截图,而不是 HTML/CSS 合成渲染的营销图时
- 环境里没有 Node.js 18+,或无法运行 Next.js 开发服务器 / 浏览器环境