R3.02.3reset focus on route change设计
路由切换需重置焦点位置
别名: 路由后重置焦点 · SPA 换页移焦 · focus reset on navigation
概念解释
整页刷新时,浏览器会把焦点放回文档开头。客户端路由只换掉一块内容、地址栏变了,焦点指针却还停在上一页留下的节点上——常常是顶栏里那个还活着的导航按钮。对键盘和读屏来说,这不像到了新页面,像还站在旧控件上。路由一切换,就要把焦点重置到新视图的起始位置。
重置针对的是「换了一页」:路径变了、主内容换成另一份视图。同一页里的筛选、分页、页内锚点,不是路由重置要处理的对象。
机制
单页应用把新视图插进仍活着的外壳。顶栏、侧栏、那个被点过的导航项往往没有被销毁,焦点继续附着。用户点「设置」、主栏换成设置页,指针仍在导航的「设置」上:读屏听不到新页的标题,下一次 Tab 可能在导航里打转,主内容等于还没被进入。
整页加载自带一次「从文档开始」的重置,单页路由必须人工模仿这一次。常见落点是新视图的主标题(允许程序聚焦)或跳过导航之后的第一块。不重置,换页在视觉上完成了,辅助通道的「当前页」没有换。外壳越稳定、路由越频繁,这个错位越容易变成默认体验。
边界
页内锚点、手风琴、选项卡如果不改路由,应按「动态内容出现」来移焦,而不是当成换页重置到标题——否则会把人从刚打开的那一块拽到页顶。路由打开的是叠在当前页上的浮层(同一地址上的对话框),关闭时应归还触发处,而不是重置到新「页」的标题。返回键回到上一视图时,有的产品希望恢复离开前的焦点而不是每次都到标题;若选择恢复,必须是明确产品行为,并保证上一视图的触发还在。重定向链上只在最终视图重置一次,不要每跳一次地址就抢一次焦点。
怎么落地
- 在路由提交成功后,把焦点设到新视图的主标题或约定的起始节点,并让该节点可被程序聚焦。
- 换页时不要让焦点留在外壳导航上;导航可以还在,指针必须进主内容。
- 把「筛选项、页内 tab、哈希锚点」排除在路由重置之外,分别写它们自己的落点。
- 验证:在页面中部一个控件上用键盘触发导航。新视图应被读屏从标题读起,焦点指示在主内容起始,下一次 Tab 进入新视图而不是停在旧导航。指针仍在刚才那个导航项上,就是路由只换了内容、没重置焦点。