加入收藏 | 设为首页 | 会员中心 | 我要投稿 站长网 (https://www.0951zz.com/)- 云通信、基础存储、云上网络、机器学习、视觉智能!
当前位置: 首页 > 运营中心 > 建站资源 > 策划 > 正文

无障碍建站:重构人与信息的技术关系

发布时间:2026-11-03 14:05:40 所属栏目:策划 来源:DaWei
导读:  告警响的那一刻,我正把泡面叉子插进最后一块蛋里。没咽下去,先看了眼手机——三台机器同时掉在同一个健康检查路径上,/accessibility/health。不是 /api/v1,不是 /status,是那个我们上个月刚加进去、连监控面板都还没

  告警响的那一刻,我正把泡面叉子插进最后一块蛋里。没咽下去,先看了眼手机——三台机器同时掉在同一个健康检查路径上,/accessibility/health。不是 /api/v1,不是 /status,是那个我们上个月刚加进去、连监控面板都还没来得及配图标的 /accessibility/health。我原以为是开发又往 nginx 里塞了段带 typo 的 rewrite,结果 curl 了一下,返回 200,但响应体里写着“aria-hidden=true on root div”。


文章配图,仅供参考

  火大。真火大。去年一月的事,现在想起来指尖还在发紧。不是因为改版上线慢——慢我们惯了,CDN 刷新要等两小时,前端静态资源缓存 TTL 设成一年半,这种事儿我早认了。是因为那天凌晨三点半,开发小陈在钉钉语音里说:“用户看不见的 dom 就不该渲染啊”,而我说:“可屏幕阅读器需要它”,他顿了三秒回我:“那它就该在 DOM 里,不该在 JS 里造。” 我当时没接话,其实心里想的是:操,这人怎么把 aria 属性当 React state 用?


  机房很冷。每次半夜过去都像进冷库,穿毛衣还得裹工装外套。那天也是,推开门听见风扇声比平时大,不是故障告警那种尖啸,是某几台电源模块过载的闷响。我蹲在第三排机柜前看日志,手指冻得有点抖,终端里 grep -r “role=” 的时候输错两次,漏了个反斜杠,结果把整套 CI 构建脚本全 grepped 进去了。反正也没备份。真的没——那套无障碍语义校验脚本是我自己写的,本地 commit 都没 push,改到一半就直接跑 prod 做 smoke test。你问我为啥?因为 QA 说“听不到读屏声就不算缺陷”,测试用例里根本没留 voiceover 路径,连模拟器都只开了 ChromeVox 最新版。我认了。这事本来能避免。


  窗外天快亮了。灰蓝色那种,路灯还亮着,但光已经发虚。我盯着 Kibana 里 accessibility_error_rate 的曲线,突然发现峰值不在用户端,而在我们的埋点服务本身——它每秒吞掉两千个「readable: false」上报,然后把其中八百个标为「semantic_mismatch」扔进死信队列。我们之前只当是数据毛刺。结果?查了两天,发现是某个内部运营系统导出的 HTML 表格,自动生成了 role="grid",但没给 row 和 cell 分配正确 role。开发说:“这又不是我们页面。” 我说:“可它被 iframe 在 /admin/dashboard 里,而 dashboard 页面用了 global aria-modal 状态锁屏……所以读屏用户卡死在 modal 外层,永远点不进表格。” 没查清根因,但我知道:它不会从日志里浮上来,只会藏在用户退出率曲线的毛刺里,等三个月后业务方问“为什么 admin 使用时长跌了 37%”才被翻出来。


  跟开发吵了一架。就在楼梯间。他说:“你搞无障碍,是不是觉得盲人同事每天靠 tab 键活着?” 我说:“不,是他们靠 shift+tab 回退时,发现我们菜单弹窗关不掉。” 他愣住,转身就走,鞋跟敲地声特别响。我没追。后来听说他老婆预产期就那周,手机屏保是 B 超图。我倒了杯凉透的咖啡,坐在工位上啃掉半包饼干——不是饿,就是手里得抓点东西。饼干碎屑掉在键盘缝里,和去年删掉的那套 IE6 兼容补丁残片混在一起。谁还记得补丁叫什么名字?反正删了,也无所谓。


  优胜劣汰——这词不是喊口号。是真淘汰。我们上线前压测,发现开启 VoiceOver 后首屏渲染延迟涨了四倍,不是 JS 执行慢,是系统在遍历整棵可访问树。iOS 端直接拒绝挂起 WebView,触发内存回收,三台机器里有一台崩在 accessibilityTree.build() 的第八层递归里。崩溃日志里写得清楚:“AXElement creation failed: null node ref”。没人管这句。运维不管,开发不认,产品说“用户没反馈”。结果呢?三个月后新来的盲人实习生试用期考核,用的正是这套 admin 系统。她交回的 feedback 里有一句:“我点了十七次‘确认’,系统始终读作‘未选中’。” 没人转达给我们。直到她离职交接时 HR 才甩来截图。我打开一看,是那个用了 role="checkbox" 但没写 aria-checked 的 switch 组件——就挂在权限配置页右下角,我们所有人天天点,但没人用键盘去过那儿。


  值班表改了三次。上个月起强制轮值无障碍巡检岗,每周三晚上九点必须跑一遍 axe-core + NVDA + TalkBack 组合拳。我填表的时候手滑,把“李姐”写成“李婶”,她看见后微信回我:“别改了,我就当回婶儿。” 李姐今年五十出头,在运维干了十八年,服务器 BIOS 密码比她儿子生日记得熟。她说这话时,手机镜头晃了一下,背景是厨房灶台,锅还在烧,水汽蒙住了整个屏幕。我回了个“嗯”,没打标点。


  我其实早该知道。上个月迁移 CDN,切流前照例跑 audit —— 结果 report 里跳出条 warning:color contrast ratio below 4.5:1 in .error-tip。我们团队里没人色弱,测试用例也只跑 success path。但 error-tip 里的红色文字,对红绿色觉障碍用户来说就是灰的。它从来不会报错,只是永远不被看见。就像我们一直删掉的那些 alt="" 的图标按钮;就像那个用了 aria-live 但 never clear 的 toast 提示;就像所有“不影响功能”的问题,它们安静地活下来,活到某天有人靠它们导航世界,然后彻底迷路。


  反正补吧。补 axe 规则集里那十三项 WCAG 2.2 新增项;补 CI 流水线里缺失的屏幕阅读器兼容性 check;补我自己那台笔记本上还开着的三个未提交分支——其中一个命名是“aria-refactor-wip-DO-NOT-MERGE”,另一个叫“why-is-landmark-empty-2023”,第三个……算了,不说了。泡面桶还在桌上,汤冷了,结了一层薄油膜。我把它推到显示器右侧,挡住一半告警看板。不是遮,是不想再数第几次闪红了。

(编辑:站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!