textbox
Désigne un élément comme une entrée de texte mono- ou multiligne. Préférez <input type="text"> ou <textarea> — ils gèrent tous les comportements de textbox gratuitement. N'utilisez role="textbox" que pour construire un éditeur de texte riche sur un élément contenteditable.
Quand l’utiliser
Utilisez <input type="text">, <input type="email">, <input type="url">, <input type="tel"> ou <textarea> — celui qui correspond à la sémantique de l’entrée. Le natif gère la sélection, le curseur, la composition IME, la soumission de formulaire, les tokens d’autocomplétion et la validation, qui sont tous très difficiles à recréer.
role="textbox" est approprié sur un seul type d’élément : un div contenteditable qui héberge un éditeur de texte riche. Le rôle indique aux technologies d’assistance de l’exposer comme une région éditable plutôt qu’un conteneur générique. Définissez aria-multiline="true" si l’éditeur accepte plusieurs lignes.
Si votre « textbox » nécessite des suggestions d’autocomplétion, utilisez role="combobox" sur l’entrée à la place — textbox ne possède pas de popup.
Erreurs courantes
role="textbox"appliqué à un<div>qui n’est PAScontenteditable. Le rôle annonce un champ éditable mais la saisie ne produit rien.- Textboxes personnalisées sans
<label for>associé niaria-label— le champ n’a pas de nom accessible. - Utilisation de
placeholdercomme seul libellé. Le placeholder disparaît lors du focus, échoue au contraste pour de nombreux thèmes et ne constitue pas un nom accessible. role="textbox"sur uncontenteditablemonoligne qui ne supprime pas les sauts de ligne collés. Les utilisateurs collent du contenu avec des retours à la ligne qui contournent la contrainte visuelle.aria-multiline="true"absent sur un éditeurcontenteditablemultiligne — les lecteurs d’écran l’annoncent comme une entrée monoligne.
Exemple
<!-- Recommandé -->
<label for="bio">Short bio</label>
<textarea id="bio" rows="4" maxlength="240"></textarea>
<!-- Éditeur de texte riche -->
<label id="commentLabel">Comment</label>
<div
role="textbox"
contenteditable="true"
aria-labelledby="commentLabel"
aria-multiline="true"
></div>