Files
XQKqueue/docs/staff-h5-gsap-ux-plan.md
2026-07-12 15:53:24 +08:00

140 lines
6.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 员工端 H5GSAP UI/UX 交互提升规划
## 1. 目标
员工端动效的目标不是“更炫”,而是让现场员工快速确认:操作是否提交、结果是否生效、接下来做什么。
原则业务状态先于动画一次操作只突出一个结果动画可中断、可清理、可降级CSS 负责简单微反馈GSAP 负责多元素状态编排;任何请求、刷新和导航都不能依赖动画回调。
## 2. 当前体验与机会
| 场景 | 当前基础 | 主要缺口 | 提升目标 |
|---|---|---|---|
| 叫号 | busy、结果 Banner、队列刷新 | 新号段、指标和列表同时变化,视觉关系弱 | 一眼确认叫了哪些号、队列已推进 |
| 取号 | 校验、重复手机号确认、上下个号码 | 成功后表单和指标瞬时变化 | 明确号码已生成,减少重复提交 |
| 我的 | 明确确认后切换项目 | 弹层和项目上下文变化不连续 | 降低误切项目风险 |
| 主导航 | 固定三入口 | 内容瞬时替换 | 建立轻量方向感 |
| 轮询/异常 | 5 秒刷新、离线与陈旧提示 | 后台变化可能与本地操作混淆 | 只强调与当前操作相关的新变化 |
## 3. Motion tokens
| Token | 时长 | 用途 |
|---|---:|---|
| press | 80100ms | 按钮按压CSS |
| fast | 140180ms | 图标、提示条、小状态 |
| standard | 220260ms | 页面内容、指标变化 |
| emphasis | 280320ms | 叫号结果、项目切换 |
| exit | 140180ms | 元素退出 |
推荐 `power2.out` / `power3.out`,位移控制在 616px缩放控制在 `0.981.02`
## 4. 六个重点方案
### A. 叫号提交与结果P0
1. 点击瞬间:按钮 CSS 下压,操作区立即锁定,文案切换为“正在叫号”。
2. 成功后:旧号段轻淡出,新号段作为整体从 `y: 10, opacity: 0` 进入,总时长不超过 300ms。
3. “下一个号、剩余未叫号”同步做一次背景高亮,不滚动数字。
4. 本次消费的队列行淡出并收起,后续可见行使用 GSAP Flip 平滑补位。
5. 失败 Banner 以 6px 位移淡入,不抖动;设备部分失败只扫过一次琥珀色边框。
以 API 返回的 batch/revision 标识动画事件;轮询看到相同 revision 不得重播。批量号码必须整体进入,禁止逐号 stagger、老虎机、弹跳或闪烁。
### B. 队列列表变化P0
- 使用 Flip 处理可见行删除和重排220260ms。
- 前台新增号码可使用 8px 淡入;纯轮询只做 600ms 静态背景高亮。
- 只动画首屏可见行,不为完整长队列创建时间线。
- 标签页从后台恢复时直接显示最新快照,不补播期间变化。
### C. 取号确认P0
- 提交时按钮保持尺寸稳定。
- 成功后“上个取号”在 240ms 内切换为新号码,“下个取号”同步低强度高亮。
- 号码确认出现后再清空表单,形成清晰的事务完成顺序。
- 重复手机号提示在字段附近展开,不造成大幅页面跳动。
- 增加 `aria-live="polite"` 成功播报;视觉提示可淡出,辅助技术反馈不依赖动画。
### D. 主导航与场景切换P1
- active 背景和按压继续用 CSS。
- 内容使用 180220ms 的淡入和 8px 水平位移,方向跟随“叫号 → 取号 → 我的”。
- 路由先切换,进入动画随后播放,禁止等待退出动画。
- 首次加载骨架与内容交叉淡化,避免白屏。
### E. 项目切换弹层P1
- 遮罩 180ms 淡入;移动端 sheet 从 `y: 24` 进入 260ms桌面对话框使用轻微缩放和 8px 位移。
- Escape、取消、确认走统一清理路径。
- 切换后旧项目淡出,新项目名称和首份队列数据一起进入,禁止出现“新标题 + 旧队列”。
- 同步实现焦点圈定、关闭后焦点返回和背景滚动锁定;这些不能由动画替代。
### F. 离线、陈旧与恢复P1
- 状态 Banner 从顶部 8px 淡入,不自动消失。
- 恢复后 Banner 淡出,数据区只做一次柔和绿色高亮。
- 必须先拉取服务端权威快照;动画只表达界面已同步,不代表硬件必然成功。
## 5. 配套 UI 调整
1. 叫号页固定“本次结果”为第一层,“快速叫号”为唯一主按钮,批量叫号为次级操作。
2. 指标按任务优先级排序:下一个号、剩余未叫号、最新叫到、最末号数、最末号预计时长。
3. 不恢复大型成功卡片,但提供短暂明确的取号号码确认。
4. disabled 按钮附近显示不可操作原因:离线、数据陈旧、项目停运或队列为空。
5. 动画不得改变至少 44×44px 的可点击区域。
## 6. 推荐代码结构
```text
web/src/
├── motion/
│ ├── tokens.ts
│ ├── useReducedMotion.ts
│ └── useRevisionMotion.ts
├── components/staff/
│ ├── CallResult.tsx
│ ├── QueueList.tsx
│ ├── TicketMetrics.tsx
│ ├── StaffScene.tsx
│ └── ProjectSwitcher.tsx
└── pages/StaffPage.tsx
```
`StaffPage.tsx` 保留业务数据和动作编排,视觉组件管理各自作用域内的时间线,避免轮询、表单、幂等与动画状态互相污染。
## 7. 实施路线
### Sprint 1核心事务P023 天)
- 建立 motion tokens、`useGSAP` scope、reduced motion。
- 实现叫号结果、revision 去重、可见队列 Flip。
- 实现取号号码确认与无障碍播报。
### Sprint 2场景与恢复P1约 2 天)
- 实现场景进入和项目切换弹层。
- 补齐焦点管理、Escape、背景滚动锁定。
- 实现离线、陈旧与恢复反馈。
### Sprint 3现场调优12 天)
- 验证 320/375/390/414px 和低端 Android。
- 根据现场单手操作、网络延迟、强光环境调整时长和对比度。
- 小范围灰度并记录重复点击率、完成时长和错误恢复率。
## 8. 验收标准
- 动画开启、关闭或中途打断,业务结果完全一致。
- 相同 revision/batch 不重复播放。
- 后台恢复不补播旧叫号和队列变化。
- `prefers-reduced-motion: reduce` 下取消位移/缩放0100ms 内直接到终态。
- 焦点不被动画遮挡;弹层关闭后正确返回触发按钮。
- 成功、警告、失败通过 `aria-live``role=status|alert` 播报。
- 主要只动画 `transform``opacity`,清除列表收起产生的内联样式。
- 页面卸载后无存活 timeline、listener 或 matchMedia context。
- 测试覆盖 revision 去重、reduced motion、清理、焦点返回、连续点击、网络失败与后台恢复。
## 9. 效果指标
关注重复点击率、一次叫号完成时间、失败后的重试成功率、重复手机号确认放弃率和项目误切换反馈。动效成功的标准是减少犹豫与误操作,而不是增加动画播放次数。