屏幕阅读器导航表单总是卡壳,手把手实操来解围?

4,158字
18–26 分钟
in

当页面上的表单区域堆满输入框,用屏幕阅读器一点一点挪动光标实在让人抓狂。一个不小心就跳过了必填项,提交时才发现报错。本文介绍屏幕阅读器的基础概念,并演示在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内置了一个叫“转子”的功能,相当于一个快捷导航盘。打开转子后,用左右方向键就能在页面上的不同元素类型之间切换,比如表单控件、标题、链接等。这种操作方式省去了一行一行朗读的麻烦,直接飞到想填的输入框。

转子开启步骤

  1. 确定VO处于开启状态,屏幕上有黑色浮窗。
  2. 按下修饰键组合。默认的修饰键是Control + Option,但很多老手会改成Caps Lock(大小写锁定键),因为按起来更顺手。这里假设修饰键已设置为Caps Lock
  3. 同时按住Caps Lock和字母U键,转子界面会弹出一个圆形转盘。
  4. 按左箭头或右箭头选择“表单控件”类别。
  5. 按上箭头或下箭头在页面上的各个输入框、按钮、下拉菜单之间移动。
  6. 按回车键(或空格键)聚焦到选中的字段,此时可以直接输入内容。

操作转子时注意一个坑:如果网页上的表单控件没有正确标注label或者aria-label,转子里的“表单控件”类别可能根本不出现。确保每个<input>都关联了可见标签,转子才能识别。

按标题层级走位

另一种在表单中快速定位的方法是直接跳到某个标题。很多表单会用<h2><h3>来划分区块,比如“收货信息”、“支付方式”。VO允许直接按标题级别跳转。

  • 前进到下一个标题:按下修饰键 + Cmd + H
  • 后退到上一个标题:按下修饰键 + Shift + Cmd + H

例如在长表单里,先按Caps Lock + Cmd + H跳到“收货信息”这个标题,然后按Tab键就能在该区块内的输入框之间移动。混合使用转子和标题跳转,效率直接起飞。一个小提醒:标题层级必须连续且合理,不能跳级(比如<h1>后直接<h3>),否则VO的标题导航会漏掉内容。

表单标注的硬核写法

让屏幕阅读器正确朗读表单字段,关键在于HTML标签的使用。两种主流的标签写法各有适用场景。

隐式标签写法

直接把输入框放在<label>标签内部,不需要forid属性。这种写法适合简单的表单。

<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写成了emailfor写成了Email,屏幕阅读器就找不到关联了。

必填字段的标记

如果某个输入框是必填的,在HTML中使用required属性,并且最好在视觉上也给出提示(比如在标签旁加红色星号)。光靠required属性,屏幕阅读器会在朗读时自动加上“必填”两个字,但视力正常的填写者看不到任何标记,所以两样都要安排。

<label for="phoneNum">手机号 <span style="color:red;">*</span></label>
<input type="tel" id="phoneNum" name="phone" required>

注意required属性不要滥用。只有真正必须填写的字段才加上,否则页面上一堆“必填”提示会让人烦躁。

方案一:转子走位法

适用场景:表单字段非常多(超过10个),需要快速跳过不相关的区块。

步骤拆解:

  1. 打开Safari浏览器,载入目标表单页面。
  2. 按下Caps Lock + U唤出转子。
  3. 按右箭头直到听到“表单控件”。
  4. 按下箭头依次经过每个输入框。每按一次,VO会朗读字段名称和类型,例如“姓名 编辑文本 必填”。
  5. 听到目标字段后,按回车键聚焦,然后直接打字。
  6. 填写完当前字段后,按Tab键自动跳到下一个表单控件(不需要重新打开转子)。Tab的跳转顺序由HTML中的tabindex属性或DOM顺序决定。
  7. 如果不小心跳过了某个字段,按Shift + Tab回到上一个字段。

遇到转子不显示“表单控件”怎么办? 检查页面上是否真的存在<input><select><textarea><button>。如果全是<div>模拟的控件,转子无法识别。另外,某些网页在表单外层套了<iframe>,需要先按Caps Lock + Cmd + 上箭头把焦点移出iframe才能看到全局转子。

方案二:快捷键扫荡法

适用场景:表单结构清晰,区块标题完整,需要快速在各个区块间跳跃。

步骤拆解:

  1. 确保VO开启,焦点在页面主体内容上(按Caps Lock + Cmd + 下箭头可跳入网页)。
  2. 按下Caps Lock + Cmd + H,VO会朗读当前标题,例如“配送信息 标题 级别2”。
  3. 继续按Caps Lock + Cmd + H直到听到目标区块的标题。
  4. 按一次Tab键,焦点会移动到该标题后的第一个输入框。
  5. 填写内容,然后按Tab在当前区块内的字段间移动。
  6. 完成一个区块后,再次按Caps Lock + Cmd + H跳到下一个区块的标题。

这种方式的优势是减少转子调出的次数。但前提是网页开发者必须正确使用了<h1><h6>标签。如果表单区块的标题是用<div>加粗样式实现的,快捷键完全无效。

修饰键冲突的解决:Caps Lock同时被系统其他功能占用时(比如某些外接键盘的灯光切换),VO可能失灵。可以在VO实用工具里把修饰键改为Control + Option(俗称“大键”)。改完后,上述所有快捷键中的Caps Lock要换成Control + Option同时按住。例如转子快捷键变为Control + Option + U,需要三个手指同时压下去。

不同系统上的读屏选择

下表列出各操作系统的常用读屏软件及其启动方式。

操作系统推荐读屏启动方式
macOSVoiceOvercmd+F5或触控ID三次
WindowsNVDA下载后按Ctrl+Alt+N
Windows讲述人Win+Ctrl+Enter
安卓TalkBack同时按音量加减键3秒
LinuxOrcaAlt+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。