内容为本、建设为基:无障碍设计创业的科技双轮驱动
|
去年国庆节那天,我蹲在亦庄那个老机房里改无障碍语义标签,空调外机嗡嗡震得人后槽牙发麻——不是频率高那种嗡,是低频的、带颤音的闷响,像有人用指甲在铁皮上反复刮了三百七十二下。监控屏幕右下角跳了一条报警:/api/v2/alt-text-generator timeout,我扫了眼没点开,顺手把泡面汤里的蛋花搅散了。 王磊在群里@我三遍,头两遍我当空气,第三遍他发了个“?”加一个歪嘴笑表情包,像素糊得能看见压缩伪影。我没回,盯着他上个月提的那个 PR —— 三百行 JSON Schema 配置,全在模拟读屏器的 focus trap 路径,但漏掉了 iOS VoiceOver 的 modal dialog 判定逻辑。我原以为补个 aria-modal=true 就能过,结果上线第二天,残联官网的蜘蛛直接绕开整个 /access/ 下所有页面,连 robots.txt 都没动它。这个我敢打包票,log 里清清楚楚写着 User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 17_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4 Mobile/15E148 Safari/604.1,后面跟着 404×27,没重试,没爬取子路径,干干脆脆掉头就走。 内容为本、建设为基:无障碍设计创业的科技双轮驱动。这句不是我写的,是甲方老板在融资BP第十七页底端小字里抠出来的。我把它抄进我们自己的 README.md 第二行时,张薇正啃着半块冷掉的绿豆糕, crumbs 掉进她键盘缝隙里,卡住了 R 键。她没管,说:“你先标 contentinfo,别管 footer 里那堆备案号的 span 嵌套。” 我照做了。结果昨天 QA 报 bug:微信内置浏览器下,语音导航跳过全部备案号区域,却在“京公网安备”那段突然停住,开始逐字朗读“京公海网安备11010802032932号”,念了两遍半。我说这得调 Web Speech API 的 pauseThreshold,她说你先看下 CDN 缓存头——Cache-Control: public, max-age=31536000, immutable,连 etag 都没带。这个我说不准。 优胜劣汰是真的。不是形容词,是物理层面的淘汰:上周三凌晨两点零七分,我们切了新架构的无障碍静态资源分发链路,CDN 配置从 origin pull 换成 origin push。不到十八秒,三个主流读屏器(NVDA 2024.1、JAWS 2023、TalkBack 15)在首屏渲染阶段的 QPS 差距拉开到 4:1:0.3;不是性能差,是根本没触发。后台日志显示 TalkBack 的 request headers 里 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8,而我们的响应头硬塞了个 application/ld+json + a11y-enhanced。它直接放弃。王磊说这叫“协议级筛选”,我点头的时候听见隔壁工位陈默在撕一包糖醋排骨味薯片,咔嚓咔嚓,每片裂开角度都不同。 失败案例不用编:上个月推了个「无障碍友好度自评」轻量版 SaaS,嵌入客户官网用 script 标签加载,测完自动上报。跑了四十七个站,有二十一个压根没触发 onl oad 回调。不是 CORS,不是 CSP,是它们用了 UMD 打包,把 window.addEventListener 写死在 define() 外层闭包里,我们的脚本注入时 global this 上的 addEventListener 还没被定义。最绝的是其中八个站——全是政府教育类,二级域名备案号都挂错了三次,最后一次改对了,可 DNS TTL 还没刷完,我们脚本又去 fetch /public/.well-known/a11y.json,404 返回体里混着 HTML 的 404 页面正文,还带百度统计 JS。这个我真服气,服到想截图发朋友圈,结果发现朋友圈早关了三年。 我手机现在还在震动,不是电话,是钉钉消息提示音循环播放——物业群发来一张图:机房配电柜面板上贴着张便签,“空调外机支架螺丝松动,请勿靠太近”。底下一行小字:“已联系维保,预计明天上午十点前处理”。我昨天就见过这张纸,当时没拍,今天拍了,照片里还能看见半截绿色荧光笔写的“⚠️”。
文章配图,仅供参考 说双轮驱动,其实轮子不圆。内容那轮偏重语义和上下文连贯性,建设这轮偏重可部署性和 infra 可观测性,但中间咬合齿根本没校准。比如我们用 schema.org 的 WebPage 类做内容结构标注,理论上该被 Google 蜘蛛收;可实际上它只抓 下的内容,完全无视我们的 main[aria-labelledby="page-title"] 属性绑定逻辑——因为那串 id 是 JS 渲染生成的,蜘蛛不执行。这事我跟张薇吵过两次,第一次她甩给我一份 Lighthouse audit 报告,第二次她直接把 config.yml 里 enableSemanticCrawling: false 改成 true,没留 comment。我都没拉 diff。 哦对,陈默刚才端着咖啡路过,说他女儿在学校写作文,《我的理想》,写了八百字,全在讲怎么给盲文电梯按钮加触觉引导纹理。她画了三张草图,第二张上用红笔圈出“按钮间距不能小于三点二厘米”,旁边批注:“老师说这是国标”。陈默没笑,把杯子放我桌上时,杯底水渍在 Markdown 文件上晕开一小片,刚好盖住“a11y-enhanced”这个词。 我现在要重跑一遍 CI pipeline,把 semantic-audit-step 从 stage: test 移到 stage: build,虽然知道它会在 pre-commit hook 里失败——因为本地没装 puppeteer-core 的 chromium headless 模块。但我得试试。反正王磊说今晚十点前必须过一轮合规扫描,他刚撤回一条消息,撤回前我瞄见末尾是“…备案号格式验证要…”。后面没了。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


ASP无障碍设计:视障开发者代码调试新突破
无障碍设计失灵?动态跨界整合破局
MySQL事务控制无障碍设计指南

