J3.02.2modal focus trap设计研究

浮层需捕获焦点并可退出

别名: 焦点捕获 · 对话框焦点 · focus containment

概念解释

对话框、抽屉、弹出菜单一旦打开,键盘应当被关进这一层:捕获焦点(focus containment),并且必须留门——Escape、关闭按钮或等价操作能把焦点送回打开它的地方。捕获不是缺陷,是模态语义:底层暂时不可操作,焦点就不该溜到被挡住的控件上。没有门的捕获,才变成下一层要判的阻断。

非模态面板不要求把焦点锁死;但只要层是模态的,这两件事要成对出现:进去,以及能出来。

机制

模态的意义是「现在只允许回答这一层」。指针用户点遮罩或右上角就能结束;键盘用户没有「点外面」。若打开后焦点仍留在触发按钮上,Tab 会在被遮罩挡住的页面里行走,人既看不见焦点,也操作不了浮层里的字段。若焦点进了浮层却循环到遮罩后面的链接,同样是捕获失败。

正确的捕获做三件事:打开时把焦点移到层内第一个有意义的控件(或层本身);Tab 在层内首尾循环;关闭时把焦点还给触发者。门的最低配置是一个可聚焦的关闭控件,加上 Escape。缺任何一件,模态对键盘都不成立——不是「体验略差」,是模态契约只对指针兑现了。

怎么研究

打开每一种浮层(对话框、全屏抽屉、日期面板、命令面板),立刻看焦点在哪,然后 Tab 循环一周,再按 Escape,最后确认焦点回到打开它的控件。

记录三种失败:焦点没进去、循环漏到背景、关掉后焦点丢失(落到 body 或浏览器工具栏)。后一种在放大镜用户那里等于把视口甩到无意义的角落。

边界

工具提示、纯信息气泡不要捕获焦点,捕获会把阅读变成监禁。非模态侧栏应允许焦点在主区和面板之间移动,不要套用对话框的锁。移动端系统手势「下滑关闭」不是键盘的门,外接键盘仍要 Escape 或关闭按钮。自动打开的 cookie 墙和新手引导也是浮层,适用同一对要求,不能因为「只出现一次」就免捕获或免退出。

怎么落地

  • 模态打开时把焦点移入层内;Tab 不得落到被遮罩的页面控件上。
  • 层内提供可聚焦的关闭控件,并响应 Escape;关闭后焦点回到触发者。
  • 验证:打开对话框,只使用键盘填完并关掉。焦点若在打开后仍停在原按钮、或关掉后找不到回来的位置,捕获或退出没有做成对。

延伸

  • 同组J3.02.1 焦点顺序需与视觉顺序一致 · J3.02.3 无法退出的焦点陷阱是阻断性缺陷 · J3.02.4 动态插入的元素若不显式管理焦点,会默认停留在原处造成脱节 · J3.02.5 焦点顺序应随可见的动态变化(如展开、隐藏)实时更新 · J3.02.6 检测焦点顺序问题需要实际用键盘遍历而非仅检查代码顺序 · J3.02.7 多层嵌套的浮层各自捕获焦点时可能相互冲突形成死锁
  • 相邻E4.10 模态对话框 · J3.01 键盘可达 · J2.06 焦点可见性
  • 站内检索focus containment · modal focus · focus restore

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/J3.02.2