【发布时间】:2019-12-15 08:06:01
【问题描述】:
在可访问性方面,有人可以向我描述屏幕阅读器和键盘用户的 <button> 和 <a> 之间的区别吗?据我所知,键盘用户可以使用ENTER 和SPACE 来激活按钮,而只有ENTER 用于锚标记。在单页应用程序中,我觉得这些元素的角色有些混淆,我不确定两者之间的界线在哪里。
看起来像链接的按钮
在我的应用程序中,我有一个通用的链接样式,它的类名就是.link。
在第一个示例中,我有一个带有 onclick 处理程序的按钮,该处理程序在同一页面上执行操作,因此我为它使用了一个按钮元素。然而,它在风格上看起来像一个链接。
<button class="link" onclick={(e) => console.log('Do the thing')}>This is a link</button>
如果角色互换并且链接的行为类似于传统的锚点,其中路由会因点击而改变,我会这样做:
<a class="link" href="/route/change">This is a link</a>
尽管由于应用了类,这两个 看起来 相同,但锚标记示例是否应该应用 role="button" 使其行为像按钮,即使它的样式像链接?对于在整个应用程序中具有可访问性需求的用户来说,保持这些样式元素之间的一致性更好,还是更好地根据元素的应用程序交换哪个角色应用到它,而不管它的样式如何。
两个相邻的“按钮”
跟进第一个问题。如果<a> 标记的定义是将您移动到不同的页面/锚点,那么执行不同任务的两个并排按钮是否都应该被视为按钮。
以以下示例为例,确认按钮在同一页面上执行操作,而取消按钮将您引导回上一页。
代码如下所示:
<button onclick={() => console.log('do a thing'}>Confirm</button>
<a href="/home">Cancel</a>
MDN 中的role="button" 的定义如下:
按钮角色应该用于触发 用户激活时的响应。添加 role="button" 将使 元素显示为屏幕阅读器的按钮控件。这个角色可以 与 aria-pressed 属性结合使用以创建 切换按钮。
是否应该取消按钮应用按钮角色,即使它在技术上不符合角色定义的方式?
结束
是否有关于何时应该使用和不应该使用这些角色的更简洁的指南?如果将role="button" 与<button> 元素互换使用,那么将role="button" 应用于使用相同样式的任何/所有链接是否有任何危害?或者锚标签和角色不应该混合,无论它们在风格上看起来是否像另一种元素类型?
感谢您的阅读。我正在尝试认真对待可访问性,但似乎找不到围绕此场景用例的任何清晰简洁的规范。
【问题讨论】:
-
一个按钮已经具有按钮角色,是一个按钮。这个想法是,您可以(如果确实需要)使其他元素显示为使用 AT 的按钮。这在您发布的 MDN 引用中有所暗示。我不知道你为什么要把它应用到锚上。
-
对,但我讨论的其他情况如何,链接表现为按钮,反之亦然。是否有一个明确的定义,什么时候应该使用一个而不是另一个,还是由你自己决定?您无法从
<button>元素中删除角色,因为它已经被暗示了,但它看起来像一个链接。 -
如果锚点的行为类似于按钮,为什么还要使用锚点?使用一个按钮并相应地设置它的样式。例如,Bootstrap 为这种确切情况提供了 CSS。当你的锚表现得像一个锚时,为什么你希望你的用户认为你的锚是一个按钮?我不明白那种情况。
-
元素的样式是否应该决定元素的作用?如果我有一些看起来像按钮的东西,但将你锚定到另一个页面,它是否应该有
role="button",即使它在技术上不是引擎盖下的按钮?如果一个看起来像链接的功能按钮在整个应用程序中具有相同的一致角色,即如果有一些具有相同样式的按钮元素,那么所有看起来相同的“链接”是否应该具有按钮角色。我没有使用 Bootstrap,但您提供的示例并未规定屏幕阅读器如何查看元素,或者预期的内容是什么。 -
你的意思是说锚永远不应该有按钮的作用吗?
标签: html accessibility