火次果
火次果

暂无菜单项

首页/文章/技术文章/web前端/HTML5/
打开 MD 链接

多选列表框的键盘导航:键位与状态

发布于 9小时前
2

多选列表框要能纯键盘操作,需要同时处理三件事:焦点在选项间移动、选中状态与视觉同步、读屏能读出当前项。缺一件,键盘操作就会中断。

键盘按键特写
键位与状态同步是键盘导航的两条主线

键位分工

按键 行为 焦点变化
上下方向键 在选项间移动 移动
空格 切换当前项选中 不移动
Enter 确认选择并关闭 不移动
Escape 放弃变更并关闭 不移动
Tab 离开整个控件 移出

上下键移动的是活动项,与已选中项是两套状态。把两者混用会导致方向键一按就改变选中结果。

结构

<ul role='listbox' aria-multiselectable='true' tabindex='0'>
  <li role='option' aria-selected='false' id='opt-1'>选项一</li>
  <li role='option' aria-selected='false' id='opt-2'>选项二</li>
</ul>

listbox 承担焦点,option 只表达选中状态。焦点始终落在容器上,活动项用 aria-activedescendant 指向当前 option 的 id。

状态处理

list.addEventListener('keydown', (e) => {
  if (e.key === 'ArrowDown') { move(1); e.preventDefault(); }
  if (e.key === ' ') { toggle(active); e.preventDefault(); }
});

方向键需要调用 preventDefault,否则页面会跟着滚动。空格同理,默认行为是翻页。

边界处理

  • 移到首尾时停止,不做环绕,避免焦点跳到另一端造成误操作。
  • 活动项必须滚动进可视区,用 scrollIntoView 配合 block 取 nearest。
  • 关闭后把焦点还给触发元素,键盘操作才不会丢失位置。
  • 选中变化需要同步更新 aria-selected,只改样式对读屏无效。

常见问题(FAQ)

方向键移动时页面跟着滚动?
需要在 keydown 里调用 preventDefault,方向键与空格都有各自的默认行为。
读屏读不出当前项怎么办?
容器用 aria-activedescendant 指向活动项的 id,并保持焦点落在容器上。
活动项与选中项要分开吗?
要分开,方向键只改变活动项,空格才改变选中状态。
移到末尾应该跳回开头吗?
不建议,边界处停止更符合预期,也避免误选。
关闭后焦点丢失怎么处理?
记录触发元素,关闭时把焦点还回该元素。
支持作者
如果这篇内容对你有帮助,可以请作者喝杯咖啡
0 点赞
0 收藏
分享
0 讨论
反馈
0 / 600
细中粗
0 讨论
热门最新
总结
暂无总结
嗨,下午好!
所有的成功,都源自一个勇敢的开始
创作
社区
购物
会员
近期热门

暂无数据

火次果
火次果
首页
资迅中心
小店
AI导航
社区
所有的成功,都源自一个勇敢的开始
不辜负每一个勇敢的开始
关于FAQ协议
火次果 © 2026