C6.05.3Focus trap and restoration设计研究

浮层需捕获焦点并在关闭后归还

别名: 焦点陷阱 · 焦点归还 · 模态焦点

概念解释

对话框、弹出菜单、全屏浮层在打开期间应当把键盘焦点关在浮层内部:Tab 在浮层的控件之间循环,不能落到被盖住的页面上。关闭时焦点必须回到打开它的那一个控件,而不是被丢到文档开头或某个看不见的节点。捕获解决的是“焦点逃出视线”,归还解决的是“回来之后从哪继续”。

机制

浮层在视觉上盖住了底下的界面,焦点序列若仍包含底下的按钮,人会把键发给看不见的控件,提交、删除或把输入打进被挡住的字段。捕获把序列临时换成浮层内的那一小段,Escape 或明确的关闭按钮再把这段临时序列拆掉。归还依赖打开时记下的触发器引用:没有这份引用,关闭后焦点只能落到 body 或第一条可聚焦元素,用户要重新 Tab 回刚才的位置。嵌套浮层(菜单开在对话框上)需要栈,而不是一个全局“当前焦点”变量:内层关闭应回到外层浮层,而不是直接回到页面。未能捕获和未能归还是两类失败,会以“焦点在底下乱跳”和“关掉以后找不到自己”分别出现。

怎么研究

键盘-only 打开、在内部走一圈、尝试 Tab 出界、再关闭,记录焦点是否离开浮层、关闭后落点是否为触发器。自变量包括浮层类型(模态、非模态、菜单)、嵌套层数、打开方式(按钮、自动弹出);因变量包括逃逸次数、归还正确率和关闭后重新定位时间。用鼠标点遮罩关闭再看屏幕,会看不到归还失败。

边界

非模态面板(侧栏、检查器)通常不应捕获焦点,否则页面其余部分的键盘路径被切断;它们需要的是打开时把焦点送进去,关闭时归还,但不拦截通往页面的 Tab。自动弹出的广告或权限请求若捕获焦点,会从用户正在做的字段里把输入抢走。工具提示和纯展示的气泡不应进入焦点序列,也就谈不上捕获。

怎么落地

  • 模态浮层打开时将焦点移入其第一个有意义的控件,在内部循环 Tab,并用 Escape 与关闭按钮走同一条关闭路径。
  • 关闭时把焦点设回触发器;触发器已被删除则设到逻辑上的下一处,而不是 document 开头。
  • 键盘走查嵌套浮层:内层关闭后焦点应仍在外层之内,外层关闭后才回到页面触发器。

延伸

  • 同组C6.05.1 Tab 顺序应与视觉阅读顺序一致 · C6.05.2 焦点必须可见 · C6.05.4 隐藏元素不得留在焦点序列中
  • 相邻C6.22 焦点顺序与键盘导航 · C6.06 软键盘与屏幕占用
  • 站内检索focus trap · focus restoration · modal dialog

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/C6.05.3