<input type="radio">
Les éléments <input>
dont l'attribut type
vaut radio
sont généralement utilisés pour construire des groupes d'options parmi lesquelles on ne peut choisir qu'une valeur. Les « boutons radio » sont représentés par des cercles remplis lorsqu'ils sont sélectionnés.
Exemple interactif
On les appelle boutons radios par analogie avec les boutons qui étaient utilisés sur les anciens postes de radios.
Note : Les cases à cocher (checkboxes) ressemblent aux boutons radios. Toutefois, il existe une différence fondamentale : les boutons radio ne permettent de sélectionner qu'une seule option au sein d'un groupe alors que les cases à cocher permettent d'en sélectionner plusieurs.
Valeur
L'attribut value
est une chaîne de caractères (un objet DOMString
au sens du DOM) qui contient la valeur du bouton radio. Cette valeur n'est pas montrée à l'utilisateur par le navigateur ou tout autre agent utilisateur, elle permet d'identifier l'option sélectionnée.
Définir un groupe de boutons radio
Pour définir un groupe de boutons radio, on leur donne le même nom via l'attribut name
. Une fois qu'on a formé un groupe de boutons radio, on ne pourra sélectionner qu'une seule des options de ce groupes (cliquer sur une option désélectionnera automatiquement l'option précédemment choisie dans ce groupe).
Il est possible d'avoir autant de groupes que nécessaire, il suffit que chaque groupe ait un nom (l'attribut name
) unique.
Ainsi, si on souhaite utiliser un formulaire afin de demander à l'utilisateur sa méthode de contact préférée, on pourra créer trois boutons radio avec l'attribut name
qui vaut contact
et pour lesquels l'attribut value
varie : email
pour le premier, telephone
pour le deuxième et courrier
pour le dernier. Cette valeur et le nom du groupe ne sont pas affichés (ce sera le rôle de l'élément <label>
de fournir un intitulé).
Voici le fragment de code HTML correspondant à cet exemple :
<form>
<p>Veuillez choisir la meilleure méthode pour vous contacter :</p>
<div>
<input type="radio" id="contactChoice1" name="contact" value="email" />
<label for="contactChoice1">Email</label>
<input type="radio" id="contactChoice2" name="contact" value="telephone" />
<label for="contactChoice2">Téléphone</label>
<input type="radio" id="contactChoice3" name="contact" value="courrier" />
<label for="contactChoice3">Courrier</label>
</div>
<div>
<button type="submit">Envoyer</button>
</div>
</form>
On voit ici trois boutons radio dont l'attribut name
vaut contact
et dont chacun possède une valeur unique pour l'attribut value
. Ils possèdent également un identifiant unique (id
) qui est utilisé pour rattacher le libellé fourni par l'élément <label>
via l'attribut for
.
Voici le résultat obtenu :
La représentation des données d'un groupe de boutons radio
Lorsqu'on envoie le formulaire précédent avec une option sélectionnée, les données du formulaire contiendront une valeur sous la forme "contact=valeur"
. Ainsi, si l'utilisateur clique sur le bouton radio « Téléphone » et envoie le formulaire, les données du formulaire contiendront "contact=telephone"
.
Si l'attribut value
n'est pas fourni dans le document HTML, la valeur par défaut utilisée sera on
pour l'ensemble du groupe. Si c'était le cas avec notre exemple précédent et que l'utilisateur avait cliqué sur l'option « Téléphone » et envoyé le formulaire, les données envoyées auraient contenu "contact=on"
ce qui ne s'avère pas très utile. Aussi, mieux vaut ne pas oublier les attributs value
!
Note : Si aucun bouton radio n'est sélectionné au moment de l'envoi du formulaire, le groupe radio n'est pas inclus dans les données envoyées par le formulaire car il n'y a aucune valeur à fournir.
Généralement, on souhaite qu'au moins une option soit sélectionné parmi les boutons d'un groupe et on inclue donc souvent un attribut checked
sur l'un des boutons afin d'avoir une option sélectionnée par défaut.
Ajoutant un peu de code à notre exemple pour étudier les données générées par ce formulaire. On modifie le code HTML afin d'ajouter un bloc <pre>
qui contiendra les données produites par le formulaire :
<form>
<p>Veuillez choisir la meilleure méthode pour vous contacter :</p>
<div>
<input type="radio" id="contactChoice1" name="contact" value="email" />
<label for="contactChoice1">Email</label>
<input type="radio" id="contactChoice2" name="contact" value="telephone" />
<label for="contactChoice2">Téléphone</label>
<input type="radio" id="contactChoice3" name="contact" value="courrier" />
<label for="contactChoice3">Courrier</label>
</div>
<div>
<button type="submit">Envoyer</button>
</div>
</form>
<pre id="log"></pre>
Ensuite, on ajoute du code JavaScript pour rattacher un gestionnaire d'évènement sur l'évènement submit
qui est déclenché lorsque l'utilisateur clique sur le bouton « Envoyer » :
var form = document.querySelector("form");
var log = document.querySelector("#log");
form.addEventListener(
"submit",
function (event) {
var data = new FormData(form);
var output = "";
for (const entry of data) {
output = entry[0] + "=" + entry[1] + "\r";
}
log.innerText = output;
event.preventDefault();
},
false,
);
Vous pouvez manipuler cet exemple et voir qu'il n'y a jamais plus 'un résultat pour le groupe "contact"
.
Attributs supplémentaires
En complément des attributs partagés par l'ensemble des éléments <input>
, les boutons radio peuvent utiliser les attributs suivants :
checked
Un attribut booléen qui indique si c'est ce champ radio qui est sélectionné parmi le groupe.
À la différence des autres navigateurs, Firefox conservera l'état coché dynamique d'un bouton radio au fur et à mesure des chargements de la page. On pourra utiliser l'attribut autocomplete
afin de contrôler cette fonctionnalité.
value
L'attribut value
est partagé par l'ensemble des types d'élément <input>
. Dans le cas d'un bouton radio, il a un rôle spécifique et permet d'associer un texte qui sera envoyé avec le formulaire pour représenter la valeur sélectionnée. Si la valeur de value
n'est pas définie, ce sera la chaîne de caractères "on"
qui sera envoyée.
Utiliser les boutons radio
Nous avons déjà vu certaines techniques ci-avant. Voyons désormais d'autres fonctionnalités fréquemment utilisées avec ces boutons.
Sélectionner un bouton radio par défaut
Pour qu'un bouton radio soit sélectionné par défaut, on ajoutera l'attribut booléen checked
. Voici ce que ça donne pour l'exemple précédent, légèrement modifié :
<form>
<p>Veuillez choisir la meilleure méthode pour vous contacter :</p>
<div>
<input
type="radio"
id="contactChoice1"
name="contact"
value="email"
checked />
<label for="contactChoice1">Email</label>
<input type="radio" id="contactChoice2" name="contact" value="telephone" />
<label for="contactChoice2">Téléphone</label>
<input type="radio" id="contactChoice3" name="contact" value="courrier" />
<label for="contactChoice3">Courrier</label>
</div>
<div>
<button type="submit">Envoyer</button>
</div>
</form>
Ici, c'est le premier bouton radio qui sera sélectionné par défaut.
Note :
Si l'attribut checked
est placé sur plus d'un bouton, c'est le dernier bouton contenant l'attribut qui sera sélectionné. C'est donc l'ordre des valeurs qui déterminera la valeur par défaut. Pour rappel, il ne peut y avoir qu'un seul bouton radio du groupe qui soit sélectionné à un instant donné.
Fournir une plus grande zone de sélection
Dans les exemples précédents, vous avez peut-être constaté qu'en cliquant sur l'élément <label>
associé au bouton radio, cela sélectionnait la valeur de ce bouton. C'est une fonctionnalité HTML très pratique qui facilite la sélection des options, notamment sur les écrans de petites tailles comme ceux des smartphones.
Au-delà des raisons relatives à l'accessibilité, il s'agit d'un autre argument en faveur de la bonne utilisation des éléments <label>
dans les formulaires.
Validation
Il n'existe pas de contrainte de validation particulière pour les boutons radio.
Mettre en forme les boutons radio
L'exemple qui suit est une version légèrement plus détaillée de l'exemple précédent qui contient une mise en forme et une meilleure sémantique grâce aux éléments HTML utilisés :
<form>
<fieldset>
<legend>Veuillez choisir la meilleure méthode pour vous contacter :</legend>
<div>
<input
type="radio"
id="contactChoice1"
name="contact"
value="email"
checked />
<label for="contactChoice1">Email</label>
<input
type="radio"
id="contactChoice2"
name="contact"
value="telephone" />
<label for="contactChoice2">Téléphone</label>
<input type="radio" id="contactChoice3" name="contact" value="courrier" />
<label for="contactChoice3">Courrier</label>
</div>
<div>
<button type="submit">Envoyer</button>
</div>
</fieldset>
</form>
On voit ici peu de modifications mais notamment l'ajout d'éléments <fieldset>
et <legend>
qui permettent de grouper les options (à la fois pour la mise en forme et pour la sémantique du document).
La feuille de style CSS utilisée est la suivante :
html {
font-family: sans-serif;
}
div:first-of-type {
display: flex;
align-items: flex-start;
margin-bottom: 5px;
}
label {
margin-right: 15px;
line-height: 32px;
}
input {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
border-radius: 50%;
width: 16px;
height: 16px;
border: 2px solid #999;
transition: 0.2s all linear;
margin-right: 5px;
position: relative;
top: 4px;
}
input:checked {
border: 6px solid black;
}
button,
legend {
color: white;
background-color: black;
padding: 5px 10px;
border-radius: 0;
border: 0;
font-size: 14px;
}
button:hover,
button:focus {
color: #999;
}
button:active {
background-color: white;
color: black;
outline: 1px solid black;
}
La propriété utilisée la plus notable est -moz-appearance
(utilisée avec certains préfixes navigateur). Par défaut, les boutons radios (ainsi que les cases à cocher) sont mis en forme avec l'apparence native liée au système d'exploitation sous-jacente. Avec appearance: none
, on peut passer outre cette mise en forme native et créer ses propres styles pour ces boutons. Ici, nous avons utilisé border
et border-radius
avec transition
afin de créer une animation lors de la sélection. On utilise également la pseudo-classe :checked
pour définir l'apparence du bouton radio lorsqu'il est sélectionné.
Cette méthode n'est pas exempte d'inconvénient : appearance
fonctionne correctement pour une mise en forme simple mais peut se comporter de façons différentes selon les navigateurs et elle ne fonctionne pas du tout avec Internet Explorer. Attention donc à tester votre site dans les différents navigateurs.
De plus, la légende et le bouton d'envoi ont été mis en forme pour avoir un contraste marqué. Ce n'est pas peut-être pas la mise en forme idéale pour toutes les applications web mais cela illustre certaines des possibilités.
Résumé technique
Spécifications
Specification |
---|
HTML Standard # radio-button-state-(type=radio) |
Compatibilité des navigateurs
BCD tables only load in the browser
Voir aussi
- L'élément
<input>
et l'interfaceHTMLInputElement
du DOM qui est implémentée par cet élément - L'interface
RadioNodeList
qui décrit une liste de boutons radio