复合标签:使用 ARIA 为包含嵌入字段的标签设置值

问题

您有一个表单,向用户提问,但答案本身就包含在问题中。我们都熟悉的浏览器设置中的一个典型例子是“删除历史记录 x 天”的设置。“删除历史记录”在文本框的左侧,“x”是数字,例如 21,然后是单词“天”,这形成了一个易于理解的句子。

如果您使用屏幕阅读器,您是否注意到,当您在 Firefox 中访问此设置时,它会告诉您“删除历史记录 21 天”?然后会播报您在一个文本框中,并且其中包含数字 21。这不是很酷吗?您无需四处导航即可找出单位。“天”很容易变成“月”或“年”,在许多普通对话框中,除了使用屏幕阅读命令四处导航外,没有其他方法可以找出这一点。

解决方案在于一个名为 aria-labelledby 的 ARIA 属性。它的参数是一个字符串,由您想要连接成单个可访问名称的 HTML 元素的 ID 组成。

aria-labelledbyaria-describedby 都指定在要进行标签化的表单元素上,例如 <input>。在这两种情况下,可能存在的 for/control 标签绑定都会被 aria-labelledby 覆盖。如果您在 HTML 页面上提供了 aria-labelledby,您还应该提供一个 for 构造来支持尚不支持 ARIA 的旧浏览器。使用 Firefox 3,您的视障用户将自动获得新属性带来的更好的可访问性,而旧浏览器用户也不会因此受到影响。

示例

html
<input
  aria-labelledby="labelShutdown shutdownTime shutdownUnit"
  type="checkbox" />

<span id="labelShutdown">Shut down computer after</span>

<input
  aria-labelledby="labelShutdown shutdownTime shutdownUnit"
  id="shutdownTime"
  type="text"
  value="10" />

<span id="shutdownUnit"> minutes</span>

JAWS 8 用户注意事项

JAWS 8.0 有自己的标签查找逻辑,导致它总是覆盖 HTML 文档中文本框的可访问名称。在使用 JAWS 8 时,我还没有找到一种方法让它接受上述示例中的标签。但是 NVDA 和 Window-Eyes 可以很好地处理,Linux 上的 Orca 也没有问题。

注意: 待定:添加更多兼容性信息

不使用 ARIA 可以实现这一点吗?

社区成员 Ben Millard 在一篇博文中指出,可以使用 HTML 4 将控件嵌入标签中,如上面示例所示,方法是将 input 嵌入到 label 中。感谢 Ben 提供的信息!这非常有用,并且表明一些已经存在多年的技术有时连专家也会忽略。这种方法在 Firefox 中有效;但是,它目前在包括 IE 在内的许多其他浏览器中无效。对于带有嵌入式表单控件的标签,使用 aria-labelledby 仍然是最佳方法。