当页面上的表单区域堆满输入框,用屏幕阅读器一点一点挪动光标实在让人抓狂。一个不小心就跳过了必填项,提交时才发现报错。本文介绍屏幕阅读器的基础概念,并演示在Mac系统上用VoiceOver快速定位表单字段的两种方法,同时拆解表单代码的标注技巧。
屏幕阅读器是个啥
屏幕阅读器属于辅助技术的一种,能把屏幕上的文字转换成语音朗读或盲文输出。常见的产品包括Mac自带的VoiceOver、Windows上的NVDA和JAWS,以及安卓设备的TalkBack。这类工具对表单结构尤其敏感,因为每个输入框都需要有清晰的标签才能被正确识别。举个例子,普通的
容器在屏幕阅读器眼里就像空气,而带语义的按钮才能发出“按钮”提示音。打个比方,屏幕阅读器就像一个读屏小助手,网页上的内容如果没按规矩标注,这小助手就会念出“未标记的输入框”,让人一头雾水。
启动Mac上的VO
Mac电脑内置的VoiceOver(简称VO)是针对Safari浏览器优化的读屏方案。不同机型的开启方式稍有区别,下面分两种情况说明。
带触控栏的MBP
如果手头的MacBook Pro带有Touch Bar,启动VO的按键组合是cmd + fn + F5。同时按下这三个键,系统会弹出确认对话框并伴有语音提示。听到“VoiceOver已开启”就表示成功。关闭时用同样的组合键。
传统键盘或无触控栏
对于没有触控栏的MacBook Pro或者外接普通键盘,启动方式分两类。第一类是按住cmd键,然后快速按三次Touch ID电源键(右上角那个圆钮)。第二类是直接进入系统设置里的“辅助功能”面板,找到“旁白”手动切换开关。但最快的方法还是快捷键cmd + 触控ID三次,前提是指纹识别模块支持这个操作。一旦开启,屏幕上会出现一个黑色浮窗,同时朗读出“VoiceOver已打开”。
用转子快速跳转表单
VO内置了一个叫“转子”的功能,相当于一个快捷导航盘。打开转子后,用左右方向键就能在页面上的不同元素类型之间切换,比如表单控件、标题、链接等。这种操作方式省去了一行一行朗读的麻烦,直接飞到想填的输入框。
转子开启步骤
- 确定VO处于开启状态,屏幕上有黑色浮窗。
- 按下修饰键组合。默认的修饰键是
Control + Option,但很多老手会改成Caps Lock(大小写锁定键),因为按起来更顺手。这里假设修饰键已设置为Caps Lock。 - 同时按住
Caps Lock和字母U键,转子界面会弹出一个圆形转盘。 - 按左箭头或右箭头选择“表单控件”类别。
- 按上箭头或下箭头在页面上的各个输入框、按钮、下拉菜单之间移动。
- 按回车键(或空格键)聚焦到选中的字段,此时可以直接输入内容。
操作转子时注意一个坑:如果网页上的表单控件没有正确标注label或者aria-label,转子里的“表单控件”类别可能根本不出现。确保每个<input>都关联了可见标签,转子才能识别。
按标题层级走位
另一种在表单中快速定位的方法是直接跳到某个标题。很多表单会用<h2>或<h3>来划分区块,比如“收货信息”、“支付方式”。VO允许直接按标题级别跳转。
- 前进到下一个标题:按下
修饰键 + Cmd + H。 - 后退到上一个标题:按下
修饰键 + Shift + Cmd + H。
例如在长表单里,先按Caps Lock + Cmd + H跳到“收货信息”这个标题,然后按Tab键就能在该区块内的输入框之间移动。混合使用转子和标题跳转,效率直接起飞。一个小提醒:标题层级必须连续且合理,不能跳级(比如<h1>后直接<h3>),否则VO的标题导航会漏掉内容。
表单标注的硬核写法
让屏幕阅读器正确朗读表单字段,关键在于HTML标签的使用。两种主流的标签写法各有适用场景。
隐式标签写法
直接把输入框放在<label>标签内部,不需要for和id属性。这种写法适合简单的表单。
<label>
电子邮箱
<input type="email" name="email" placeholder="your@example.com">
</label>屏幕阅读器会朗读“电子邮箱 编辑文本”,同时自动关联输入框。缺点是如果表单布局需要把标签和输入框分开摆放(比如左列标签右列输入框),CSS定位会比较麻烦。
显式标签写法
通过<label>的for属性指向输入框的id,标签和输入框可以在DOM树的不同位置。
<label for="emailInput">电子邮箱</label>
<input type="email" id="emailInput" name="email" required>这种写法更灵活,且当输入框获得焦点时,点击标签也能自动聚焦。注意for属性的值必须和id完全一致,包括大小写。一个常见的翻车现场是id写成了email而for写成了Email,屏幕阅读器就找不到关联了。
必填字段的标记
如果某个输入框是必填的,在HTML中使用required属性,并且最好在视觉上也给出提示(比如在标签旁加红色星号)。光靠required属性,屏幕阅读器会在朗读时自动加上“必填”两个字,但视力正常的填写者看不到任何标记,所以两样都要安排。
<label for="phoneNum">手机号 <span style="color:red;">*</span></label>
<input type="tel" id="phoneNum" name="phone" required>注意required属性不要滥用。只有真正必须填写的字段才加上,否则页面上一堆“必填”提示会让人烦躁。
方案一:转子走位法
适用场景:表单字段非常多(超过10个),需要快速跳过不相关的区块。
步骤拆解:
- 打开Safari浏览器,载入目标表单页面。
- 按下
Caps Lock + U唤出转子。 - 按右箭头直到听到“表单控件”。
- 按下箭头依次经过每个输入框。每按一次,VO会朗读字段名称和类型,例如“姓名 编辑文本 必填”。
- 听到目标字段后,按回车键聚焦,然后直接打字。
- 填写完当前字段后,按
Tab键自动跳到下一个表单控件(不需要重新打开转子)。Tab的跳转顺序由HTML中的tabindex属性或DOM顺序决定。 - 如果不小心跳过了某个字段,按
Shift + Tab回到上一个字段。
遇到转子不显示“表单控件”怎么办? 检查页面上是否真的存在<input>、<select>、<textarea>或<button>。如果全是<div>模拟的控件,转子无法识别。另外,某些网页在表单外层套了<iframe>,需要先按Caps Lock + Cmd + 上箭头把焦点移出iframe才能看到全局转子。
方案二:快捷键扫荡法
适用场景:表单结构清晰,区块标题完整,需要快速在各个区块间跳跃。
步骤拆解:
- 确保VO开启,焦点在页面主体内容上(按
Caps Lock + Cmd + 下箭头可跳入网页)。 - 按下
Caps Lock + Cmd + H,VO会朗读当前标题,例如“配送信息 标题 级别2”。 - 继续按
Caps Lock + Cmd + H直到听到目标区块的标题。 - 按一次
Tab键,焦点会移动到该标题后的第一个输入框。 - 填写内容,然后按
Tab在当前区块内的字段间移动。 - 完成一个区块后,再次按
Caps Lock + Cmd + H跳到下一个区块的标题。
这种方式的优势是减少转子调出的次数。但前提是网页开发者必须正确使用了<h1>到<h6>标签。如果表单区块的标题是用<div>加粗样式实现的,快捷键完全无效。
修饰键冲突的解决: 当Caps Lock同时被系统其他功能占用时(比如某些外接键盘的灯光切换),VO可能失灵。可以在VO实用工具里把修饰键改为Control + Option(俗称“大键”)。改完后,上述所有快捷键中的Caps Lock要换成Control + Option同时按住。例如转子快捷键变为Control + Option + U,需要三个手指同时压下去。
不同系统上的读屏选择
下表列出各操作系统的常用读屏软件及其启动方式。
| 操作系统 | 推荐读屏 | 启动方式 |
|---|---|---|
| macOS | VoiceOver | cmd+F5或触控ID三次 |
| Windows | NVDA | 下载后按Ctrl+Alt+N |
| Windows | 讲述人 | Win+Ctrl+Enter |
| 安卓 | TalkBack | 同时按音量加减键3秒 |
| Linux | Orca | Alt+Super+S |
挑选读屏时注意版本兼容。NVDA 2024.1以上版本对Chrome支持较好,而旧版可能在Edge上卡顿。TalkBack在安卓12及以上系统需要先开启“无障碍快捷方式”才能用音量键唤醒。
模拟真实场景的表单代码
下面是一段完整的表单示例,包含了隐式标签、显式标签、必填标记和按钮。
<form action="/submit" method="post">
<h2>注册信息</h2>
<label>
昵称
<input type="text" name="nickname" placeholder="怎么称呼">
</label>
<label for="userEmail">电子邮箱(必填)</label>
<input type="email" id="userEmail" name="email" required>
<label for="ageSelect">年龄段</label>
<select id="ageSelect" name="ageGroup">
<option value="18-25">18到25岁</option>
<option value="26-35">26到35岁</option>
</select>
<button type="submit">提交注册</button>
</form>在VO中导航这段表单:按Tab会依次聚焦昵称输入框、邮箱输入框、年龄段下拉框、提交按钮。邮箱字段由于带有required属性,VO会朗读“必填”。下拉框朗读时会先读出当前选中的选项,再读出控件名称“年龄段”。
避免表单跳焦的冷知识
有些表单在填写过程中会动态显示或隐藏额外的输入框(比如选择“其他”选项后弹出一个文本框)。这种动态内容如果不通知屏幕阅读器,填写者根本不知道新字段出现了。需要在动态显示新字段时,将焦点主动移动到新字段上,或者使用aria-live区域播报变化。举个例子,点击“添加更多地址”按钮后,用JavaScript生成新的地址输入框,同时调用focus()方法把光标放进去。否则VO还停留在原来的位置,填表的人以为出了bug。
