blob: e0e35c449a653d026bd4441dbe277025aecfbad9 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
---
title: Using the button role
slug: Web/Accessibility/ARIA/ARIA_Techniques/Using_the_button_role
tags:
- ARIA
- 可访问性
- 无障碍
translation_of: Web/Accessibility/ARIA/Roles/button_role
---
<p><strong><a href="https://www.w3.org/TR/wai-aria/roles#button">button</a></strong> 角色应该用于可单击的元素, 当用户激活时触发响应。 在其本身,<code>role="button"</code> 可以使任何元素 (e.g. {{HTMLElement("p")}}, {{HTMLElement("span")}} or {{HTMLElement("div")}}) 作为一个屏幕阅读器的按钮控件出现。此外,该角色还可以与 <code>aria-pressed</code> 属性组合使用,以创建切换按钮。</p>
<div class="note"><strong>注意: </strong>在可能的情况下,建议使用原生HTML按钮 (<code><button></code>, <code><input type="button" /></code>, <code><input type="submit" />, <input type="reset" /> </code>and <code><input type="image" /></code>) 而不是按钮角色,因为原生HTML按钮得到了较老用户代理和辅助技术的广泛支持。原生HTML按钮也支持键盘和焦点需求,不需要额外的定制。</div>
<h2 id="键盘_and_聚焦">键盘 and 聚焦</h2>
<p>按钮是交互式控件,因此其本身是可聚焦的。如果<code>button</code> 角色被添加到一个自身不可聚焦的元素(such as <code><span></code>, <code><div></code> or <code><p></code>) 那么必须使用<code>tabindex</code> 属性来使按钮可聚焦。</p>
<p>按钮可以由鼠标用户和键盘用户操作。 对于原生HTML <code><button></code> 元素 ,按钮的 <code>onclick</code> 事件会在鼠标单击和按下键盘的 <kbd>Space</kbd> or <kbd>Enter</kbd> 时被触发, 同时这个按钮处于聚焦状态。 但是如果使用其他标签来创建“自定义按钮”,那么<code>onclick</code>事件只会在点击鼠标光标时触发,即使使用<code>role="button"</code> 。因此,开发人员必须向元素添加一个单独的关键事件处理程序,以便在按下 <kbd>Space</kbd> or <kbd>Enter</kbd> 时触发按钮。</p>
<p class="warning"><strong>Warning:</strong> 把给一个链接标记为按钮角色的链接时要谨慎。按钮将使用 <kbd>Space</kbd> or <kbd>Enter</kbd> 键触发,而链接被期望使用 <kbd>Enter</kbd> 键触发。 换句话说,当链接被用来作为按钮的时候,仅仅添加<code>role="button"</code>是不够的。还需要添加一个 key 事件处理程序来侦听 <kbd>Space</kbd> 键,以便与原生按钮保持一致。</p>
<h2 id="可切换的按钮">可切换的按钮</h2>
<p>使用<code>role="button"</code>的一个优点是它允许创建切换按钮。一个切换按钮可以有两个状态:pressed,not pressed。除了 <code>button</code>角色之外,按钮是否为切换按钮,也可以用<code>aria-pressed</code>的属性来表示。</p>
<ul>
<li>如果没有 <code>aria-pressed</code>表明这不是一个切换按钮。</li>
<li>如果 <code>aria-pressed="false"</code> 表示这个按钮当前是 not pressed 的。</li>
<li>如果 <code><code>aria-pressed="true"</code></code> 表示这个按钮当前是 pressed 的。</li>
<li>如果 <code>aria-pressed="mixed"</code> 则认为按钮部分是 partially pressed 的。</li>
</ul>
<h2 id="Labeling_buttons">Labeling buttons</h2>
<p>按钮应该总是有一个可访问的名称。对于大多数按钮,这个名称将与按钮中的文本相同。在某些情况下,例如图标按钮,可通过 <code><a href="/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-label_attribute">aria-label</a></code> 或 <code><a href="/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-labelledby_attribute">aria-labelledby</a></code> 属性提供可访问的名称。</p>
<h2 id="对用户代理和辅助技术的可能影响">对用户代理和辅助技术的可能影响</h2>
<p>当使用 <code>button</code> 角色时,用户代理应该将该元素公开为操作系统的易访问性API中的按钮控件。屏幕阅读器应该将元素声明为一个按钮并描述其可访问的名称。语音识别软件应该可以通过说:"点击"+按钮的可访问的name 就能激活这个按钮。</p>
<div class="note"><strong>Note:</strong> 关于辅助技术如何处理这种技术,意见可能有所不同。上面所提供的信息是其中之一,因此并非规范。</div>
<h2 id="Examples">Examples</h2>
<h3 id="ARIA_Basic_Button">ARIA Basic Button</h3>
<p>在下面的代码片段中,一个span元素已经被赋予了按钮角色。由于使用的是 <code><span></code> 元素,因此需要提供 <code>tabindex</code> 属性使按钮的可聚焦并成为tab顺序流中的一部分。注意,这段代码提供了CSS样式,以使 <code><span></code>元素看起来像一个按钮, <code>handleBtnClick</code> 和<code>handleBtnKeyPress</code> 是事件处理程序,当鼠标单击、 <kbd>Space</kbd> or <kbd>Enter</kbd> 被按下时,执行该按钮的操作。</p>
<pre class="brush: html"><span role="button" tabindex="0" onclick="handleBtnClick()" onKeyPress="handleBtnKeyPress()">Save</span>
</pre>
<h3 id="ARIA_Toggle_Button">ARIA Toggle Button</h3>
<p>在这个片段中,使用 <code>button</code> 角色和 <code>aria-pressed</code> 属性,来将 <code><span></code> 元素转换为一个切换按钮,当按钮被激活时, <code>aria-pressed</code> 的值在true和false之间切换。</p>
<h4 id="HTML">HTML</h4>
<pre class="brush: html"><button type="button" aria-pressed="false" onclick="handleBtnClick(event)">
Native button toggle
</button>
<span role="button" tabindex="0"
aria-pressed="false" onclick="handleBtnClick(event)"
onKeyPress="handleBtnKeyPress(event)">
Span button toggle
</span></pre>
<h4 id="CSS">CSS</h4>
<pre class="brush: css">button,
[role="button"] {
padding: 3px;
border: 1px solid #CCC;
}
button[aria-pressed="true"],
[role="button"][aria-pressed="true"] {
border: 2px solid #000;
}
</pre>
<h4 id="JavaScript">JavaScript</h4>
<pre class="brush: js">function handleBtnClick(event) {
toggleButton(event.target);
}
function handleBtnKeyPress(event) {
// Check to see if space or enter were pressed
if (event.key === " " || event.key === "Enter") {
// Prevent the default action to stop scrolling when space is pressed
event.preventDefault();
toggleButton(event.target);
}
}
function toggleButton(element) {
// Check to see if the button is pressed
var pressed = (element.getAttribute("aria-pressed") === "true");
// Change aria-pressed to the opposite state
element.setAttribute("aria-pressed", !pressed);
}</pre>
<h3 id="Result">Result</h3>
<p>{{EmbedLiveSample('ARIA_Toggle_Button')}}</p>
<h2 id="Notes">Notes </h2>
<h3 id="ARIA_attributes_used">ARIA attributes used</h3>
<ul>
<li><code><a href="https://www.w3.org/TR/wai-aria/roles#button">button</a></code></li>
<li><code><a href="https://www.w3.org/TR/wai-aria/states_and_properties#aria-pressed">aria-pressed</a></code></li>
</ul>
<h3 id="Additional_resources">Additional resources</h3>
<ul>
<li><a href="https://www.w3.org/TR/html5/dom.html#aria-usage-note">Strong native semantics in HTML5</a></li>
<li><a href="https://www.w3.org/TR/aria-in-html/">Notes on Using ARIA in HTML</a></li>
</ul>
|