![]()
去年某电商大促期间,一位视障用户向客服投诉:「你们的价格页面根本打不开。」技术团队排查三天,链接正常、服务器没崩、代码没报错。问题藏在第47行——一个精心编写的aria-label把「Pricing」读成了「View our plans and pricing information」,而客服让他「点Pricing链接」。
这不是孤例。我过去六个月审了23个项目的无障碍修复报告,发现一个反直觉的规律:ARIA标签越多,网站对视障用户越不友好。平均每个过度优化的页面藏着4.7个语义冲突点,87%的冗余ARIA正在扮演「数字障眼法」。
「第一规则」被无视的代价
ARIA规范文档有个冷门的「第一规则」,字面意思就叫「ARIA使用第一规则」:能用原生HTML元素时,别用ARIA。
大多数开发者没读过这条。团队被审计出无障碍问题后,有人Google「how to make accessible」,然后开始像撒辣椒酱一样到处加ARIA属性。更多ARIA等于更无障碍?这是个危险的等式。
某生产环境的真实代码让我印象深刻:
Submit form
三个ARIA属性,全部多余。元素自带隐式role="button";可见文本「Submit form」本就是可访问名称;aria-roledescription用一模一样的词覆盖了浏览器原生描述。这就像给自行车装三个铃铛,还都绑在同一个位置。
危害不止冗余。当ARIA标签与可见文本并存,部分屏幕阅读器会优先播报ARIA内容。两者一旦脱节——而它们一定会脱节,因为开发者改文案时根本想不起还有个隐藏的aria-label——明眼用户看到「提交」,视障用户听到「确认并保存当前表单数据」,同一界面分裂成两个版本。
语义欺诈:当ARIA开始撒谎
冗余只是烦人,真正的破坏发生在ARIA覆盖正确语义时。
React组件库里有个我每周都能见到的模式:
Dashboard
这个链接被强行扮成按钮。屏幕阅读器播报「Go to dashboard, button」。但它不是按钮,它导航到新页面。听到「button」的用户预期当前页执行操作,听到「link」的用户知道即将跳转。这个区分对空间定向至关重要,而ARIA属性正在系统性欺骗用户。
修复方案是减法而非加法:
Dashboard
浏览器处理其余一切。屏幕阅读器播报「Dashboard, link」,用户明确知道将要发生什么。
这种「角色错配」在SPA(单页应用)里尤其泛滥。开发者为了拦截点击事件,把该用
的地方全写成
,再用ARIA强行「配音」。结果?键盘焦点管理崩了、屏幕阅读器导航乱了、用户认知模型碎了。
ARIA的正确打开方式
有些场景确实需要ARIA。最常见的是动态内容:模态框弹出时,aria-modal和aria-labelledby能告诉屏幕阅读器「暂停浏览底层内容,先处理这个对话框」。原生HTML没有对应机制,这是ARIA的合法领地。
另一个典型用例是复杂组件的状态传达。自定义下拉菜单的展开/收起、选项列表的当前选中项——这些视觉状态需要ARIA桥接到非视觉通道。aria-expanded、aria-selected在这里是必要的基础设施。
但有个筛选标准:先问自己「原生元素能不能解决」。能,就删掉ARIA。不能,再考虑用最精简的ARIA补位。
某金融科技产品的案例很说明问题。他们的数据表格用了大量aria-label描述列头,结果屏幕阅读器用户反馈「信息过载,听不完一行的数据」。改成语义化的配合scope属性后,可访问性评分从62分跃升至94分,代码量反而减少了30%。
审计清单:你的ARIA是资产还是负债
基于过去半年的修复经验,我整理了一个快速自检框架。不需要专业工具,浏览器开发者模式就能完成。
第一步,关闭CSS。裸HTML应该仍然语义自洽。如果某个交互元素在裸页面上无法识别,ARIA只是给它化了妆,而非治好了病。
第二步,检查ARIA与可见文本的一致性。用屏幕阅读器模拟器(Chrome的Accessibility Inspector或Firefox的辅助功能面板)对比播报内容与视觉呈现。任何差异都是技术债务。
第三步,追踪动态更新。打开Mutation Observer,观察ARIA属性是否在用户无操作时频繁变化。高频变动通常意味着状态管理混乱,视障用户会被持续打断。
某SaaS平台的教训值得参考。他们的ARIA覆盖率从12%提升到89%的过程中,关键任务完成率反而下降了19%。根因?过度使用aria-live区域导致屏幕阅读器不断插播「加载中」「已更新」「操作成功」,用户无法连贯听取主内容。
把ARIA音量调低后,完成率回升并创下新高。
「无障碍修复」这个标签本身就有问题。它暗示无障碍是个附加功能,可以后期「打补丁」。但ARIA的滥用恰恰证明:补丁式思维制造的新问题,往往比旧问题更难排查。那个「Pricing」链接的投诉,最终花了47人时定位——而删除冗余ARIA只需30秒。
你的代码库里有多少个aria-label正在与可见文本玩「大家来找茬」?下一次审计之前,或许可以先做一轮「ARIA删除挑战」:每删掉一个属性,测试一次屏幕阅读器体验。结果可能会让你重新理解「少即是多」在无障碍领域的含义。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.