当使用 `opacity: 0` 隐藏文件输入框以实现可点击头像上传时,原生焦点环会消失;本文介绍通过 `:focus-within` 伪类在父容器上模拟可见焦点状态,兼顾可访问性与视觉反馈。 在构建可访问的用户
|
当使用 `opacity: 0` 隐藏文件输入框以实现可点击头像上传时,原生焦点环会消失;本文介绍通过 `:focus-within` 伪类在父容器上模拟可见焦点状态,兼顾可访问性与视觉反馈。 在构建可访问的用户头像上传组件时,常见做法是将 <input type="file"> 叠加在可视元素(如头像图片)之上,并设为 opacity: 0 —— 这样既保持其在 DOM 中的可聚焦性、可键盘操作性(支持 Tab 导航和 Enter 触发),又不影响视觉布局。但副作用也很明显:透明输入框获得焦点后,浏览器默认的 outline 不再可见,导致键盘用户无法感知当前焦点位置,严重损害可访问性(a11y)。 解决该问题的核心思路是:不依赖输入框自身的 outline,而是在其可感知的父容器上响应焦点状态。CSS 提供了完美的原生方案::focus-within 伪类。它会在该元素自身或其任意后代元素获得焦点时触发匹配,因此只需将其应用于 .profile-pic 容器,并添加清晰、符合 WCAG 标准的焦点样式即可。 以下为推荐实现(已整合至原有 CSS):
?? 注意事项与增强建议:
通过 :focus-within,我们以声明式、轻量、高可访问的方式,让「看不见的输入框」拥有「看得见的焦点」——这不仅是技术实现,更是对所有用户平等交互权利的尊重。 |
2021-04-14
2023-10-11
2021-04-29
2023-11-01
2018-01-07