使用 <input type="button">、<input type="image">、<input type="reset">、<input type="submit"> 或 <button> 代替“按钮”角色

问题描述 投票:0回答:1
reactjs accessibility wai-aria sonarcloud
1个回答
0
投票

基本上你有两个问题。

按钮的内容必须简短

按钮并不是为了在其中包含大量内容而设计的,并且该按钮是标准的

<button>
或使用 ARIA role=button 伪造的事实不会改变任何内容(对于屏幕阅读器和其他辅助工具,两者看起来相同对于最终的用户来说,这正是 ARIA 的目的)。

请记住,屏幕阅读器在聚焦时会一次性读取按钮的全部内容,在按钮列表中创建一个巨大的标签以供单击,而且您可能需要大声说出全部内容才能激活语音控制。

当阅读信息量很大的长篇内容时,不清楚点击会执行什么操作。它会打开一个包含更多详细信息的页面吗?产品是直接加入购物车吗?是否会在没有任何其他确认的情况下立即发射火箭导弹? 即使实际执行的操作被清楚地写在中间的某个地方,它也会被其他所有操作淹没而难以察觉。

因此,按钮的内容必须简短,直接告诉你点击后会发生什么,否则实际上就无法访问,或者使用起来非常痛苦。

嵌套交互元素

你不能简单地说一个按钮可以有任意内容。您应该防止这种情况发生,或者完全改变您的设计。 事实上,一旦按钮内有另一个交互元素,您就会遇到问题。这就是众所周知的嵌套交互区域问题,必须不惜一切代价避免。

  • 当按下回车键或点击内部元素时,外部元素是否也会被触发?
  • 当聚焦外部元素时,屏幕阅读器是否也应该读取内部元素的内容?通常是这样,并且会造成很多混乱,因为某些内容会被读取两次,或者读取的内容与执行的操作不对应
  • 视觉焦点指示也可能不清楚
  • 您可以轻松地在内部元素外侧稍稍错误地单击,并在无意的情况下触发外部元素
  • 当鼠标在内部元素内部时,你认为它是在外部元素内部还是外部?
  • 等等

所有这些问题都没有明确的答案。有时您希望答案是“是”,有时则希望答案是“否”。违背默认行为是很困难的,也不建议这样做。不同的浏览器/操作系统/等可能会有所不同。

完全可点击的卡片不是按钮

您现在应该已经明白,完全可点击的卡片不应被视为按钮。您不应使用

<button>
<input type="button"/>
role=button tabindex=0
都错了!!!

即使你以任何方式阻止嵌套的交互元素,单张卡片作为整体读取所给出的信息的长度和信息量仍然是一个问题

一个可能的解决方案是保持整个卡片像现在一样可点击,但不要使其可聚焦。但是,请务必小心,因为这样做后,屏幕阅读器和仅使用键盘的用户等将无法再访问它。 您必须提供另一种方式来打开该卡。您可以非常简单地在某处添加明确的“更多详细信息”链接或按钮,或者使用文章标题作为链接等。

例如参见这个问题链接的文章。 示例中的卡片保持完全可点击,但只有屏幕阅读器和键盘用户与标题链接(即文章的标题)进行交互。 这也可能是适合您的情况的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.