` 标签自身不能有 background/border/shadow(放外层 div)
- 不用 `::before`/`::after` 插入装饰文字(伪元素提不出来)
- inline 元素(span/em/strong)不能有 margin
- 不用 CSS gradient(不可渲染)
- div 不用 `background-image`(用 `
`)
脚本已内置**自动预处理器**——把 "叶子 div 里的裸文本" 自动包成 ``(保留 class)。这解决了最常见的违规(裸文本)。但其他违规(p 上有 border、span 上有 margin 等)仍需 HTML 源头合规。
**editable 模式的另一个 caveat——字体回落**:
- Playwright 用 webfont 测量 text-box 尺寸;PowerPoint/Keynote 用本机字体渲染
- 两者不同时会有**溢出或错位**——每页都要肉眼过
- 建议目标机器装好 HTML 里用的字体,或 fallback 到 `system-ui`
### 从一开始就让 HTML 对导出友好
对性能最稳的 deck:**从写 HTML 时就按 editable 模式的约束写**。这样 `--mode editable` 可以直接全部 pass。额外成本不大:
```html
关键发现
关键发现
41%
```
### 何时选哪个
| 场景 | 推荐 |
|------|------|
| 给主办方/档案存档 | **PDF**(通用、高保真、文字可搜) |
| 发给协作者让他们微调文字 | **PPTX editable**(接受字体回落) |
| 要现场演讲、不改内容 | **PDF** 或 **PPTX image** |
| HTML 是首选呈现媒介 | 直接浏览器播放,导出只是备份 |
## 导出为可编辑 PPTX 的深度路径(仅长期项目)
如果你的 deck 会长期维护、反复修改、团队协作——建议**一开始就按 html2pptx 约束写 HTML**,让 `--mode editable` 稳定通过。详见 `huashu-slides` skill 的 `references/prompt-templates.md` 第 2 节(4 条硬性约束)。
---
## 常见问题
**多文件:iframe 里的页打不开 / 白屏**
→ 检查 `MANIFEST` 的 `file` 路径是否相对 `index.html` 正确。用浏览器 DevTools 看 iframe 的 src 能否直接访问。
**多文件:某页样式和别页冲突**
→ 不可能(iframe 隔离)。如果感觉冲突,那是缓存——Cmd+Shift+R 强刷。
**单文件:多 slide 同时渲染叠加**
→ CSS 特异性问题。看上面「单文件架构的 CSS 陷阱」一节。
**单文件:缩放看起来不对**
→ 检查是否所有 slide 直接挂在 `` 下作为 ``。中间不能包 ``。
**单文件:想跳到特定 slide**
→ URL 加 hash:`index.html#slide-5` 跳到第 5 张。
**两种架构都适用:字在不同屏幕下位置不一致**
→ 用固定尺寸(1920×1080)和 `px` 单位,不要用 `vw`/`vh` 或 `%`。缩放统一处理。
---
## 验证检查清单(做完 deck 必过)
1. [ ] 浏览器直接打开 `index.html`(或主 HTML),检查首页无破图、字体已加载
2. [ ] 按 → 键翻到每一页,没有空白页、没有布局错位
3. [ ] 按 P 键打印预览,每页恰好一张 A4(或 1920×1080)且无裁切
4. [ ] 随机选 3 页 Cmd+Shift+R 强刷,localStorage 记忆正常工作
5. [ ] Playwright 批量截图(单页架构:遍历 `slides/*.html`;单文件架构:用 goTo 切换),人工肉眼过一遍
6. [ ] 搜一下 `TODO` / `placeholder` 残留,确认都清理了