R3.02.3reset focus on route change设计

路由切换需重置焦点位置

别名: 路由后重置焦点 · SPA 换页移焦 · focus reset on navigation

概念解释

整页刷新时,浏览器会把焦点放回文档开头。客户端路由只换掉一块内容、地址栏变了,焦点指针却还停在上一页留下的节点上——常常是顶栏里那个还活着的导航按钮。对键盘和读屏来说,这不像到了新页面,像还站在旧控件上。路由一切换,就要把焦点重置到新视图的起始位置。

重置针对的是「换了一页」:路径变了、主内容换成另一份视图。同一页里的筛选、分页、页内锚点,不是路由重置要处理的对象。

机制

单页应用把新视图插进仍活着的外壳。顶栏、侧栏、那个被点过的导航项往往没有被销毁,焦点继续附着。用户点「设置」、主栏换成设置页,指针仍在导航的「设置」上:读屏听不到新页的标题,下一次 Tab 可能在导航里打转,主内容等于还没被进入。

整页加载自带一次「从文档开始」的重置,单页路由必须人工模仿这一次。常见落点是新视图的主标题(允许程序聚焦)或跳过导航之后的第一块。不重置,换页在视觉上完成了,辅助通道的「当前页」没有换。外壳越稳定、路由越频繁,这个错位越容易变成默认体验。

边界

页内锚点、手风琴、选项卡如果不改路由,应按「动态内容出现」来移焦,而不是当成换页重置到标题——否则会把人从刚打开的那一块拽到页顶。路由打开的是叠在当前页上的浮层(同一地址上的对话框),关闭时应归还触发处,而不是重置到新「页」的标题。返回键回到上一视图时,有的产品希望恢复离开前的焦点而不是每次都到标题;若选择恢复,必须是明确产品行为,并保证上一视图的触发还在。重定向链上只在最终视图重置一次,不要每跳一次地址就抢一次焦点。

怎么落地

  • 在路由提交成功后,把焦点设到新视图的主标题或约定的起始节点,并让该节点可被程序聚焦。
  • 换页时不要让焦点留在外壳导航上;导航可以还在,指针必须进主内容。
  • 把「筛选项、页内 tab、哈希锚点」排除在路由重置之外,分别写它们自己的落点。
  • 验证:在页面中部一个控件上用键盘触发导航。新视图应被读屏从标题读起,焦点指示在主内容起始,下一次 Tab 进入新视图而不是停在旧导航。指针仍在刚才那个导航项上,就是路由只换了内容、没重置焦点。

延伸

  • 同组R3.02.1 动态内容出现后需移动焦点 · R3.02.2 关闭浮层需归还焦点到触发处
  • 相邻J2.06 焦点可见性 · R3.10 焦点管理的实现要点
  • 站内检索reset focus on route change · SPA focus · new view heading focus

同组卡片

快捷操作

分享

分享当前页面

ios_share

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