Comment faire une liste déroulante en HTML
Une liste déroulante est un élément <select> avec un <option> pour chaque choix. La value de chaque option est ce qu'envoie le formulaire ; le texte entre les balises est ce que voit le lecteur. Choisissez une option et appuyez sur Submit :
Le formulaire envoie language=js : le name du select et la value de l'option choisie. selected fixe la valeur par défaut ; sans lui, la première option est choisie. Si une option n'a pas de value, c'est son texte qui est envoyé.
Reliez le label au select avec for et id (ou en l'entourant) pour qu'un clic sur le label mette le focus sur la liste et que les lecteurs d'écran l'annoncent.
Attributs de select et d'option
| Élément | Attribut | Rôle |
|---|---|---|
<select> | name | La clé sous laquelle la valeur est envoyée |
<select> | required | Une vraie option doit être choisie, pas une première option vide servant de placeholder |
<select> | multiple | Plusieurs options peuvent être choisies |
<select> | size | Le nombre de lignes visibles (la transforme en zone de liste) |
<select> | disabled | Toute la liste est désactivée et n'est pas envoyée |
<option> | value | Ce qui est envoyé quand elle est choisie |
<option> | selected | Choisie au chargement de la page |
<option> | disabled | Affichée mais impossible à choisir |
<optgroup> | label | Le titre du groupe |
Une option placeholder avec required
Un select a toujours une valeur, donc sans placeholder, la première vraie option est envoyée même si le lecteur n'a jamais touché la liste. Une première option vide règle cela, et required bloque l'envoi tant qu'une vraie option n'est pas choisie :
Appuyez sur Continue avant de choisir : le navigateur refuse et vous demande de sélectionner un élément. Le placeholder a value="", ce que required considère comme vide, et disabled pour qu'il ne puisse plus être choisi une fois un pays sélectionné.
Regrouper les options avec optgroup
<optgroup label="..."> place un titre au-dessus d'un ensemble d'options. Le titre n'est pas sélectionnable :
Les groupes ne peuvent pas être imbriqués : une liste n'a qu'un seul niveau de titres, pas plus. disabled sur un <optgroup> désactive toutes ses options.
Sélection multiple
multiple permet au lecteur de choisir plusieurs options, et transforme la liste déroulante en zone de liste. Maintenez Ctrl (Cmd sur Mac) pour ajouter des options une par une, ou Maj pour sélectionner une plage :
Le formulaire envoie skills=html et skills=css : le même nom une fois par option choisie. Beaucoup de gens ne connaissent pas le geste Ctrl+clic, donc pour quelques options, un groupe de cases à cocher est plus simple à utiliser.
Lire et définir la valeur en JavaScript
select.value lit et définit la valeur de l'option choisie, et l'événement change se déclenche quand le lecteur choisit une autre option. Un usage courant est une seconde liste dont les options dépendent de la première :
new Option(text, value) crée une option. select.selectedIndex est la position de l'option choisie, et select.selectedOptions liste les options choisies, ce qui permet de lire un select multiple.
Styliser un select
La liste ouverte est dessinée par le navigateur et le système d'exploitation, et on ne peut en styliser que peu de chose. La boîte fermée, si : appearance: none retire la flèche native, et une image de fond met la vôtre à sa place :
Le padding de fin supplémentaire laisse de la place à la flèche pour qu'un long texte d'option ne passe pas dessous. font: inherit compte autant ici que sur les boutons : les selects utilisent par défaut la petite police de formulaire du navigateur. Les options de la liste ouverte gardent l'apparence native. Chrome peut aussi styliser la liste ouverte si vous l'activez avec appearance: base-select ; les navigateurs qui ne le prennent pas en charge affichent la liste native. Un contrôle total partout demande un widget personnalisé construit avec ARIA, bien plus difficile à réussir qu'il n'y paraît.
Select, boutons radio ou datalist ?
| Utilisez | Quand |
|---|---|
<select> | Un choix dans une longue liste, ou quand la place manque |
| Des boutons radio | Un choix parmi quelques options qui doivent toutes être visibles (voir bouton radio HTML) |
<input> avec <datalist> | Des suggestions, mais n'importe quelle valeur tapée est acceptée |
Erreurs fréquentes
- Pas de placeholder sur un choix obligatoire. La première vraie option est envoyée même si le lecteur ne l'a jamais choisie.
- Un placeholder avec une vraie valeur, comme
value="none".requiredle considère comme un choix valide. Utilisezvalue="". - Des options sans
valuequand le texte est long ou traduit. Le serveur reçoit le texte visible, qui change avec la langue. multiplepour quelques options. Les cases à cocher sont plus simples à utiliser.- Écouter
clicksur les options. Utilisezchangesur le<select>; il se déclenche aussi pour les changements au clavier. - Pas de label. Un select qui n'a qu'un placeholder n'a plus de nom une fois une option choisie.
Questions fréquentes
Comment créer une liste déroulante en HTML ?
Utilisez <select> avec un <option> par choix : <select name="color"><option value="red">Red</option><option value="blue">Blue</option></select>. Donnez au select un name et un <label>.
Comment définir l'option par défaut d'un select ?
Ajoutez selected à cette option : <option value="blue" selected>Blue</option>. Sans cela, la première option est sélectionnée. En JavaScript, définissez select.value = 'blue'.
Comment ajouter un placeholder à un select ?
Faites de la première option une option vide et non sélectionnable : <option value="" disabled selected>Choose a country</option>. Ajoutez required au <select> pour que le formulaire ne puisse pas être envoyé tant qu'une vraie option n'est pas choisie.
Comment récupérer la valeur sélectionnée d'un select en JavaScript ?
select.value est la valeur de l'option sélectionnée. Pour son texte visible, utilisez select.selectedOptions[0].text, et écoutez l'événement change pour réagir quand le choix change. Pour un select multiple, parcourez select.selectedOptions.
Quelle est la différence entre un select et un datalist ?
Un <select> n'autorise que les options listées. Un <input> avec un <datalist> propose des options pendant que le lecteur tape mais accepte n'importe quel texte. Utilisez select quand la réponse doit être l'une des vôtres.