aboutsummaryrefslogtreecommitdiff
path: root/files/fr/web/accessibility/aria/roles/button_role/index.html
blob: 23a3e0bc2e0f626c5ab6db378198e5abd8adc79d (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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
---
title: 'ARIA : le rôle button'
slug: Web/Accessibility/ARIA/Roles/button_role
tags:
  - ARIA
  - ARIA Role
  - ARIA button
  - Accessibility
  - Button Role
  - Reference
translation_of: Web/Accessibility/ARIA/Roles/button_role
original_slug: Accessibilité/ARIA/Techniques_ARIA/Utiliser_le_rôle_button
---
<p class="summary">Le rôle <strong><a href="https://www.w3.org/WAI/PF/aria/roles#button">button</a></strong> devrait être utilisé pour les éléments cliquables qui déclenchent une réponse lorsqu'activés par l'utilisateur. Ajouter <code>role="button"</code> permettra à un élément d'apparaître comme un bouton de contrôle pour un lecteur d'écran. Ce rôle peut être utilisé avec l'attribut <code>aria-pressed</code> afin de créer des boutons interrupteurs.</p>

<pre class="brush: html">&lt;div id="saveChanges" tabindex="0" role="button" aria-pressed="false"&gt;Enregistrer&lt;/div&gt;</pre>

<p>L'exemple précédent crée un bouton simple qui sera le premier à obtenir le focus. Toutefois, on devrait plutôt utiliser les éléments <a href="/fr/docs/Web/HTML/Element/Button"><code>&lt;button&gt;</code></a> ou <a href="/fr/docs/Web/HTML/Element/Input"><code>&lt;input&gt;</code></a> avec <code>type="button"</code> pour représenter des boutons :</p>

<pre class="brush: html">&lt;button id="saveChanges"&gt;Enregistrer&lt;/button&gt;</pre>

<div class="note">
<p><strong>Note</strong> : Si on utilise <code>role="button"</code> plutôt que les éléments sémantiques <code>&lt;button&gt;</code> ou <code>&lt;input type="button"&gt;</code>, il faudra : permettre à l'élément de recevoir le focus, définir des gestionnaires d'évènements pour <a href="/fr/docs/Web/API/Element/click_event"><code>click</code></a> et <a href="/fr/docs/Web/API/Document/keydown_event"><code>keydown</code></a>, y compris la gestion des touches <kbd>Entrée</kbd> et <kbd>Espace</kbd>, afin de traiter la saisie de l'utilisateur. Voir <a href="https://www.w3.org/TR/wai-aria-practices/examples/button/button.html">l'exemple de code officiel de WAI-ARIA</a>.</p>
</div>

<h2 id="description">Description</h2>

<p>Le rôle <code>button</code> identifie un élément comme étant un bouton pour les lecteurs d'écran. Un bouton est un contrôle graphique qui permet d'effectuer des actions comme soumettre un formulaire, ouvrir une boîte de dialogue, annuler une action ou effectuer une commande (par exemple ajouter un nouvel enregistrement ou afficher des informations).</p>

<p>Pour indiquer qu'un bouton déclenchera l'ouverture d'une boîte de dialogue, on pourra utiliser la convention qui consiste à ajouter une ellipse (…) après l'étiquette du bouton, par exemple : "Enregistrer sous…".</p>

<p>En complément <code>role="button"</code> devrait également être utilisé pour les interrupteurs ou les menus qui n'utilisent pas l'élément HTML <code>&lt;button&gt;</code>. Un interrupteur est un bouton à deux états qui peut être éteint ou actif. Les valeurs de l'attribut <code>aria-pressed</code> : <code>true</code> ou <code>false</code> permettront d'identifier un bouton comme étant un interrupteur. Un bouton de menu permet, comme son nom l'indique, de contrôler un menu et possède un attribut <code>aria-haspopup</code> qui vaut <code>menu</code> ou <code>true</code>.</p>

<h3 id="associated_aria_roles_states_and_properties">Rôles, propriétés et états ARIA associés</h3>

<dl>
 <dt><code>aria-pressed</code></dt>
 <dd>Définit le bouton comme étant un interrupteur. La valeur de <code>aria-pressed</code> décrit l'état du bouton. Les valeurs utilisables incluent <code>aria-pressed="false"</code> pour indiquer qu'un bouton n'est pas pressé, <code>aria-pressed="true"</code> pour indiquer qu'un bouton est pressé et <code>aria-pressed="mixed"</code> pour indiquer que le bouton est partiellement pressé. Si cet attribut est omis ou qu'il utilise la valeur par défaut <code>aria-pressed="undefined"</code>, on ne pourra pas appuyer sur l'élément.</dd>
 <dt><code>aria-expanded</code></dt>
 <dd>Si le bouton contrôle un groupe d'autres éléments, l'état <code>aria-expanded</code> indique si le groupe contrôlé est développé ou replié. Si le bouton a <code>aria-expanded="false"</code>, le groupe n'est pas développé ; si le bouton a <code>aria-expanded="true"</code>, cela indique qu'il est actuellement développé ; si le bouton a <code>aria-expanded="undefined"</code> ou que l'attribut est absent, cela indique que le groupe ne peut pas être développé.</dd>
</dl>

<h3 id="basic_buttons">Boutons simples</h3>

<p>Les boutons devraient toujours avoir un nom accessible. Pour la plupart des boutons, le nom sera le même que le texte écrit à l'intérieur du bouton. Dans certains cas, par exemple pour les boutons représentés par une icône, le nom accessible pourra être fourni par l'attribut <code><a href="/fr/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-label_attribute">aria-label</a></code> ou <code><a href="/fr/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-labelledby_attribute">aria-labelledby</a></code>.</p>

<h3 id="toggle_buttons">Interrupteurs</h3>

<p>Un interrupteur possède généralement deux états : activé ou désactivé. Un troisième état hybride est disponible pour les interrupteurs qui contrôlent d'autres éléments tels que d'autres interrupteurs ou cases à cocher qui n'ont pas tous la même valeur. On pourra indiquer qu'un élément est un interrupteur ou non via l'attribut <code>aria-pressed</code> en complément du rôle <code>button</code> (si l'élément n'est pas déjà un élément de bouton natif) :</p>

<ul>
 <li>Si <code>aria-pressed</code> n'est pas utilisé ou qu'il est défini avec l'état <code>"undefined"</code>, le bouton n'est pas un interrupteur.</li>
 <li>Si <code>aria-pressed="false"</code> est utilisé, le bouton est un interrupteur qui n'est pas actif/pressé.</li>
 <li>Si <code>aria-pressed="true"</code> est utilisé, le bouton est un interrupteur qui est actif/pressé.</li>
 <li>Si <code>aria-pressed="mixed"</code> est utilisé, le bouton est considéré comme partiellement actif.</li>
</ul>

<p>On peut, par exemple, avoir un bouton « Couper le son » sur un lecteur audio. Dans ce cas, on peut indiquer que le son est éteint lorsque l'état <code>aria-pressed</code> vaut <code>true</code>. Le libellé utilisé pour un interrupteur ne doit pas changer lorsque l'état change. Dans notre exemple, le libellé reste « Couper le son » et un lecteur d'écran indiquera « L'interrupteur couper le son est actif" ou « L'interrupteur couper le son est inactif » selon la valeur de <code>aria-pressed</code>. Si on souhaite avoir un changement de libellé et passer de « Couper le son » à « Réactiver le son », un interrupteur ne serait pas approprié et <code>aria-pressed</code> devrait alors être évité.</p>

<h3 id="keyboard_interactions">Interactions au clavier</h3>

<table class="standard-table">
 <tbody>
  <tr>
   <th scope="col">Touche</th>
   <th scope="col">Fonction</th>
  </tr>
  <tr>
   <td><kbd>Entrée</kbd></td>
   <td>Activer le bouton</td>
  </tr>
  <tr>
   <td><kbd>Espace</kbd></td>
   <td>Activer le bouton</td>
  </tr>
 </tbody>
</table>

<p>Une fois le bouton activé, la gestion du focus dépendra du type d'action effectuée par le bouton. Ainsi, si cliquer sur le bouton déclenche l'ouverture d'une boîte de dialogue, le focus doit passer à cette boîte de dialogue. Si le bouton ferme une boîte de dialogue, le focus doit revenir sur le bouton qui permet d'ouvrir la boîte à moins que la fonction de la boîte de dialogue mène logiquement à un autre élément. Si le bouton modifie le contexte courant, le focus reste généralement sur le bouton (par exemple pour couper/remettre le son).</p>

<h3 id="required_javascript_features">Fonctionnalités JavaScript nécessaires</h3>

<h4 id="required_event_handlers">Gestionnaires d'évènements nécessaires</h4>

<p>Les boutons peuvent être manipulés avec une souris, le toucher et le clavier. Pour les éléments HTML natifs <code>&lt;button&gt;</code>, l'évènement <code>onclick</code> du bouton est déclenché lors du clic de la souris ou lorsque l'utilisateur utilise la touche <kbd>Espace</kbd> ou <kbd>Entrée</kbd> lorsque le bouton a le focus. Si un autre élément est utilisé pour créer un bouton, l'évènement <code>onclick </code> ne se déclenche qu'au clic de la souris, y compris lorsqu'on utilise <code>role="button"</code>. C'est pour cette raison qu'on doit ajouter des gestionnaires d'évènements distincts à l'élément afin de réagir aux appuis sur les touches <kbd>Espace</kbd> ou <kbd>Entrée</kbd>.</p>

<dl>
 <dt><code>onclick</code></dt>
 <dd>Gère l'évènement déclenché lorsque le bouton est activé avec un clic de souris ou au toucher.</dd>
 <dt><code>onKeyDown</code></dt>
 <dd>Gère l'évènement déclenché lorsque le bouton est activé à l'aide de la touche <kbd>Espace</kbd> ou <kbd>Entrée</kbd> du clavier (attention, il ne s'agit pas de l'évènement déprécié <a href="/fr/docs/Web/API/Document/keypress_event"><code>onKeyPress</code></a>).</dd>
</dl>

<h4 id="changing_attribute_values">Modifier les valeurs des attributs</h4>

<h5 id="aria-pressed">aria-pressed</h5>

<p>La valeur de <code>aria-pressed</code> définit l'état d'un interrupteur. Cet attribut peut avoir l'une des quatre valeurs suivantes :</p>

<ul>
  <li><code>true</code>,</li>
  <li><code>false</code>,</li>
  <li><code>mixed</code>,</li>
  <li><code>undefined</code>.</li>
</ul>

<h2 id="examples">Exemples</h2>

<h3 id="basic_button_example">Exemple de bouton simple</h3>

<p>Dans cet exemple, on a un élément <code>&lt;span&gt;</code> pour lequel on a mis le rôle <code>button</code>. Comme il s'agit d'un élément <code>&lt;span&gt;</code>, l'attribut <code>tabindex</code> est nécessaire pour permettre au bouton de recevoir le focus et de s'inscrire dans l'ordre des tabulations. Le style CSS inclus permet de transformer visuellement l'élément <code>&lt;span&gt;</code> afin qu'il ressemble à un bouton et pour fournir une indication visuelle lorsque celui-ci a le focus.</p>

<p>Les gestionnaires d'évènements <code>handleBtnClick</code> et <code>handleBtnKeyDown</code> exécutent l'action du bouton lorsqu'il est activé avec un clic de souris ou au clavier avec la touche <kbd>Espace</kbd> ou <kbd>Entrée</kbd>. Dans cet exemple, l'action consiste à ajouter un nouveau nom à une liste de noms.</p>

<p>Vous pouvez essayer l'exemple en ajoutant un nom dans le champ texte. Le bouton ajoutera ensuite le nom à la liste.</p>

<h4 id="html">HTML</h4>

<pre class="brush: html">&lt;h1&gt;Exemple de bouton avec ARIA&lt;/h1&gt;
&lt;ul id="nameList"&gt;&lt;/ul&gt;
&lt;label for="newName"&gt;Saisissez votre nom :&lt;/label&gt;
&lt;input type="text" id="newName"&gt;
&lt;span role="button" tabindex="0" onclick="handleCommand(event)" onKeyDown="handleCommand(event)"&gt;Ajouter le nom&lt;/span&gt;</pre>

<h4 id="css">CSS</h4>

<pre class="brush: css">[role="button"] {
  padding: 2px;
  background-color: navy;
  color: white;
  cursor: default;
}
[role="button"]:hover,
[role="button"]:focus,
[role="button"]:active {
   background-color: white;
   color: navy;
}
ul {
    list-style: none;
}</pre>

<h4 id="javascript">JavaScript</h4>

<pre class="brush: js">function handleCommand(event) {
  // Gère à la fois l'activation à la souris
  // et au clavier
  
  // Les touches autres que Entrée et Espace ne devraient
  // déclencher de commande
  if (event instanceof KeyboardEvent &amp;&amp; event.key !== 'Enter' &amp;&amp; event.key !== ' ') {
    return;
  }

  // On récupère la valeur du nouveau nom à partir
  // du champ en saisie
  let newNameInput = document.getElementById('newName');
  let name = newNameInput.value;
  newNameInput.value = ''; // On vide le champ texte
  newNameInput.focus();  // On passe le focus au champ texte pour
                         // permettre la saisie d'un autre nom

  // On évite d'ajouter des noms vides à la liste
  if(name.length &gt; 0) {
    listItem = document.createElement('li');
    listItem.appendChild(document.createTextNode(name));

    // On ajoute le nouveau nom à la liste.
    let list = document.getElementById('nameList');
    list.appendChild(listItem);
  }
}</pre>

<p>{{EmbedLiveSample("basic_button_example")}}</p>

<h3 id="toggle_button_example">Exemple d'interrupteur</h3>

<p>Dans le fragment qui suit, on convertit un élément <a href="/fr/docs/Web/HTML/Element/span"><code>&lt;span&gt;</code></a> en interrupteur grâce au rôle <code>button</code> et à l'attribut <code>aria-pressed</code>. Lorsque le bouton est activé, <code>aria-pressed</code> change de valeur et alterne entre <code>true</code> et <code>false</code>.</p>

<h4 id="html_2">HTML</h4>

<pre class="brush: html">&lt;button type="button" onclick="handleBtnClick()" onKeyDown="handleBtnKeyDown()"&gt;
  Couper le son
&lt;/button&gt;

&lt;span role="button" tabindex="0"
 aria-pressed="false" onclick="handleBtnClick(event)"
 onKeyDown="handleBtnKeyDown(event)"&gt;
  Couper le son
&lt;/span&gt;

&lt;audio id="audio" src="https://soundbible.com/mp3/Tyrannosaurus%20Rex%20Roar-SoundBible.com-807702404.mp3"&gt;
  Votre navigateur ne prend pas en charge l'élément &lt;code&gt;audio&lt;/code&gt;.
&lt;/audio&gt;

</pre>

<h4 id="css_2">CSS</h4>

<pre class="brush: css">button,
[role="button"] {
    padding: 3px;
    border: 2px solid transparent;
}

button:active,
button:focus,
[role="button"][aria-pressed="true"] {
    border: 2px solid #000;
}
</pre>

<h4 id="javascript_2">JavaScript</h4>

<pre class="brush: js">function handleBtnClick(event) {
  toggleButton(event.target);
}

function handleBtnKeyDown(event) {
  // On vérifie si les touches Entrée ou Espace sont pressées
  if (event.key === " " || event.key === "Enter" || event.key === "Spacebar") { // <a href="/fr/docs/Web/API/KeyboardEvent/key/Key_Values#whitespace_keys">Prise en charge de "Spacebar" pour IE11</a>
    // On empêche le défilement par défaut lorsque
    // la touche espace est utilisée
    event.preventDefault();
    toggleButton(event.target);
  }
}

function toggleButton(element) {
  var audio = document.getElementById('audio');
  // On vérifie si le bouton est pressé
  var pressed = (element.getAttribute("aria-pressed") === "true");
  // On fait alterner aria-pressed vers l'état opposé
  element.setAttribute("aria-pressed", !pressed);
  // On modifie l'état de lecture du fichier audio
  if(pressed) {
     audio.pause();
  } else {
     audio.play();
  }
}</pre>

<h4 id="result">Résultat</h4>

<p>{{EmbedLiveSample('toggle_button_example')}}</p>

<h2 id="accessibility_concerns">Accessibilité</h2>

<p>Les boutons sont des contrôles interactifs et, à ce titre, peuvent recevoir le focus. Si le rôle <code>button</code> est ajouté à un élément qui ne peut recevoir le focus nativement (comme <code>&lt;span&gt;</code>, <code>&lt;div&gt;</code> ou <code>&lt;p&gt;</code>), l'attribut <code>tabindex</code> devra être utilisé afin de permettre le focus sur le bouton.</p>

<div class="note">
<strong>Attention !</strong> Lorsqu'on utilise des liens avec le rôle <code>button</code>, il faut rajouter un gestionnaire d'évènement pour la touche <kbd>Espace</kbd>. En effet, les boutons s'activent avec <kbd>Espace</kbd> ou <kbd>Entrée</kbd> tandis que, nativement, les liens ne se déclenchent qu'avec <kbd>Entrée</kbd>.</p>
</div>

<p>Lorsqu'on utilise le rôle <code>button</code>, les lecteurs d'écran annonce l'élément comme un bouton, généralement en énonçant « clic » suivi du nom accessible du bouton. Le nom accessible correspond au contenu de l'élément ou à la valeur de <code>aria-label</code> ou à l'élément référencé avec l'attribut <code>aria-labelledby</code>, ou à une description si elle existe.</p>

<h2 id="best_practices">Bonnes pratiques</h2>

<p>Si un lien effectue l'action d'un bouton, fournir <code>role="button"</code> à l'élément permettra aux outils d'assistance de comprendre la fonction de l'élément. Toutefois, une meilleure solution consiste à ajuster l'aspect visuel afin qu'il corresponde à la fonction et au rôle ARIA. Lorsque c'est possible, il est recommandé d'utiliser les boutons HTML natifs (<code>&lt;button&gt;</code>, <code>&lt;input type="button"&gt;</code>, <code>&lt;input type="submit"&gt;</code>, <code>&lt;input type="reset"&gt;</code> et <code>&lt;input type="image"&gt;</code>) plutôt que le rôle <code>button</code>. En effet, les boutons HTML natifs sont pris en charge par l'ensemble des agents utilisateurs et outils d'assistance et satisfont aux règles de gestion du focus et du clavier, sans qu'il soit nécessaire d'ajouter des adaptations.</p>

<h2 id="specifications">Spécifications</h2>

<table class="standard-table">
 <thead>
  <tr>
    <th scope="col">Spécification</th>
    <th scope="col">État</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>{{SpecName("ARIA","#button","button")}}</td>
   <td>{{Spec2('ARIA')}}</td>
  </tr>
  <tr>
   <td>{{SpecName("ARIA Authoring Practices","#button","button")}}</td>
   <td>{{Spec2('ARIA Authoring Practices')}}</td>
  </tr>
 </tbody>
</table>

<h2 id="Notes">Notes</h2>

<h3 id="aria_attributes_used">Attributs ARIA utilisés</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-1.1/#aria-pressed">aria-pressed</a></code></li>
 <li><code><a href="https://www.w3.org/TR/wai-aria-1.1/#aria-expanded">aria-expanded</a></code></li>
 <li><code><a href="https://www.w3.org/TR/wai-aria-1.1/#aria-haspopup">aria-haspopup</a></code></li>
</ul>

<h3 id="Additional_resources">Ressources complémentaires</h3>

<ul>
 <li><a href="https://www.w3.org/TR/html5/dom.html#aria-usage-note">Sémantique native forte en HTML5</a></li>
 <li><a href="https://www.w3.org/TR/aria-in-html/">Notes sur l'utilisation d'ARIA en HTML</a></li>
 <li><a href="https://www.w3.org/TR/wai-aria-practices/examples/button/button.html">Exemple de code officiel WAI-ARIA</a></li>
 <li><a href="/fr/docs/Web/Accessibility/ARIA/Roles/menubutton_role">Rôle ARIA <code>menubutton</code></a></li>
</ul>

<section id="Quick_links">
  <ol>
   <li><a href="/fr/docs/Web/Accessibility/ARIA/Roles"><strong>Rôles WAI-ARIA</strong></a>{{ListSubpagesForSidebar("/en-US/docs/Web/Accessibility/ARIA/Roles")}}</li>
  </ol>
</section>