我刚刚注意到,虽然aria-label
, aria-labelledby
和aria-describedby
属性据说对每个元素都有效(参见https://www.w3.org/WAI/PF/aria-1.1/states_and_properties#aria-describedby),但它们似乎只适用于a
等少数元素,而不适用于NVDA和JAWS中的div
或p
。
我已经创建了一个小代码依赖来演示这个问题(使用浏览和焦点模式浏览它):
https://codepen.io/jmuheim/pen/avWbPe例如,在NVDA中,在a
元素上,aria-label
和aria-labelledby
似乎可以在浏览和焦点模式下工作。但是aria-describedby
只在焦点模式下发布,而不是在浏览模式下。
对于input
元素,所有属性似乎都不能在浏览模式下工作,但都可以在焦点模式下工作。
对于像p
或div
这样的"裸"文本元素,这些属性似乎都不起作用。
在JAWS中,这是非常相似的行为,但至少对于p
元素,当存在aria-describedby
时,它宣布可以通过按"JAWS + alt + r"来读取描述。
我真的没有看到一个明确的模式,所以我想知道在屏幕阅读器中如何使用这些属性的一般规则是什么?或者更好:为什么不像规范所建议的那样,简单地适用于每个元素呢?
ARIA没有定义辅助技术如何暴露UI。它定义了浏览器如何通过可访问性api公开角色、状态和属性。这与一般的HTML是一样的,HTML规范没有定义/要求UI,这是留给浏览器来决定的。在ARIA -label的情况下(例如),ARIA要求将ARIA -label映射到可访问性api中的可访问名称属性,而不是要求屏幕阅读器在任何给定元素上宣布它或不宣布它(即作为听觉UI的一部分公开)。一般观察到的规则是,屏幕阅读器将在交互元素上宣布可访问的名称和可访问的描述。它们将在大多数分组元素和分段元素上宣布可访问的名称。他们将在大多数文本级元素上既不宣布也不宣布。
注意:上面的也适用于任何默认语义被ARIA角色覆盖的元素。例如,ARIA小部件角色将具有acc名称和描述,就像本地HTML交互元素一样。