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.

<input type="radio" id="radioButton">

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 Une chaîne de caractères DOMString qui représente la valeur du bouton radio.
Évènements change et input
Attributs pris en charge checked
Attributs IDL checked et value
Méthodes select()

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=nom". 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".

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;
  outline: none;
  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 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.

Spécifications

Spécification État Commentaires
HTML Living Standard
La définition de '<input type="radio">' dans cette spécification.
Standard évolutif  
HTML5
La définition de '<input type="radio">' dans cette spécification.
Recommendation  

Compatibilité des navigateurs

Fonctionnalité Chrome Firefox (Gecko) Internet Explorer Opera Safari
Support simple (Oui) (Oui) (Oui) (Oui) (Oui)
Fonctionnalité Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Support simple (Oui) 4.0 (2.0) (Oui) (Oui) (Oui)

Voir aussi

Étiquettes et contributeurs liés au document

Étiquettes : 
 Contributeurs à cette page : SphinxKnight, FanJiyong
 Dernière mise à jour par : SphinxKnight,