用 div 拼出来的下拉选择外观和原生控件一样,键盘按上下键没有任何反应,Tab 直接跳走,用户只能用鼠标一格一格点。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,原生 select 的键盘行为由浏览器实现,换成 div 之后这些都要自己写,role 和 keydown 一个都没补上,键盘用户进得去却一个都选不了,体验直接断层。
「自定义下拉键盘操作」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。改完顺手把文档补一句,省得下次自己重新推一遍。
<div role='listbox' tabindex='0' aria-label='城市'> <div role='option' aria-selected='true'>杭州</div> <div role='option' aria-selected='false'>苏州</div>
监控和日志的时间要对上,时区不一致会多绕很大一圈。
具体做法是,容器上标明这是列表,每个选项单独标明自己是一个可选项;在键盘事件里处理上下键移动、回车选中和 Esc 关闭这几件事;把当前选中的值写进 aria-selected,界面上同步显示对应的文本。
最后用这个标准收尾,全程不碰鼠标,Tab 进入后上下键能选完,回车确认一次就能落到表单里。
