11 KiB
11 KiB
桌面导航、标签页与窗口交互规范
目录
- 选择导航模型
- 目的地、路由与状态模型
- 导航、后退与焦点恢复
- 自适应导航与应用外壳
- 静态标签与文档标签
- 未保存内容与关闭协议
- 多窗口与窗口生命周期
- 键盘与无障碍
- 测试矩阵
- 交付检查清单
1. 选择导航模型
先根据用户心智模型选择,不按视觉偏好混用:
| 模型 | 表达含义 | 典型呈现 |
|---|---|---|
| 顶级导航 | 在应用主要目的地之间切换 | 带标签的侧边或顶部导航 + 页面容器 |
| 层级导航 | 进入对象或任务的下一级,并允许后退 | 路由栈、主从页面或显式导航控制器 |
| 静态标签 | 在少量、固定、同一对象的同级属性页之间切换 | 不可关闭的标签或分段选择器 |
| 文档标签 | 管理可创建、关闭、重排和可能移动到窗口的工作文档 | 可关闭、移动和溢出的文档标签 |
| 多窗口 | 并行展示独立任务、文档或工具 | 具有独立状态容器的顶层窗口 |
| 辅助面板 | 补充当前任务,不成为新的顶级目的地 | 侧面板、检查器或可停靠面板 |
不要使用标签页表示彼此无关的应用目的地,也不要用顶级导航伪装可关闭文档。层级导航、文档历史和编辑撤销是三种独立历史,不共用一个“后退”命令。
在编码前定义:目的地清单、稳定 ID、层级关系、可深链参数、进入/离开条件、后退语义、状态保留、加载策略、权限、未保存行为、多窗口所有权和恢复策略。
2. 目的地、路由与状态模型
稳定身份
- 使用路由/目的地 ID、文档 ID 和窗口 ID 标识状态,不使用导航项索引或当前标签位置。
- 路由参数只包含可序列化的最小身份;大型对象和敏感数据放在应用状态/服务中。
- 同一文档重复打开时明确激活现有标签、创建只读副本,还是允许多个编辑会话。
- 权限变化或对象删除后,历史记录不得导航到可操作的幽灵页面;显示可恢复状态或移除记录。
每个页面保存什么
按产品价值决定保留:滚动位置、选中对象、筛选、展开节点、输入草稿、焦点目标、分页和子视图。持久业务数据与临时视图状态分开。
- 前进/后退通常恢复页面上下文,不重新创建空白页面。
- 刷新数据不应默认清空用户位置;无法恢复时将焦点放到语义最近的位置。
- 导航缓存需要容量和失效策略,不能无限保留页面、订阅、线程和敏感数据。
- 恢复失败时安全回到有效目的地并说明原因,不崩溃或显示空壳。
3. 导航、后退与焦点恢复
进入目的地
- 点击当前已激活的顶级导航项默认不重复压栈;需要“回到顶部/刷新”时显式定义。
- 导航启动后防止重复触发。异步加载显示当前目的地的骨架/进度,并忽略过期结果。
- 先确认离开条件,再切换选中导航项;被未保存状态阻止时恢复原导航视觉。
- 失败时保留上一页或显示可操作错误,不短暂显示目标页后再弹回。
后退与前进
- 仅在有有效历史时启用后退;不要显示一个永远禁用的装饰按钮。
Alt+Left/鼠标后退键按应用导航历史返回;不要撤销编辑或关闭文档。- 后退前运行与直接导航相同的未保存协调器。
- 从详情返回列表时恢复筛选、选择、滚动和焦点;目标已删除时选择相邻项或列表容器。
- 深链首次进入没有应用内上一页时,后退回到合理的应用起点或关闭该任务窗口,规则必须明确。
焦点
- 导航完成后把焦点放到页面标题、主内容或恢复的任务位置,而不是留在不可见导航项。
- 用户通过键盘选择导航项时保持可预测焦点;指针导航不应无必要抢走当前输入焦点。
- 弹层、对话框和辅助面板关闭后将焦点返回调用者或逻辑后继。
- 加载完成不自动把焦点从用户正在操作的其他控件抢走。
4. 自适应导航与应用外壳
- 紧凑、中等、宽布局使用同一目的地和选择状态,只改变呈现方式。
- 导航面板折叠/展开不重建页面、不清空历史、不丢焦点。
- 紧凑模式保留可发现的打开导航入口;图标必须有文本/工具提示和无障碍名称。
- 顶级项保持稳定顺序。权限或功能开关改变时,移除无权项并处理当前目的地回退。
- 标题栏拖动区域不能覆盖导航按钮、搜索、标签关闭或窗口命令。
- 设置、账户和帮助等固定项与主要业务目的地分组,但仍参与明确的焦点顺序。
- 窗口变窄时优先折叠次要面板、重排主从内容,再隐藏低频命令;不把关键任务变成仅菜单可用。
5. 静态标签与文档标签
静态标签
- 用于少量固定同级页面,不提供新建、关闭、拖动或未保存标记。
- 标签切换应快速。内容加载有明显延迟时使用手动激活:方向键移动焦点,Enter/Space 激活。
- 标签名称简短且稳定;不要用仅图标标签承载关键分类。
- 切换后保留每页内部状态,除非数据刷新是明确操作。
文档标签
每个文档标签维护稳定文档 ID、标题、脏状态、加载/错误、只读/冲突、固定状态和所属窗口。标签位置只是显示顺序。
- 单击激活文档;关闭按钮只关闭命中标签,不先意外切换并触发其他副作用。
- 支持关闭当前、关闭其他、关闭右侧等命令时准确处理固定标签和未保存标签。
- 关闭后优先激活最近使用或邻近标签,并将焦点放到合理位置。
- 重排不改变文档身份、保存目标、撤销栈或后台任务所有权。
- 标签太多时提供滚动、溢出列表或搜索;不能把标签压缩到无法识别。
- 标签标题变化保持关闭按钮位置稳定;脏状态使用符号并提供无障碍文本,不只变颜色。
- 双击标签、双击空白区和中键关闭仅作为加速路径,必须有显式按钮/菜单/键盘入口。
- 拖出新窗口是高级能力;需定义取消拖动、跨 DPI、失败回退和最后标签行为。
标签键盘
- Ctrl+Tab/Ctrl+Shift+Tab 在文档标签间切换;是否按显示顺序或最近使用顺序要保持一致。
- Ctrl+W 关闭当前可关闭文档;不会绕过未保存检查。
- 标签条聚焦后使用方向键移动,Enter/Space 激活;Delete 关闭仅在产品明确采用时启用。
- 关闭后焦点移动到新激活标签或逻辑后继,不落到已删除对象。
6. 未保存内容与关闭协议
所有离开路径调用同一关闭协调器:导航离开、后退、关闭标签、关闭窗口、退出应用、切换账户和外部打开另一文档。
推荐协议:
- 收集受影响的脏文档/表单和正在提交的任务;
- 无修改则直接继续;可自动保存则先安全保存;
- 需要决策时显示具体对象和“保存 / 不保存 / 取消”;
- 多文档退出支持逐项或“全部保存”,并报告失败项;
- 只有全部必要保存成功或用户明确放弃后才完成关闭;
- 取消关闭恢复原窗口、标签、导航选择和焦点。
- 保存失败不得关闭;保留内容并提供重试、另存或复制恢复数据。
- 后台任务与文档绑定时定义关闭后取消、继续后台或转移所有权。
- 进程崩溃恢复与正常未保存提示分开;恢复草稿不能覆盖较新的服务端版本。
- 不用“是否发生过键盘输入”判断脏状态,应比较规范化领域快照或命令状态。
7. 多窗口与窗口生命周期
- 每个窗口具有明确任务、所有者和状态容器;不要依赖全局“当前窗口”。
- 应用级服务可以共享,页面选择、导航历史、焦点、文档视图状态通常按窗口隔离。
- 辅助窗口定义模态性、任务栏显示、始终置顶、最小化/恢复和父窗口关闭行为。
- 同一文档在多窗口编辑时定义单写者、协同、只读副本或冲突策略。
- 关闭父窗口前处理其拥有的对话框、弹层、未保存内容和后台任务。
- 保存窗口位置/尺寸/最大化/停靠布局;恢复时限制到当前显示器可用区域。
- 显示器移除、DPI 改变或窗口恢复失败时使用安全默认位置和最小可用尺寸。
- 最后一个窗口关闭是退出、留在托盘还是保留后台服务必须明确,不让任务静默终止。
8. 键盘与无障碍
- 顶级导航、标签条和页面内容是不同复合区域;Tab 在区域间移动,方向键在区域内移动。
- 当前导航目的地与键盘焦点分别可见,并向无障碍 API 暴露选中/激活状态。
- 后退、关闭、新建标签、切换标签和窗口命令具有标准快捷键及菜单说明。
- 标签关闭按钮、仅图标导航项和窗口按钮提供准确名称;重复标签增加可区分上下文。
- 页面标题使用可导航语义;导航完成和错误加载时播报目的地变化,但不重复朗读整页。
- 高对比度、200% 缩放和长翻译下仍能识别活动目的地、活动标签、脏状态和关闭入口。
- 动效尊重系统减少动画设置;转场不延迟输入或导致前庭不适。
9. 测试矩阵
至少验证:
- 当前目的地重复点击、快速连续导航、加载失败和过期响应;
- 后退/前进、深链首次进入、对象删除和权限变化;
- 紧凑/宽导航切换、贴靠、标题栏命中和焦点保持;
- 静态标签、文档新建/关闭/重排/溢出和重复打开;
- 单个/多个脏文档的保存、不保存、取消和保存失败;
- Ctrl+Tab、Ctrl+W、Alt+Left、方向键、Enter、Space、Delete 和 Shift+F10;
- 多窗口共享文档、关闭父窗口、最后窗口和后台任务;
- 窗口位置恢复、显示器移除、100%–200% DPI 和高对比度;
- 屏幕阅读器对目的地、活动标签、脏状态、标签数量和加载结果的播报;
- 原型与最终桌面实现的路由、关闭和恢复契约对照。
10. 交付检查清单
- 已区分顶级导航、层级导航、静态标签、文档标签和多窗口。
- 所有目的地、文档和窗口使用稳定 ID,不依赖显示索引。
- 后退、刷新和导航失败能够保留或安全恢复用户上下文。
- 标签关闭、重排、溢出、快捷键和焦点后继明确。
- 所有离开路径共享未保存协调器,保存失败不会丢失内容。
- 多窗口的所有权、共享状态、关闭和最后窗口行为明确。
- 自适应布局不会重建状态或破坏标题栏命中。
- 键盘、缩放、高对比度和屏幕阅读器已验证。
- 原型与桌面实现使用同一路由和文档状态契约。