本文详解为何在 span 中嵌套带 tabindex 和 role=”link” 的 a 标签会破坏键盘可访问性,并提供符合 wcag 与 aria 最佳实践的原生 html 解决方案,避免冗余属性,确保 enter 键可触发跳转。
在构建响应式品牌 logo 网格时,开发者常误用 tabindex=”0″ 和 role=”link” 强行“增强”非交互元素的可访问性。但正如 W3C 明确指出的——ARIA 的第一条黄金法则就是:优先使用语义化原生 HTML 元素。你的当前结构:
" aria-label="Go to website" tabindex="0">
@@##@@" src="">
存在两个关键问题:
- 双重焦点陷阱:外层 与内层 均成为独立 tab 停止点,导致用户需按两次 Tab 才能遍历一个逻辑链接,严重违背“一个可操作单元,一个焦点”的无障碍原则;
- 语义冲突与行为缺失: 虽被屏幕阅读器识别为链接,但它本身不具备原生 的键盘交互能力——Enter 键无法触发跳转,Space 键也本就不应激活链接(仅按钮支持 Space),强行赋予角色却未实现对应行为,反而造成认知混乱。
✅ 正确做法是完全移除外层 span 的所有可访问性干预,仅保留其作为纯粹的样式容器功能: