
你有没有想过,当我们用眼睛快速扫过网页找按钮、读文字时,视障用户是怎么“浏览”网页的?他们靠的就是屏幕阅读器——这个把网页内容转成语音或盲文的工具。但作为前端开发者,你写的代码如果没考虑到屏幕阅读器的“脾气”,用户可能完全摸不着北。去年我帮一个政务网站做优化,测试时用NVDA屏幕阅读器打开页面,结果整个导航栏都被读成“div、div、div”,用户根本不知道哪个是“首页”哪个是“办事指南”。后来才发现,之前的开发者图省事,全用div模拟按钮和导航,完全没考虑语义化。
其实屏幕阅读器不是直接“看”界面,而是“读”网页的DOM结构和语义信息。打个比方,你写的HTML就像一本书的目录,屏幕阅读器就是根据这个目录来给用户“念”内容的。如果目录乱标(比如把“章节标题”标成“段落”),读者肯定 confusion。所以前端开发兼容屏幕阅读器,核心就是让代码的“语义”和视觉表现一致。
前端开发最容易踩的3个“无障碍坑”
我见过很多项目,功能做得花哨,但在无障碍这块栽跟头。 下来,这几个坑你大概率也遇到过:
提交
代替
,或者用查看详情
当链接。视觉上没问题,但屏幕阅读器不认——它会觉得这就是个普通文本块,不会提示“可点击”,视障用户自然不知道这是个按钮。之前我接手的一个后台系统,整个表单的提交按钮都是div做的,测试时视障同事用Tab键根本切不到按钮上,最后只能全改成
,虽然多写几行CSS调整样式,但用户体验直接拉满。 
?对我们来说能看到是首页图标,但屏幕阅读器只会说“图片”,用户完全不知道这是啥。还有些人觉得“装饰性图片不用加alt”,但其实应该写成alt=""
(空alt),告诉屏幕阅读器“这图不重要,可以跳过”,不然它会一直提示“图片”,打断阅读节奏。 aria-live="polite"
,屏幕阅读器才会自动读出新消息,用户反馈瞬间变好了。 3步让你的网页“说人话”:前端兼容屏幕阅读器实操指南
知道了问题在哪,接下来就说说怎么改。其实不用大动干戈,几个小技巧就能让屏幕阅读器“读懂”你的网页。我把这些方法 成了“3步走”,亲测在多个项目里有效,你可以直接套用。
第一步:让HTML标签“各司其职”——语义化比样式重要10倍
很多人觉得“HTML随便写,CSS能调好样式就行”,但对屏幕阅读器来说,标签的语义比样式重要多了。就像你穿衣服,穿错衣服别人可能认错你的身份,标签用错,屏幕阅读器也会认错元素的“身份”。
你可以记住这个原则:看到视觉上是“标题”的,就用
–
;是“段落”就用
;是“列表”就用
/
;是“按钮”必须用;是“链接”必须用
。别觉得麻烦,这些标签自带“可访问性”属性,比如
默认支持键盘聚焦(Tab键能选中)、屏幕阅读器会提示“按钮”,而div需要手动加
tabindex
和role="button"
,反而更麻烦。
举个例子,导航菜单应该用
这样屏幕阅读器会读“导航区域,列表项1:首页,链接;列表项2:新闻,链接”,用户一听就知道这是导航菜单,能点进不同页面。如果你用div套div,它可能只会读“div,div,首页,div,新闻”,用户完全没概念。
第二步:用ARIA属性给“特殊情况”打补丁
有时候语义化标签不够用,比如自定义组件(像标签页、弹出框),这时候就需要ARIA(Accessible Rich Internet Applications)属性来“补充说明”。你可以把ARIA理解成“给屏幕阅读器的注释”,告诉它这个元素是干嘛的、什么状态。
我整理了几个前端开发最常用的ARIA属性,做成了表格,你可以存下来当速查手册:
ARIA属性 | 作用 | 使用场景 |
---|---|---|
aria-label | 给元素加“隐形标签”,屏幕阅读器会读这个标签 | 图标按钮(如搜索按钮只有放大镜图标,加aria-label=”搜索”) |
aria-live | 告诉屏幕阅读器“这个区域内容会动态更新,更新时通知我” | 表单提交提示、聊天消息、加载状态 |
aria-expanded | 标记折叠面板/下拉菜单是否展开(true/false) | 导航下拉菜单、折叠面板 |
aria-hidden=”true” | 告诉屏幕阅读器“忽略这个元素” | 纯装饰性图标、视觉效果元素(不影响功能) |
比如你做了个搜索框,按钮是个放大镜图标,代码可以这样写:
这样屏幕阅读器会读“搜索,按钮”,用户就知道这是搜索按钮,而图标本身被aria-hidden="true"
隐藏,不会干扰阅读。
第三步:动态内容要“主动喊”屏幕阅读器
现在的网页越来越多动态内容——加载更多、表单验证、弹窗提示……这些内容如果不主动“告诉”屏幕阅读器,用户根本不知道发生了变化。我之前做一个在线考试系统,提交答案后弹出“正确”提示,但屏幕阅读器没反应,视障考生还以为提交失败,反复点击,后来加了aria-live
才解决。
具体怎么做呢?有两种常见情况:
aria-live="polite"
。这个属性会让屏幕阅读器在当前朗读结束后,主动读更新的内容。比如表单提交后: html
JS更新内容时:document.getElementById(‘message’).textContent = ‘提交成功!’,屏幕阅读器就会自动读出“提交成功”。
。这种会打断当前朗读,优先读新内容,适合紧急情况,比如“密码错误,请重新输入”。
动态添加的元素(比如加载更多的列表项),要确保它们被添加到DOM后,屏幕阅读器能“找到”。最好的办法是把动态内容放在一个有语义的容器里,比如
,新项用
添加,屏幕阅读器会识别这是列表的一部分。
开发时怎么测试?3个免费工具帮你“化身”视障用户
光写代码还不够,得亲自测试才行。推荐3个我常用的工具,都是免费的,操作也简单:
VoiceOver(Mac/iOS自带):苹果设备直接按
Cmd+F5开启,用
Ctrl+Option+右箭头逐元素朗读,
Ctrl+Option+U打开 rotor 菜单(能快速跳转到标题、链接等)。我平时用Mac开发,基本靠它测基础兼容性。
键开启,
Down Arrow逐行朗读,
Tab键跳转到可交互元素。 测试时记住一个原则:不用鼠标,只用键盘和屏幕阅读器操作整个页面。比如注册流程,从输入账号到提交,全程用Tab键切换焦点,听屏幕阅读器怎么读,你会发现很多平时忽略的问题——比如某个输入框没提示“请输入手机号”,或者模态框弹出后背景还能被选中。
你最近开发的项目有没有考虑过无障碍?其实做好屏幕阅读器兼容不只是“做公益”,很多国家已经把网站无障碍纳入法规(比如欧盟的EN 301 549),而且据W3C统计,全球有超过10亿人存在不同程度的障碍,优化无障碍体验相当于打开了一个巨大的用户市场。如果试了这些方法,欢迎回来分享你遇到的问题——比如某个组件怎么调都不兼容,说不定我们能一起找到解决方案呢!
找屏幕阅读器其实不难,就是不同手机牌子藏的地方稍微有点不一样,但肯定都在系统设置里,新手不用慌。你先打开手机的“设置”,就是那个齿轮图标,进去之后最方便的是直接在顶部搜索框搜“屏幕阅读器”,系统会直接把你带到那个开关,点一下就能打开,这个方法对所有手机都管用,我自己给家里老人设置的时候,都是这么干的,省得在菜单里绕来绕去。
要是你手机设置里没找到搜索框,那就手动找“无障碍”或者“辅助功能”,这两个名字其实是一个意思,不同品牌叫法不一样。苹果手机的话,是在“设置 > 辅助功能 > 旁白”,那个“旁白”就是苹果的屏幕阅读器名字,点进去打开开关就行;华为或者荣耀手机,一般是“设置 > 辅助功能 > 无障碍 > 屏幕阅读器”,多了一层“无障碍”菜单,但顺着点进去也很清楚;小米和红米的路径稍微有点不同,是“设置 > 更多设置 > 无障碍 > 屏幕阅读器”,先点“更多设置”再找“无障碍”,跟华为比就是多了一步“更多设置”。其实不管哪个牌子,只要记住“无障碍”或“辅助功能”这两个关键词,顺着菜单往下找,肯定能看到“屏幕阅读器”的选项,实在找不到就问问身边用同款手机的人,他们说不定知道具体在哪儿。
手机屏幕阅读器在哪里开启?不同品牌手机设置路径一样吗?
不同品牌手机的开启路径略有差异,但都在系统“设置”里,新手可以按这几步找:先打开手机“设置”,搜索“无障碍”(或“辅助功能”),找到“屏幕阅读器”选项(部分品牌叫“TalkBack”“VoiceOver”或“旁白”),点击开启即可。比如苹果手机是“设置 > 辅助功能 > 旁白”,华为/荣耀是“设置 > 辅助功能 > 无障碍 > 屏幕阅读器”,小米/红米类似,在“设置 > 更多设置 > 无障碍 > 屏幕阅读器”。找不到的话,直接在设置顶部搜索“屏幕阅读器”,系统会自动定位到对应选项。
屏幕阅读器的语速太快/太慢,怎么调整语音和语速?
调整语速和语音很简单,在屏幕阅读器的设置界面就能改。开启屏幕阅读器后,回到“无障碍”或“屏幕阅读器”设置页,找到“语音设置”(或“语速”“声音”选项),拖动语速滑块调整快慢( 新手先设为中等语速,熟悉后再微调)。语音类型也能换,比如苹果的“旁白”支持切换不同方言或语音包,安卓手机通常在“语音引擎”里选择喜欢的语音(部分需要提前下载语音包)。调整后记得点击“应用”或“确定”,设置会立即生效。
使用屏幕阅读器时,常用的手势操作有哪些?新手容易记混怎么办?
屏幕阅读器的手势和普通操作不太一样,新手记住这3个基础手势就能应对大部分场景:单指滑动(左右滑动切换元素,屏幕阅读器会依次读出内容)、双击(选中元素后双击确认,比如点击按钮、打开APP)、双指滑动(上下滑动翻页,比如浏览长文章时用)。刚开始可能会觉得“双击”和普通点击混淆, 先在桌面或简单APP(如备忘录)里练习:单指滑到“备忘录”图标,听到提示后双击打开,再单指滑动读内容,熟悉后再用复杂APP。多练1-2天就能形成肌肉记忆啦。
为什么有些APP内容屏幕阅读器不读?是手机坏了还是设置问题?
屏幕阅读器不读内容,大多不是手机或设置问题,而是APP本身的“无障碍兼容性”没做好。比如有些APP用了非语义化的代码(像前端开发里提到的用div冒充按钮),屏幕阅读器识别不出内容;或者动态加载的内容(如弹窗、加载提示)没告诉屏幕阅读器“有新内容”。遇到这种情况,可以先试试关闭APP重开,或在手机“无障碍”设置里重启屏幕阅读器。如果还是不行,可能是APP本身的问题, 在APP的“反馈”功能里提意见,督促开发者优化无障碍体验。
开启屏幕阅读器后,想临时关闭或暂停,有快捷键吗?
大部分手机支持临时暂停或快速关闭屏幕阅读器,不用每次都进设置。苹果手机按“电源键+音量键”(部分机型是长按电源键)调出“控制中心”,点击“旁白”图标暂停;安卓手机可以在“屏幕阅读器设置”里开启“暂停快捷键”,比如华为设为“长按音量键+电源键”,小米设为“三指同时按屏幕”,具体在“无障碍 > 屏幕阅读器 > 快捷键”里自定义。如果没设快捷键,也可以直接在设置里搜索“屏幕阅读器”,点击“关闭”按钮临时停用,需要时再开启就好。