857 lines
23 KiB
Markdown
857 lines
23 KiB
Markdown
# H5 原型 → 微信小程序迁移桥接规范(可执行版 v2.0)
|
||
|
||
> 适用对象:人工开发、AI 批量迁移、代码审查、验收回归
|
||
> 适用范围:本项目上传的 H5 原型页面、配套 CSS/JS、静态资源
|
||
> 目标:在微信原生小程序中实现页面与交互的高还原迁移;除字体渲染细微差异外,样式、层级、动效、状态切换、页面流转尽量 1:1 对齐 H5 验收原型
|
||
|
||
---
|
||
|
||
## 1. 文档定位
|
||
|
||
这不是知识笔记,而是执行规程。
|
||
|
||
使用本规范时,AI 或开发者必须做到:
|
||
|
||
1. 能从单个 H5 页面产出对应的小程序页面文件。
|
||
2. 能明确哪些能力可直接迁移,哪些必须降级,哪些禁止直迁。
|
||
3. 能在不使用 DOM API 的前提下,把 H5 交互改造成小程序的数据驱动实现。
|
||
4. 能输出可交付物,而不是停留在“分析建议”。
|
||
|
||
本规范优先级高于旧版桥接文档。若旧版文档与本规范冲突,以本规范为准。
|
||
|
||
---
|
||
|
||
## 2. 项目级输入与输出契约
|
||
|
||
### 2.1 输入物
|
||
|
||
单页迁移时,输入物必须至少包含:
|
||
|
||
- 对应 H5 页面 HTML 文件
|
||
- 该页面引用的 CSS(页面内 `<style>`、独立 css 文件、Tailwind utility)
|
||
- 该页面引用的 JS
|
||
- 该页面依赖的图片 / 图标 / SVG / JSON Mock
|
||
- 页面跳转关系和入口参数
|
||
|
||
### 2.2 输出物
|
||
|
||
每个页面迁移后,必须至少产出:
|
||
|
||
- `pages/<route>/<route>.wxml`
|
||
- `pages/<route>/<route>.wxss`
|
||
- `pages/<route>/<route>.js`
|
||
- `pages/<route>/<route>.json`
|
||
- 该页面使用到的 mock 数据文件或页面内 mock 常量
|
||
- 迁移说明(至少包含:状态变量、事件、待确认项、降级项)
|
||
|
||
### 2.3 不允许的输出
|
||
|
||
以下结果视为未完成:
|
||
|
||
- 只给“迁移思路”,不产出页面文件
|
||
- 只把 Tailwind class 翻译成 CSS,不改 WXML / 交互
|
||
- 继续依赖 `document.*`、`window.*`、`history.*`、`localStorage` 等浏览器 API
|
||
- 以“兼容性未知”为由保留 H5 写法不处理
|
||
- 把高风险 CSS 特性原样搬过去,且不写降级方案
|
||
|
||
---
|
||
|
||
## 3. 项目级强制决策
|
||
|
||
### 3.1 框架与运行时
|
||
|
||
1. **必须使用微信原生小程序页面体系**:WXML + WXSS + JS + JSON。
|
||
2. **禁止继续在小程序端运行 Tailwind CDN / 浏览器脚本。**
|
||
3. **禁止使用 DOM 驱动交互。** 页面必须改为数据驱动。
|
||
4. **不引入 Taro / uni-app / WebView 兜底。** 本规范面向原生小程序页面迁移。
|
||
|
||
### 3.2 验收基准
|
||
|
||
1. H5 原型的主要验收基准宽度为 **412 CSS px**。
|
||
2. 小程序以 412 宽设备的视觉效果为主验收目标。
|
||
3. 其他常见宽度设备允许比例差异,但不得出现:文本溢出、遮挡、错层、关键按钮点击区域异常、吸顶/弹层错位。
|
||
|
||
### 3.3 单位策略
|
||
|
||
采用 **`rpx` 为主、`px` 为辅** 的混合单位方案。
|
||
|
||
- **优先 `rpx`**:页面宽度、横向布局、卡片尺寸、主容器 padding / margin、列表间距、栅格、吸顶区高度。
|
||
- **优先 `px`**:1px 发丝线、阴影 blur/spread、小图标、绝对定位微调、小控件尺寸、状态栏 / 安全区补偿、细描边。
|
||
- **按效果决定**:字号、圆角、局部 padding、某些 transform 位移。
|
||
|
||
换算基准:
|
||
|
||
```text
|
||
rpx = H5_CSS_px × (750 / 412)
|
||
≈ H5_CSS_px × 1.8204
|
||
```
|
||
|
||
默认规则:
|
||
|
||
- 普通布局值:四舍五入到整数 `rpx`
|
||
- 视觉敏感值:允许人工微调,不强行套公式
|
||
- 不使用“统一取偶数 rpx”的硬规则
|
||
|
||
### 3.4 页面滚动策略
|
||
|
||
1. 默认使用 **页面自然滚动**。
|
||
2. 只有在必须做局部滚动区域时,才使用 `scroll-view`。
|
||
3. 吸顶、滚动联动、section 感知优先围绕页面滚动实现;不要无必要把整页包进 `scroll-view`。
|
||
|
||
### 3.5 样式组织策略
|
||
|
||
1. 全局 token、复用组件样式放 `app.wxss` 或公共样式文件。
|
||
2. 页面私有样式放页面同名 `.wxss`。
|
||
3. 样式优先使用 class,动态值用内联 style 绑定。
|
||
4. 不以 CSS 变量作为唯一运行前提;优先输出静态色值 / 静态 token。若项目后续验证 CSS 变量稳定可用,可作为增强层,不可作为唯一实现路径。
|
||
|
||
### 3.6 文本与行高策略 ⚠️
|
||
|
||
**关键发现**:微信小程序的 `<text>` 组件不能直接设置 `line-height`,必须通过外层 `<view>` 设置。
|
||
|
||
**全局设置(推荐):**
|
||
```wxss
|
||
page {
|
||
line-height: 1.5; /* Tailwind 默认行高 */
|
||
}
|
||
|
||
view {
|
||
line-height: inherit; /* view 继承 page 的 line-height */
|
||
}
|
||
|
||
/* text 会自动继承外层 view 的 line-height,不需要额外设置 */
|
||
```
|
||
|
||
**局部覆盖:**
|
||
```wxss
|
||
.section-title {
|
||
font-size: 26rpx;
|
||
line-height: 36rpx; /* 在 view 的 class 上设置,text 会继承 */
|
||
font-weight: 600;
|
||
}
|
||
```
|
||
|
||
**错误做法:**
|
||
```wxss
|
||
/* ❌ 直接在 text 上设置 line-height 无效 */
|
||
text {
|
||
line-height: 36rpx; /* 不会生效 */
|
||
}
|
||
```
|
||
|
||
**执行规则:**
|
||
1. 所有文本类样式必须同时设置 `font-size` 和 `line-height`
|
||
2. `line-height` 必须在外层 `<view>` 的 class 上设置,不能在 `<text>` 上设置
|
||
3. 标准字号的 `line-height` 换算参考附录 B.3
|
||
4. 若发现 Y 轴高度与 H5 端不一致,优先检查 `line-height` 是否正确设置
|
||
|
||
### 3.7 SVG / 图标策略
|
||
|
||
1. **禁止把 H5 的内联 `<svg>...</svg>` 直接当 WXML DOM 搬运。**
|
||
2. 资源层允许 `svg` 文件进入小程序项目包,但页面显示是否稳定,必须以目标设备实测为准。
|
||
3. 默认执行顺序:
|
||
- 简单静态图标:优先导出为独立资源文件
|
||
- 若 `svg` 渲染不稳定:转为 `png`
|
||
- 高频单色图标:允许改为 iconfont / 组件化图标
|
||
4. 动态换色的 SVG 不要临时拼接字符串;应改为多份资源、图标组件或样式控制的等价实现。
|
||
|
||
---
|
||
|
||
## 4. 技术基线与能力分级
|
||
|
||
> 说明:本规范不把“经验上可能可用”的能力写成“完全支持”。
|
||
> 所有能力分三类:A 可直接用,B 有条件使用,C 禁止直迁。
|
||
|
||
### 4.1 A 类:可直接使用
|
||
|
||
以下能力在当前项目中视为稳定迁移能力:
|
||
|
||
- `app.wxss` / 页面 `wxss` / `@import`
|
||
- `rpx`
|
||
- `.class`、`#id`、元素选择器、`::before`、`::after`
|
||
- `flex`、`position: relative/absolute/fixed`
|
||
- `box-shadow`、`border-radius`、`linear-gradient`
|
||
- `opacity`、常规 `transform`
|
||
- `transition`、`animation`
|
||
- 动态内联样式绑定
|
||
- `onPageScroll`
|
||
- `wx.createAnimation()`
|
||
- `wx.createSelectorQuery()`
|
||
- `wx.createIntersectionObserver()`
|
||
- `navigator` / `wx.navigateTo` / `wx.redirectTo` / `wx.switchTab` / `wx.navigateBack`
|
||
- `view` / `navigator` 的 `hover-class`
|
||
|
||
### 4.2 B 类:有条件使用,必须带回退或验证
|
||
|
||
以下能力允许使用,但不能把它们当成项目硬依赖:
|
||
|
||
- `position: sticky`
|
||
- `grid`
|
||
- `filter: blur()`
|
||
- `backdrop-filter`
|
||
- `clip-path`
|
||
- `vh`
|
||
- `line-clamp`
|
||
- 复杂组合选择器
|
||
- 资源型 `svg`
|
||
- CSS 变量
|
||
|
||
执行规则:
|
||
|
||
1. 使用前必须确认该页面已有回退方案。
|
||
2. 若页面对视觉或交互依赖度高,则必须做真机验证。
|
||
3. 若 B 类能力失效,不得阻塞交付,必须切换为本规范定义的降级实现。
|
||
|
||
### 4.3 C 类:禁止直迁
|
||
|
||
以下能力不得原样从 H5 搬到小程序:
|
||
|
||
- `document.getElementById/querySelector/querySelectorAll`
|
||
- `classList.add/remove/toggle`
|
||
- 直接改 `element.style.xxx`
|
||
- `innerHTML` / `textContent` 方式渲染视图
|
||
- `window.scrollY` / `window.scrollTo`
|
||
- `history.back`
|
||
- `localStorage` / `sessionStorage`
|
||
- `alert` / `confirm`
|
||
- CSS `env(safe-area-inset-*)`
|
||
- `:hover` / `group-hover:*`
|
||
- 依赖浏览器焦点模型的 `:focus` / `:active` 交互
|
||
- 依赖 `:first-child/:last-child/:nth-child` 才能成立的视觉规则
|
||
|
||
---
|
||
|
||
## 5. 页面转换的标准执行流程
|
||
|
||
每迁移 1 个页面,都必须按以下顺序执行。
|
||
|
||
### 步骤 1:页面资产盘点
|
||
|
||
输入:HTML / CSS / JS / 图片资源
|
||
|
||
动作:
|
||
|
||
- 抽取页面标题、路由名、入口参数、返回路径
|
||
- 列出页面块:顶部、卡片区、列表区、底部操作区、弹层、浮层、Toast
|
||
- 列出页面状态:默认态、空态、加载态、错误态、选中态、展开态、禁用态
|
||
- 列出页面动效:淡入、位移、缩放、吸顶、滚动联动、长按、评分拖动
|
||
|
||
输出:页面迁移卡
|
||
|
||
### 步骤 2:结构改写为 WXML 语义树
|
||
|
||
动作:
|
||
|
||
- `div` → `view`
|
||
- 文本优先用 `text`
|
||
- 图片用 `image`
|
||
- 链接/跳转用 `navigator` 或 `bindtap`
|
||
- 表单元素替换为原生小程序组件
|
||
- 列表一律改为 `wx:for`
|
||
- 条件显示一律改为 `wx:if` / `hidden` / 条件 class
|
||
|
||
禁止:
|
||
|
||
- 保留 H5 DOM 层级只是把标签名替换一下
|
||
- 在 `text` 内嵌套 `view`
|
||
- 用字符串拼接 HTML 片段
|
||
|
||
### 步骤 3:Tailwind 与自定义 CSS 拆解
|
||
|
||
动作:
|
||
|
||
- 先按视觉功能拆成:布局、尺寸、文本、颜色、装饰、状态、动画
|
||
- 再判断每个值使用 `rpx` 还是 `px`
|
||
- 统一抽出公共 token,不允许每页各自发散命名
|
||
|
||
要求:
|
||
|
||
- 不保留“一长串 utility class 直接照搬”的中间态
|
||
- 对频繁出现的组合样式抽成语义类,如 `.card`、`.section-title`、`.tab--active`
|
||
|
||
### 步骤 4:交互从 DOM 驱动改为数据驱动
|
||
|
||
动作:
|
||
|
||
- 把所有 DOM 查询改成状态变量
|
||
- 把显隐、激活、展开、选中、校验、加载都改成 `data` 驱动
|
||
- 把滚动联动改成 `onPageScroll` + 节流 + 仅在状态变化时 `setData`
|
||
|
||
输出:状态表
|
||
|
||
状态表至少包含:
|
||
|
||
- 状态变量名
|
||
- 默认值
|
||
- 可选值
|
||
- 受哪个事件修改
|
||
- 影响哪些视图
|
||
|
||
### 步骤 5:页面级动效实现
|
||
|
||
执行规则:
|
||
|
||
- 纯显隐 / 透明度 / 位移 / 简单位移动画:优先 `transition` / `animation`
|
||
- 需要顺序编排、组合变换、受事件精确驱动:用 `wx.createAnimation()`
|
||
- 高频交互不要每帧 `setData`
|
||
|
||
### 步骤 6:导航与参数改造
|
||
|
||
动作:
|
||
|
||
- 普通页面:`wx.navigateTo`
|
||
- 替换当前页:`wx.redirectTo`
|
||
- tabBar 页面:`wx.switchTab`
|
||
- 返回:`wx.navigateBack`
|
||
- 页面参数:统一在 `onLoad(query)` 中读取
|
||
|
||
### 步骤 7:安全区与导航栏补偿
|
||
|
||
动作:
|
||
|
||
- 禁止使用 `env(safe-area-inset-*)`
|
||
- 通过系统信息计算状态栏与底部安全区
|
||
- 自定义导航栏页面必须统一实现,不得一页一套
|
||
|
||
### 步骤 8:Mock 数据接入
|
||
|
||
动作:
|
||
|
||
- 页面先用 mock 跑通
|
||
- 模板静态文案与后端数据字段分开
|
||
- 所有列表、徽标、状态标签都要有 mock
|
||
|
||
### 步骤 9:真机回归与像素微调
|
||
|
||
动作:
|
||
|
||
- 先看 412 宽主验收设备
|
||
- 再看至少一台 375 宽设备
|
||
- 出现不对齐时优先微调局部 `px/rpx`,不要推翻整体单位策略
|
||
|
||
### 步骤 10:记录迁移说明
|
||
|
||
每页必须输出迁移说明,至少包含:
|
||
|
||
- 页面依赖资源
|
||
- 迁移状态变量
|
||
- 高风险点
|
||
- 已做降级项
|
||
- 待后端对接字段
|
||
- 待真机复核项
|
||
|
||
---
|
||
|
||
## 6. Tailwind → WXSS 的执行规则
|
||
|
||
## 6.1 间距与尺寸
|
||
|
||
执行原则:
|
||
|
||
1. 标准 spacing 先换算为 H5 实际 px,再决定 `rpx` / `px`。
|
||
2. 主容器、卡片、列表间距优先 `rpx`。
|
||
3. 图标、徽标、定位补偿优先 `px`。
|
||
4. arbitrary 值不能偷懒统一换 `rpx`,必须逐项判断。
|
||
|
||
### 建议 token(412 基准)
|
||
|
||
| H5 px | 建议值 |
|
||
|---|---|
|
||
| 4px | 8rpx |
|
||
| 8px | 14rpx |
|
||
| 12px | 22rpx |
|
||
| 16px | 29~30rpx |
|
||
| 20px | 36rpx |
|
||
| 24px | 44rpx |
|
||
| 32px | 58rpx |
|
||
| 40px | 72rpx |
|
||
|
||
说明:
|
||
|
||
- 16px 允许落在 29rpx 或 30rpx,以真机比对为准。
|
||
- 阴影参数不要强制 `rpx` 化;优先保留 `px` 质感。
|
||
|
||
## 6.2 文本
|
||
|
||
### 标准字号类
|
||
|
||
对 Tailwind 标准字号类,迁移时应同时输出 `font-size` 与 `line-height`。
|
||
|
||
### arbitrary 字号
|
||
|
||
规则:
|
||
|
||
1. `text-[Npx]` 不能直接假设其 line-height = 1.2 倍字号。
|
||
2. 若原型页面显式设置了 `leading-*`,以显式值为准。
|
||
3. 若未显式设置,则应从原型的实际计算样式、截图观感或上下文排版需求确定行高。
|
||
4. 对单行标签/徽章文字,可使用更紧的 line-height;对正文、说明文必须按真实视觉高度定。
|
||
|
||
禁止:
|
||
|
||
- 在全项目层面硬编码“所有 arbitrary 字号默认 1.2 倍行高”
|
||
|
||
## 6.3 颜色
|
||
|
||
执行原则:
|
||
|
||
1. 颜色优先输出静态十六进制 / `rgba()`。
|
||
2. Tailwind 透明度修饰符转成 `rgba()`。
|
||
3. 若项目后续统一做 token 化,可再抽公共常量;首轮迁移不要把颜色系统设计复杂化。
|
||
|
||
## 6.4 布局
|
||
|
||
### Flex
|
||
|
||
默认首选。能用 flex 做出来的布局,不优先上 grid。
|
||
|
||
### Grid
|
||
|
||
仅在以下条件同时满足时允许:
|
||
|
||
- 页面是规则网格
|
||
- 列数固定
|
||
- 没有复杂跨列
|
||
- 真机验证通过
|
||
|
||
否则改用 flex + wrap + 固定宽度 / 百分比。
|
||
|
||
## 6.5 组合类
|
||
|
||
以下 Tailwind 组合迁移时不要机械翻译:
|
||
|
||
- `space-y-*`
|
||
- `divide-y`
|
||
- `group-hover:*`
|
||
- `peer-*`
|
||
- `hover:*`
|
||
- `focus:*`
|
||
- `active:*`
|
||
|
||
迁移规则:
|
||
|
||
- `space-y-*`:优先给循环项单独 class;选择器方案仅作受控场景补充
|
||
- `divide-y`:优先对列表项显式加边线 class,并根据 index 控首项
|
||
- `hover:*`:改 `hover-class` 或按压反馈
|
||
- `focus:*`:用 `bindfocus/bindblur` + 状态 class
|
||
|
||
---
|
||
|
||
## 7. HTML / 事件 / API 的标准映射
|
||
|
||
## 7.1 标签映射
|
||
|
||
| H5 | 小程序 |
|
||
|---|---|
|
||
| `div` | `view` |
|
||
| `span` | `text` |
|
||
| `p` | `view` / `text` |
|
||
| `img` | `image` |
|
||
| `a` | `navigator` / `view bindtap` |
|
||
| `button` | `button` / `view bindtap` |
|
||
| `input` | `input` |
|
||
| `textarea` | `textarea` |
|
||
| `ul/ol/li` | `view + wx:for` |
|
||
| `select` | `picker` |
|
||
|
||
补充规则:
|
||
|
||
- `image` 的 `mode` 必须按原图展示意图设置,不允许默认留空就交付。
|
||
- `object-fit: cover` 常映射为 `aspectFill`;但若原图不能被裁切,则应改为 `aspectFit`。
|
||
|
||
## 7.2 事件映射
|
||
|
||
| H5 | 小程序 |
|
||
|---|---|
|
||
| `onclick` | `bindtap` |
|
||
| `oninput` | `bindinput` |
|
||
| `onchange` | `bindchange` |
|
||
| `onscroll` | `bindscroll` / `onPageScroll` |
|
||
| `ontouchstart` | `bindtouchstart` |
|
||
| `ontouchmove` | `bindtouchmove` |
|
||
| `ontouchend` | `bindtouchend` |
|
||
| `oncontextmenu` | `bindlongpress` |
|
||
|
||
注意:这只是常见替换,不代表浏览器事件语义与小程序事件语义完全等价。
|
||
|
||
## 7.3 冒泡与阻断
|
||
|
||
- `bind*`:正常冒泡
|
||
- `catch*`:阻止事件向上冒泡
|
||
|
||
弹层、蒙层、内部内容区必须明确设计谁冒泡、谁拦截,不能边做边猜。
|
||
|
||
## 7.4 常见浏览器 API 替代
|
||
|
||
| H5 | 小程序 |
|
||
|---|---|
|
||
| `history.back()` | `wx.navigateBack()` |
|
||
| `window.location.href` | `wx.navigateTo()` |
|
||
| `window.location.replace` | `wx.redirectTo()` |
|
||
| tab 页跳转 | `wx.switchTab()` |
|
||
| `window.scrollY` | `onPageScroll().scrollTop` |
|
||
| `navigator.clipboard.writeText` | `wx.setClipboardData()` |
|
||
| `localStorage` | `wx.setStorageSync/getStorageSync` |
|
||
| `alert/confirm` | `wx.showToast/wx.showModal` |
|
||
|
||
---
|
||
|
||
## 8. JS 交互模式的标准改写
|
||
|
||
## 8.1 显隐切换
|
||
|
||
H5 的 `classList.add/remove('hidden')` 一律改为:
|
||
|
||
- `wx:if`
|
||
- 或 `hidden`
|
||
- 或状态 class
|
||
|
||
默认建议:
|
||
|
||
- 大块弹层:`wx:if`
|
||
- 仅做过渡且结构稳定:状态 class + transition
|
||
|
||
## 8.2 Tab / 选中态
|
||
|
||
统一改为单一状态变量:
|
||
|
||
```js
|
||
Page({
|
||
data: { activeTab: 'basic' },
|
||
onTabChange(e) {
|
||
this.setData({ activeTab: e.currentTarget.dataset.tab })
|
||
}
|
||
})
|
||
```
|
||
|
||
禁止:
|
||
|
||
- 同时维护多个布尔值表示同一个 tab 组选中态
|
||
|
||
## 8.3 展开 / 收起
|
||
|
||
统一改为对象映射或数组项状态,不允许操作 DOM 文本改按钮文案。
|
||
|
||
## 8.4 滚动联动
|
||
|
||
执行规则:
|
||
|
||
1. `onPageScroll` 只在确实需要时声明。
|
||
2. 必须节流或去抖。
|
||
3. 只在状态变化时 `setData`。
|
||
4. 吸顶标题、目录高亮、section 感知,优先用 `IntersectionObserver`。
|
||
|
||
## 8.5 长按菜单
|
||
|
||
原型中的“卡片旁锚点弹出菜单”在小程序中优先改为:
|
||
|
||
- 底部 action sheet
|
||
- 或固定底部操作面板
|
||
|
||
原因:
|
||
|
||
- 更稳定
|
||
- 更易复用
|
||
- 更符合触屏交互
|
||
|
||
## 8.6 评分拖动 / 拖拽类交互
|
||
|
||
规则:
|
||
|
||
1. 触摸起始时缓存容器 rect。
|
||
2. `touchmove` 中仅基于缓存坐标计算,不每次重新 query。
|
||
3. 评分变化只在值变化时更新。
|
||
|
||
## 8.7 Toast / 短提示
|
||
|
||
优先级:
|
||
|
||
1. 系统 `wx.showToast`
|
||
2. 若原型要求强定制视觉,再做自定义 toast 组件
|
||
|
||
## 8.8 动画
|
||
|
||
优先级:
|
||
|
||
1. WXSS transition / animation
|
||
2. `wx.createAnimation()`
|
||
3. 避免高频 `setData` 驱动逐帧动画
|
||
|
||
---
|
||
|
||
## 9. 高风险能力的强制降级规则
|
||
|
||
## 9.1 `sticky`
|
||
|
||
执行顺序:
|
||
|
||
1. 页面自然滚动场景:先尝试 `position: sticky`
|
||
2. 若在 `scroll-view` 中:不要硬上 sticky,改为滚动监听/观察者驱动
|
||
3. 多层 sticky:只保留最外层 sticky
|
||
|
||
## 9.2 `backdrop-filter`
|
||
|
||
规则:
|
||
|
||
- 不作为交付必需能力
|
||
- 默认必须提供半透明背景降级
|
||
- 若失效,不得阻塞上线
|
||
|
||
## 9.3 `vh`
|
||
|
||
规则:
|
||
|
||
- 不把 `100vh` 当成万能全屏高度
|
||
- 涉及自定义导航栏、安全区、底部操作栏的页面,必须计算可用高度
|
||
- 能用 `min-height` + 内边距解决的,不强依赖 `vh`
|
||
|
||
## 9.4 复杂选择器
|
||
|
||
规则:
|
||
|
||
- WXSS 公开支持的基础选择器以 `.class`、`#id`、元素、`::before/::after` 为准
|
||
- 组合选择器只在局部受控场景下使用
|
||
- 不把复杂结构选择器写成项目标准手段
|
||
|
||
## 9.5 CSS 变量
|
||
|
||
规则:
|
||
|
||
- 首轮迁移不强制依赖 `var()`
|
||
- 颜色、渐变、阴影优先输出静态值
|
||
- 若后续项目验证 CSS 变量稳定可用,可作为增强重构项,不是首轮交付阻塞项
|
||
|
||
---
|
||
|
||
## 10. 模板内容与数据内容的边界
|
||
|
||
每个页面都要把内容拆成三类:
|
||
|
||
### 10.1 模板固化内容
|
||
|
||
这些通常写死在页面模板或常量里:
|
||
|
||
- 页面标题
|
||
- 分区标题
|
||
- 固定按钮文案
|
||
- 空态文案
|
||
- Tooltip 固定说明
|
||
- 表头 / 标签名
|
||
|
||
### 10.2 Mock / 后端数据内容
|
||
|
||
这些必须抽成数据:
|
||
|
||
- 卡片列表
|
||
- 客户信息
|
||
- 任务信息
|
||
- 看板统计值
|
||
- 徽标状态
|
||
- 提示数量
|
||
- 聊天记录
|
||
- 备注内容
|
||
- 评分值
|
||
- 时间轴 / 历史记录
|
||
|
||
### 10.3 前端派生内容
|
||
|
||
这些应由前端根据后端字段计算:
|
||
|
||
- 状态色 class
|
||
- 选中态 class
|
||
- 进度条宽度
|
||
- 文案格式化
|
||
- 百分比显示
|
||
- 数字千分位
|
||
- 是否显示空态 / 加载态 / 错误态
|
||
|
||
---
|
||
|
||
## 11. 页面目录与公共层建议结构
|
||
|
||
```text
|
||
app.js
|
||
app.json
|
||
app.wxss
|
||
|
||
/common
|
||
/styles
|
||
tokens.wxss
|
||
mixins.wxss
|
||
animation.wxss
|
||
/utils
|
||
format.js
|
||
system.js
|
||
nav.js
|
||
/mock
|
||
xxx.js
|
||
/components
|
||
app-navbar/
|
||
app-tab/
|
||
app-card/
|
||
app-empty/
|
||
app-toast/
|
||
app-action-sheet/
|
||
|
||
/pages
|
||
/task-list
|
||
/task-detail
|
||
/board-finance
|
||
/board-customer
|
||
/board-coach
|
||
/notes
|
||
/chat
|
||
...
|
||
|
||
/assets
|
||
/images
|
||
/icons
|
||
```
|
||
|
||
执行要求:
|
||
|
||
- 可复用的组件必须抽离
|
||
- 不允许把每页都做成孤岛
|
||
- 但也禁止首轮过度抽象,影响交付速度
|
||
|
||
---
|
||
|
||
## 12. 每页迁移完成的验收清单
|
||
|
||
以下清单必须全部勾过,页面才算完成。
|
||
|
||
### 12.1 结构
|
||
|
||
- [ ] 页面可正常进入
|
||
- [ ] 路由与参数正确
|
||
- [ ] 结构层级与原型一致
|
||
- [ ] 图片、图标、背景都已替换到位
|
||
|
||
### 12.2 样式
|
||
|
||
- [ ] 主布局宽度、边距、卡片尺寸与原型接近
|
||
- [ ] 文本字号、行高、字重合理
|
||
- [ ] 圆角、边框、阴影、渐变已还原
|
||
- [ ] 吸顶、弹层、底栏无错位
|
||
- [ ] 412 宽设备通过视觉验收
|
||
|
||
### 12.3 交互
|
||
|
||
- [ ] 点击反馈存在
|
||
- [ ] tab 切换正确
|
||
- [ ] 弹层开关正确
|
||
- [ ] 长按 / 复制 / 展开 / 收起 / 评分等交互正确
|
||
- [ ] 返回和跳转链路正确
|
||
|
||
### 12.4 性能
|
||
|
||
- [ ] 滚动时无明显抖动
|
||
- [ ] 没有在高频事件中无脑 `setData`
|
||
- [ ] 动画不依赖逐帧 JS
|
||
|
||
### 12.5 风险项
|
||
|
||
- [ ] 所有降级项已记录
|
||
- [ ] 所有待真机复核项已记录
|
||
- [ ] 所有待接口对接字段已记录
|
||
|
||
---
|
||
|
||
## 13. AI 执行模板(标准提示词契约)
|
||
|
||
以下模板用于驱动 AI 按页迁移。
|
||
|
||
```md
|
||
你现在负责把指定 H5 页面迁移为微信原生小程序页面。
|
||
|
||
必须遵守以下约束:
|
||
1. 输出原生小程序文件:wxml / wxss / js / json。
|
||
2. 禁止使用任何 DOM API、window、history、localStorage。
|
||
3. 禁止继续依赖 Tailwind 运行时;需将 Tailwind 与页面自定义样式改写为可维护的 WXSS。
|
||
4. 视觉目标是最大程度还原 H5;默认以 412 宽设备为验收基准。
|
||
5. 单位策略为 rpx 为主、px 为辅:布局主尺寸优先 rpx,发丝线/小图标/阴影/绝对定位微调优先 px。
|
||
6. 所有交互必须改为数据驱动。
|
||
7. 对 sticky / backdrop-filter / svg / vh / grid 等高风险能力,必须给出降级或验证说明。
|
||
8. 每输出一个页面,必须附带:
|
||
- 页面状态变量表
|
||
- 事件处理函数表
|
||
- mock 数据结构
|
||
- 未决问题与降级项
|
||
|
||
请按以下顺序输出:
|
||
A. 页面迁移摘要
|
||
B. 目录结构
|
||
C. WXML
|
||
D. WXSS
|
||
E. JS
|
||
F. JSON
|
||
G. mock 数据
|
||
H. 迁移说明与风险项
|
||
```
|
||
|
||
### 13.1 AI 页面状态表模板
|
||
|
||
```md
|
||
| 状态变量 | 类型 | 默认值 | 可选值 | 影响视图 | 触发事件 |
|
||
|---|---|---:|---|---|---|
|
||
| showFilter | boolean | false | true/false | 筛选面板 | onToggleFilter |
|
||
| activeTab | string | overview | overview/detail/... | tab内容区 | onTabChange |
|
||
```
|
||
|
||
### 13.2 AI 风险项模板
|
||
|
||
```md
|
||
- 已降级:backdrop-filter 改为半透明背景
|
||
- 待验证:顶部 sticky 在真机 Android 上需复核
|
||
- 待后端:客户列表、统计卡片、备注列表当前仍为 mock
|
||
```
|
||
|
||
---
|
||
|
||
## 14. 本项目对旧版桥接文档的修订结论
|
||
|
||
旧版文档可继续参考,但以下内容不再作为硬规范:
|
||
|
||
1. 不再把大量现代 CSS 特性写成“完全支持”。
|
||
2. 不再把 arbitrary 字号 line-height 的经验值当成定理。
|
||
3. 不再把 CSS 变量当成首轮必选依赖。
|
||
4. 不再把 `.parent > view + view` 这类技巧写成唯一实现方案。
|
||
5. 不再把 `<image src="xxx.svg">` 写成无条件可靠方案。
|
||
6. 不再允许“先翻样式,交互以后再说”的半迁移状态作为交付完成。
|
||
|
||
---
|
||
|
||
## 15. 参考文档(执行时必须优先查官方)
|
||
|
||
微信小程序官方 / 腾讯云镜像:
|
||
|
||
- WXSS 样式:<https://www.tencentcloud.com/zh/document/product/1219/60346>
|
||
- 页面与 `onPageScroll`:<https://www.tencentcloud.com/zh/document/product/1219/61713>
|
||
- 渲染层 / 事件模型:<https://www.tencentcloud.com/zh/document/product/1219/61744>
|
||
- `createSelectorQuery` / `createIntersectionObserver`:<https://www.tencentcloud.com/document/product/1219/57688>
|
||
- 动画 `wx.createAnimation`:<https://www.tencentcloud.com/zh/document/product/1219/57764>
|
||
- 视图容器 `view` / `hover-class`:<https://www.tencentcloud.com/zh/document/product/1219/57773>
|
||
- 导航组件 `navigator`:<https://www.tencentcloud.com/zh/document/product/1219/57779>
|
||
- 小程序目录结构与可上传文件类型:<https://www.tencentcloud.com/zh/document/product/1219/57660>
|
||
|
||
Tailwind 官方:
|
||
|
||
- Font Size:<https://v3.tailwindcss.com/docs/font-size>
|
||
- Line Height:<https://v3.tailwindcss.com/docs/line-height>
|
||
- Height:<https://v3.tailwindcss.com/docs/height>
|
||
|
||
---
|
||
|
||
## 16. 最终执行口径
|
||
|
||
**本项目的小程序迁移,不是“把 Tailwind 翻译成 WXSS”这么简单。**
|
||
|
||
真正的执行标准是:
|
||
|
||
1. 页面结构重写为 WXML;
|
||
2. 样式收敛为可维护的 WXSS;
|
||
3. 交互全部改为小程序数据驱动;
|
||
4. 对高风险 CSS 特性提供可交付降级;
|
||
5. 每页都有 mock、状态表、事件表、风险说明和验收清单。
|
||
|
||
能做到这 5 条,才算“可执行版桥接规范”。
|