1. 为什么aria-describedby
在您的示例中未使用:
aria-describedby
用于附加不重要的信息。通常title
属性会aria-describedby
自动匹配。(注意:如果缺少标签或内容,则title
匹配 a11y 名称(即:与aria-label
自动宣布它(屏幕阅读器用户可能有快捷方式和设置来强制阅读这些内容。)但也有例外:例如,大多数屏幕阅读器会自动阅读对话框的描述。
2. 为什么你的使用aria-describedby
错误:
你描述了用户应该如何激活这个控件,但这显然不是必需的。实际上这是 aria 角色和属性的主要功能。如果你用语义标记来描述一个元素,它会告诉用户如何与之交互,你不需要用词重复它。例如: a <button>
,role="button"
表示如果您按下回车键或空格键或(鼠标)单击,它将执行此控件的默认操作(如果是原生button
元素,则可以通过click
事件简单地完成)。
3.你可以使用aria-haspopup="true"
,但如果你这样做,你必须添加额外的JS:
上面的观点也解释了为什么简单地添加<button aria-haspopup="true">
如另一个答案所描述的那样,在屏幕阅读器中对你来说听起来很棒,但这并不总是最好的做。
实际上<button aria-haspopup="true" aria-label="Settings">
读取“设置,菜单按钮”,这可能是您想要的语义。但从描述来看,这并不意味着这个按钮首先会打开一个子菜单/弹出菜单。这意味着,它的行为就像一个菜单按钮。如果您按下“向下光标”(它也允许空格/输入),菜单按钮也会执行它的默认操作。
这意味着带有子菜单的链接教程是胡说八道。如果您按下光标或空格,它不会打开子菜单。
这里还有一个有趣的部分。如果您创建一个<button aria-haspopup="true" aria-label="Settings">
(包括所有菜单按钮交互(即:空格、回车、向下光标...)然后打开一个role="dialog"
并在此对话框内移动焦点。这将不是用户所期望的,但它完全很好/可访问,因为您的控件的行为与描述的一样,并且一旦用户切换到对话框,他就会收到通知,他不在菜单中,而是在对话框中,并且可以相应地与之交互。