E5.02.3tab state preservation设计研究

切换标签需保留各标签内的位置状态

别名: 标签栈保持 · per-tab navigation stack · 切走再回来

概念解释

底部每个标签都是一条独立的导航栈:里面有自己的滚动位置、已打开的详情层、筛选和输入草稿。标签状态保持(tab state preservation)要求切到另一个标签再切回来时,这条栈还在原处,而不是被重置成该标签的根页。切换是换空间,不是把当前空间拆掉重建。

机制

人把每个标签理解成一间还亮着灯的房间。走进「消息」翻到某条对话,再去「我的」改头像,回来时期望对话仍打开、列表仍停在刚才的行。实现上这依赖每条栈单独保存:根列表的偏移、子页的层级、瞬时 UI(键盘是否收起可以变,但已输入的未提交内容不该丢)。若切换时销毁栈,用户会把底栏理解成「重新打开这个模块」,于是不敢离开,或离开前先把关键信息记在脑子里。

未保存的不只是滚动。筛选条件、分页位置、半填的发布草稿都属于「我在这个空间里进行到哪」。丢掉它们的代价在深栈上最高:从列表进详情再进子页,重置等于强迫重走整条路径。相反,永远不重置也会出问题——根页需要一个「再点一次当前标签回到顶部/根」的明确手势,否则深栈会把人困在子页里,看起来像标签坏了。

怎么研究

往返任务:在标签 A 深入两层并记下滚动位置,切到 B 完成无关操作,再切回 A,测量栈深度、滚动偏移和表单内容是否恢复。自变量是切换时是否销毁视图、进程是否被系统回收。因变量是恢复匹配率、重走路径的步数、以及「我刚才在哪」的口头报告。

进程被杀后的冷启动要分开统计。会话内切换失败是实现错误;进程外丢失是生命周期问题,两者会混在同一句「怎么又回到首页了」里。

边界

登录态失效、权限变化或数据被删后,旧栈可能指向不存在的对象,这时重置比恢复一个错误页更安全,但应落在根列表而不是随机一页。内存极紧的设备上系统会丢掉后台标签的视图,完全保持做不到,至少应恢复到该标签的根并尽量记住已打开的对象 id。强制刷新(下拉、再点当前标签)是用户主动放弃当前位置,不属于「切换破坏了状态」。搜索类目的地若每次进入都应是空查询,那是该空间自己的约定,不要当成整条底栏都可以重置。

怎么落地

  • 为每个标签保留独立栈:滚动偏移、层级、未提交草稿。切换只改变可见栈,不销毁另一条。
  • 提供一个显式的「回根」:再点一次当前标签回到该标签根页或列表顶部,避免深栈无法脱身,也不要把这个手势做成无提示的清空。
  • 冷启动时优先恢复「打开过的对象」,其次才是像素级滚动;对象已不存在则回到根列表并说明。
  • 验证:在一个标签深入两层,切走再切回,对照进入前的截屏。深度、偏移或草稿任一丢失即失败。再测再点当前标签是否只在用户明确回根时才重置。

延伸

  • 同组E5.02.1 标签数量上限受宽度与可读性约束 · E5.02.2 标签必须是并列的目的地而非动作
  • 相邻E5.07 无限滚动 · E5.11 页签
  • 站内检索tab state preservation · navigation stack · scroll restoration

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/E5.02.3