浮层需捕获焦点并可退出
别名: 焦点捕获 · 对话框焦点 · focus containment
概念解释
对话框、抽屉、弹出菜单一旦打开,键盘应当被关进这一层:捕获焦点(focus containment),并且必须留门——Escape、关闭按钮或等价操作能把焦点送回打开它的地方。捕获不是缺陷,是模态语义:底层暂时不可操作,焦点就不该溜到被挡住的控件上。没有门的捕获,才变成下一层要判的阻断。
非模态面板不要求把焦点锁死;但只要层是模态的,这两件事要成对出现:进去,以及能出来。
机制
模态的意义是「现在只允许回答这一层」。指针用户点遮罩或右上角就能结束;键盘用户没有「点外面」。若打开后焦点仍留在触发按钮上,Tab 会在被遮罩挡住的页面里行走,人既看不见焦点,也操作不了浮层里的字段。若焦点进了浮层却循环到遮罩后面的链接,同样是捕获失败。
正确的捕获做三件事:打开时把焦点移到层内第一个有意义的控件(或层本身);Tab 在层内首尾循环;关闭时把焦点还给触发者。门的最低配置是一个可聚焦的关闭控件,加上 Escape。缺任何一件,模态对键盘都不成立——不是「体验略差」,是模态契约只对指针兑现了。
怎么研究
打开每一种浮层(对话框、全屏抽屉、日期面板、命令面板),立刻看焦点在哪,然后 Tab 循环一周,再按 Escape,最后确认焦点回到打开它的控件。
记录三种失败:焦点没进去、循环漏到背景、关掉后焦点丢失(落到 body 或浏览器工具栏)。后一种在放大镜用户那里等于把视口甩到无意义的角落。
边界
工具提示、纯信息气泡不要捕获焦点,捕获会把阅读变成监禁。非模态侧栏应允许焦点在主区和面板之间移动,不要套用对话框的锁。移动端系统手势「下滑关闭」不是键盘的门,外接键盘仍要 Escape 或关闭按钮。自动打开的 cookie 墙和新手引导也是浮层,适用同一对要求,不能因为「只出现一次」就免捕获或免退出。
怎么落地
- 模态打开时把焦点移入层内;Tab 不得落到被遮罩的页面控件上。
- 层内提供可聚焦的关闭控件,并响应 Escape;关闭后焦点回到触发者。
- 验证:打开对话框,只使用键盘填完并关掉。焦点若在打开后仍停在原按钮、或关掉后找不到回来的位置,捕获或退出没有做成对。