
Personnaliser le select en css : c’est enfin possible !
Personnaliser le select
en CSS est enfin possible ! Plus besoin d’utiliser des librairies JavaScript pour avoir un menu déroulant qui colle à votre design. Pour l’instant, cette fonctionnalité est uniquement disponible pour les navigateurs basés sur Chromium (à partir de la version 135), mais on espère que les autres navigateurs suivront.
Fonctionnement
La première étape consiste à demander au navigateur de modifier le style du select
afin qu’il n’utilise plus le select de base, mais le select implémenté par le navigateur.
select,
select::picker(select) {
appearance: base-select;
}
CSSAvec ce style, le select change d’apparence. Il passe d’un look “système” à un look “navigateur” minimaliste, prêt à être stylisé.
Styliser le bouton Select
Voici les éléments clés qu’il est possible de sélectionner pour le style :
select {
/* Style du bouton select */
}
select::picker-icon {
/* Pseudo élément représentant la flèche */
}
select::picker(select) {
/* Menu déroulant */
}
option::checkmark {
/* Coche à gauche des options */
}
CSSHTML dans les options
Il est désormais possible d’insérer du HTML directement dans les balises <option>
!
Exemple :
<select>
<option value="1">
<img src="/avatar-bastien.jpg" alt="" width="20" height="20" />
Bastien
</option>
<option value="2"><br>
<img src="/avatar-alice.jpg" alt="" width="20" height="20" />
Alice
</option>
</select>
HTMLBouton personnalisé
Si vous sélectionnez une option avec du HTML (comme notre avatar), le bouton select
n’affichera que le contenu textuel par défaut. Pour améliorer cela, il est possible de mettre un <button>
comme premier enfant du <select>
, et d’utiliser une balise spéciale <selectedcontent>
qui reprendra automatiquement le contenu de l’option sélectionnée.
<select>
<!-- Ce bouton sera affiché à la place du contenu par défaut du select -->
<button>
<!-- Prendra le contenu HTML de l'option choisie -->
<selectedcontent></selectedcontent>
<svg><!-- ... icône flèche ... --></svg>
</button>
<!-- Ensuite nos options -->
<option value="1">
<img src="/avatar-bastien.jpg" alt="" width="20" height="20" />
Bastien
</option>
<option value="2">
<img src="/avatar-alice.jpg" alt="" width="20" height="20" />
Alice
</option>
</select>
HTMLPositionnement
Le menu déroulant se positionne automatiquement, mais il est possible de choisir son emplacement à l’aide du système d’ancrage CSS.
select::picker(select) {
/* On positionne le menu sur la droite de notre select */
top: anchor(top);
left: anchor(right);
}
CSSAnimations
Il est également possible d’ajouter des animations pour le déploiement du menu déroulant.
select::picker(select) {
opacity: 0;
transform: translateY(-10px);
transition: all 0.4s allow-discrete;
}
select::picker(select):popover-open {
transform: translateY(0px);
opacity: 1;
@starting-style {
opacity: 0;
transform: translateY(-10px);
}
}
CSSCompatibilité avec les autres navigateurs
Cette nouveauté est une amélioration progressive. Les navigateurs qui ne comprennent pas appearance: base-select
, ::picker(select)
ou le HTML dans les options ignoreront simplement tout cela et afficheront le bon vieux select natif standard. Le contenu HTML dans les <option>
sera ignoré, seul le texte sera pris en compte.
Limitations
Cette nouvelle option de style permettra de se passer de librairies JavaScript pour de nombreux cas, mais il y a quelques points à prendre en compte :
- Il n’est pas possible de mettre un champ dans le select (bloquant pour créer un autocomplete par exemple).
- Sur mobile, l’apparence
base-select
désactive le sélecteur natif pour notre menu déroulant, donc à voir ce que ça donne niveau accessibilité.
Conclusion
La possibilité de styliser les selects nativement est une fonctionnalité attendue depuis des années. Ce changement permettra enfin de créer des interfaces plus cohérentes et esthétiques sans alourdir nos pages avec du JavaScript. De plus, le navigateur gère toute la partie accessibilité (navigation clavier, etc.), ce qui est un énorme avantage.