给 details 折叠面板加键盘支持,多数教程从监听 keydown 讲起。实际上 details 的键盘交互是浏览器原生行为,不加一行脚本就已经可用。

原生已有什么
summary 元素天然可聚焦,Tab 键可以移到上面,回车与空格都能切换展开状态。读屏软件会把它播报为按钮并附带展开状态。这套行为零成本,也是 div 模拟方案要花几十行才能追平的基线。
什么时候才需要脚本
两类场景:一是绑定全局快捷键,例如按斜杠展开搜索面板;二是程序化控制,例如 hash 变化时展开对应面板。两者都是补充,不是替代。
正确的切换方式
panel.toggleAttribute('open');
open 是布尔属性,存在即展开。用 toggleAttribute 切换与原生行为完全一致,toggle 事件照常触发,CSS 选择器照常命中。
三个错误做法
其一,panel.open = ‘false’。布尔属性只看存在与否,赋值字符串 false 依然是展开状态。
其二,summary.click()。模拟点击绕开了焦点管理,键盘用户的焦点位置会丢失。
其三,给 summary 套 button。summary 自身已有按钮角色,再套一层会让读屏软件报出嵌套按钮,反而破坏无障碍。
快捷键的补充写法
addEventListener('keydown', (e) => {
if (e.key === '/' && !e.target.matches('input, textarea')) {
e.preventDefault();
panel.toggleAttribute('open');
panel.querySelector('summary').focus();
}
});
输入框获得焦点时不拦截按键,切换后把焦点交给 summary,键盘流保持连续。
