← Tous les articles

Customizable select : enfin styler le vrai <select>

Aller au-delà de l’élément select par défaut imposait jusqu’ici l’un de deux mauvais compromis : de lourdes bibliothèques JavaScript ou des piles d’éléments div, l’accessibilité devenant délicate dans les deux cas.1 À la WWDC 2026, l’équipe Safari a montré la sortie de cette impasse : customizable select, un ensemble d’ajouts à HTML et CSS qui rend l’élément <select> préexistant entièrement stylable tout en conservant la sémantique, la navigation au clavier et la prise en charge des lecteurs d’écran qu’il offre déjà. À partir de Safari 27 et Chrome 135, vous pouvez restyler le bouton, le menu déroulant, la coche et même la flèche, puis placer des images, des vidéos ou des émojis à l’intérieur de vos options.1

TL;DR

  • Customizable select stylise le véritable élément <select> avec HTML et CSS seuls, remplaçant les bibliothèques JavaScript et les empilements de div vers lesquels les développeurs se tournaient auparavant. La disponibilité commence avec Safari 27 et Chrome 135.1
  • L’activation passe par appearance: base-select, appliqué deux fois : une première sur le select lui-même pour ouvrir le style du bouton, et une seconde sur ::picker(select) pour renoncer au menu déroulant natif.1
  • De nouvelles parties stylables l’accompagnent : ::picker-icon restyle la flèche via la propriété content et une width, ::checkmark sur l’élément option remplace la coche de la même manière, et la pseudo-classe :open stylise le bouton pendant que le menu est ouvert.1
  • Les options acceptent tout type de contenu : images, vidéos, émojis. La démonstration de la session place un SVG et un libellé dans chaque option, puis dispose tout le menu déroulant en grille CSS avec grid-template et gap.1
  • Placer un <button> comme premier enfant de <select>, ce qui n’était auparavant pas autorisé en HTML, remplace le bouton intégré ; l’élément <selectedcontent> qu’il contient affiche le contenu riche de l’option sélectionnée.2
  • L’amélioration progressive est offerte d’office : les navigateurs sans prise en charge retombent sur la fenêtre contextuelle native, et l’élément select sémantique conserve partout son accessibilité intégrée.1

De la soupe de div au retour vers un HTML sémantique

Watch on Apple Developer ↗

Tim, ingénieur Safari, applique appearance: base-select à une démo de portfolio de photographe à partir de 2:48.

Le cadrage de la session part de ce que <select> fait déjà bien. L’élément offre une accessibilité de base sans rien installer : navigation au clavier entre les éléments option et comportement solide avec les lecteurs d’écran, le tout sans bibliothèques externes.1 Sur les plateformes Apple, le rendu natif est le familier bouton déroulant, et il s’accorde à tous les autres contrôles de la plateforme, ce qui offre aux utilisateurs une façon connue de naviguer.1

Le hic a toujours été le design. Posez le contrôle natif sur un site stylé et il détonne ; il refuse de se fondre dans le décor. Jusqu’ici, le remède consistait à abandonner complètement l’élément au profit d’un widget JavaScript ou d’un tas de div, puis à reconstruire l’accessibilité à la main. Customizable select conserve l’élément et vous remet le style, en trois étapes que la session parcourt sur une véritable construction de portfolio de photographe : le bouton, le menu déroulant, et enfin un contenu qui dépasse le simple texte.1

Styler le bouton : base-select, ::picker-icon et :open

Le bouton est la partie du select sur laquelle vous cliquez pour afficher le menu, et la première étape tient en une seule déclaration :

select {
  appearance: base-select;
}

appearance: base-select échange le rendu natif contre un plus petit ensemble de styles de base que vous pouvez modifier.1 L’effet apparaît immédiatement par héritage : le site de démo définit font-family: Gill Sans sur le body, et le bouton du select hérite désormais de la police du body, s’accordant au libellé voisin.1 À partir de là, l’arrière-plan, la bordure et le padding s’ajustent comme pour n’importe quel autre élément.

Deux nouveaux points d’accroche finalisent le bouton. La flèche obtient son propre sélecteur, ::picker-icon, qui prend une propriété content pour un glyphe de remplacement et une width pour le dimensionner. La pseudo-classe :open stylise le bouton différemment pendant que le menu déroulant est ouvert :

select::picker-icon {
  content: "▼"; /* swap in your own glyph */
  width: 1rem;
}

select:open {
  background: #1d1d1f;
  color: #f5f5f7;
}

select:open::picker-icon {
  color: #f5f5f7; /* arrow matches the text color in the open state */
}

Le verdict de la session sur le résultat : un select assorti au reste du site en quelques lignes de CSS seulement.1

Styler le menu déroulant : ::picker(select) et ::checkmark

Le menu apporte ses propres parties stylables. Vous adressez le menu déroulant lui-même avec ::picker(select) sur l’élément select, et la coche avec ::checkmark sur l’élément option.1 Renoncer au menu natif exige appearance: base-select une deuxième fois, désormais sur le picker :

select::picker(select) {
  appearance: base-select;
  padding: 0.5rem;
  margin-top: 0.25rem;
  border: 1px solid #d2d2d7;
  box-shadow: 0 8px 24px rgb(0 0 0 / 0.12);
}

Avec cette page blanche en place, la démo organise les espacements avec du padding et de la marge, puis traite les bordures et une box-shadow sur le menu déroulant.1 Pour mettre en avant le choix courant, on utilise le sélecteur préexistant :checked plutôt que quoi que ce soit de nouveau : mettre en gras l’option cochée, griser les autres.1

option:checked {
  font-weight: bold;
}

option:not(:checked) {
  color: #6e6e73;
}

option::checkmark {
  content: "✓";
  width: 1rem;
}

::checkmark fonctionne exactement comme ::picker-icon : définissez content et une width, et la coche par défaut devient le glyphe qui convient à votre design.1

Du contenu riche dans les options, disposé en grille

Le plus grand changement, c’est ce qui se trouve à l’intérieur de <option>. La session est explicite : tout type de contenu fonctionne, images, vidéos, émojis, ce que vous voulez.1 La démo construit un navigateur de catégories pour les sujets les plus populaires du photographe, avec un symbole SVG et un libellé dans chaque option :

<select>
  <option value="flowers">
    <img src="flowers.svg" alt="">
    Flowers
  </option>
  <!-- more categories -->
</select>

Remarquez l’attribut alt vide. Tim laisse délibérément le texte alternatif de l’image vide, car le libellé « Flowers » serait sinon annoncé deux fois par les lecteurs d’écran.1 Petit détail, conséquence réelle : les options riches restent aussi utilisables avec les technologies d’assistance que les options ordinaires.

La coche par défaut ayant été retirée, la démo met en évidence l’option sélectionnée par le sélecteur checked et des changements de couleur.1 Un problème subsiste : les options à symbole et libellé rendent le menu déroulant très long. Le remède réutilise du CSS qui existe déjà, car le picker est désormais une cible de style ordinaire. Une mise en page en grille remodèle tout le menu :

select::picker(select) {
  display: grid;
  grid-template: 1fr 1fr / 1fr 1fr 1fr; /* rows / columns */
  gap: 0.5rem;
}

grid-template définit le nombre de lignes et de colonnes, tandis que gap définit l’espacement entre les cellules de la grille, et le menu déroulant s’aligne en une grille organisée de catégories.1 La session se termine sur une touche d’éclat dans le même esprit : un sélecteur de couleur radial, entièrement construit avec customizable select.1

Le bouton interchangeable et selectedcontent

Une lacune subsiste dans le navigateur de catégories : les symboles SVG vivent dans les options, mais le bouton qui montre la sélection courante n’affiche que du texte.1 Customizable select comble la lacune en vous permettant de remplacer le bouton intégré, en plaçant un élément <button> comme premier enfant du <select>. Mettre un bouton dans un select n’était auparavant pas autorisé en HTML ; il accepte désormais du contenu personnalisé, comme des libellés, ou comme l’élément conçu exactement pour cette tâche.1

L’annonce de la bêta de Safari 27 par WebKit nomme cet élément : <selectedcontent>. Placé dans le bouton premier enfant du select, il affiche le contenu de l’option actuellement sélectionnée et peut être stylé directement.2

<select>
  <button>
    <selectedcontent></selectedcontent>
  </button>
  <option value="everything">
    <img src="everything.svg" alt="">
    Everything
  </option>
  <!-- more categories -->
</select>

L’élément reflète tout contenu riche appartenant à l’option sélectionnée, comme le SVG à côté du libellé « Everything » dans la démo, si bien que le bouton affiche enfin le même langage visuel que le menu qu’il ouvre.12

L’amélioration progressive est intégrée

La dernière étape de la session est celle que les équipes négligent à leurs dépens : vérifier le design dans les navigateurs qui ne prennent pas en charge customizable select. La réponse est ennuyeuse au meilleur sens du terme. L’amélioration progressive entre en jeu, le contrôle reste utilisable, et les clients obtiennent la fenêtre contextuelle native.1 Réutiliser l’élément select signifie que le scénario de repli existe déjà, et parce que <select> est un élément sémantique, les fonctionnalités d’accessibilité intégrées survivent dans tous les navigateurs.1

La disponibilité est concrète : Safari 27 et Chrome 135. Pour essayer ces fonctionnalités dès maintenant, téléchargez Safari Technology Preview ou Safari Beta.1 Le conseil de clôture de la session est pratique : consultez la démo sur webkit.org, stylez quelque chose de simple sur votre propre site, testez dans des navigateurs sans prise en charge et avec des outils d’assistance, et lisez le matériel de bonnes pratiques de WebKit afin que l’interface fonctionne pour tout le monde.1

Ce que l’équipe Safari a ajouté dans les labs

Quelques éléments des labs de la WWDC complètent le tableau, notamment sur la direction que prend customizable select.

Le point de la feuille de route à surveiller est appearance: base, la même activation généralisée à tous les contrôles de formulaire plutôt qu’au seul <select>. La valeur existe dans la spécification CSS mais n’est encore livrée nulle part.3 Dans le lab, le panel a indiqué qu’elle n’est « pas livrée pour l’instant » et viendra plus tard, et que la discussion sur la spécification reste ouvertement en suspens : les panélistes étaient en désaccord en direct sur l’aspect que devrait même avoir la base non stylée.4 Les objectifs de conception énoncés sont assez clairs : hériter au maximum des styles de la page, aucune magie de mise en page, et un rendu de base identique ainsi qu’une structure DOM identique entre les moteurs.4

L’historique explique pourquoi customizable select réutilise <select> plutôt qu’autre chose. La proposition d’origine était un tout nouvel élément <selectmenu>. Un ingénieur des standards de WebKit a poussé pour réutiliser <select> à la place, afin que les navigateurs sans prise en charge conservent gratuitement le repli natif, ce qui est exactement le scénario d’amélioration progressive ci-dessus.4

Une règle stricte est ressortie du panel : conservez toujours du contenu textuel dans vos options. Les options à icône seule rendent une fenêtre contextuelle native vide dans les navigateurs sans prise en charge, ce qui laisse les utilisateurs bloqués sur les moteurs non compatibles.4

Points clés à retenir

Pour les développeurs front-end : - Activez avec appearance: base-select sur l’élément select pour le bouton, puis de nouveau sur ::picker(select) pour le menu déroulant ; ensuite, stylez l’arrière-plan, la bordure, le padding, l’espacement et la box-shadow comme n’importe quel autre élément.1 - Remplacez la flèche avec ::picker-icon et la coche avec ::checkmark, tous deux via content plus width ; stylez l’état ouvert avec :open ; mettez en avant la sélection avec le sélecteur préexistant :checked.1 - Placez du vrai HTML dans <option> (images, vidéos, émojis) et remodelez le menu avec du CSS existant, comme une grille grid-template plus gap ; remplacez le bouton intégré par un <button> premier enfant contenant <selectedcontent>.12

Pour les équipes soucieuses de l’accessibilité : - Le select sémantique conserve la navigation au clavier et la prise en charge des lecteurs d’écran sans bibliothèques externes, dans les navigateurs pris en charge comme dans ceux qui ne le sont pas.1 - Lorsque les options portent à la fois une image et un libellé texte, laissez le texte alternatif de l’image vide pour que les lecteurs d’écran n’annoncent pas le libellé deux fois.1 - Testez avec des navigateurs sans prise en charge et avec des outils d’assistance avant la mise en production, conformément à la liste de contrôle de la session elle-même.1

Pour les responsables techniques qui planifient le déploiement : - Traitez customizable select comme une amélioration progressive : Safari 27 et Chrome 135 obtiennent le design personnalisé, tous les autres obtiennent la fenêtre contextuelle native, et aucun repli JavaScript n’est requis.1 - Évaluez-le dès maintenant dans Safari Technology Preview ou Safari Beta, et pesez-le face à la bibliothèque de menu déroulant qui occupe actuellement votre bundle.1

FAQ

Qu’est-ce que customizable select ?

Customizable select est un ensemble de capacités HTML et CSS, introduit par l’équipe Safari à la WWDC 2026 et disponible à partir de Safari 27 et Chrome 135, qui rend l’élément <select> préexistant entièrement personnalisable. Vous stylez le bouton, le menu déroulant, la flèche et la coche avec du CSS, et vous placez du contenu riche dans les options, tout en conservant l’accessibilité intégrée de l’élément.1

Comment activer customizable select ?

Appliquez appearance: base-select à deux endroits : sur l’élément select lui-même, ce qui remplace le rendu natif du bouton par un plus petit ensemble de styles de base, et sur ::picker(select), ce qui fait renoncer le menu déroulant à son rendu natif afin que vous puissiez le styler librement.1

Puis-je placer des images ou d’autre HTML à l’intérieur des éléments option ?

Oui. La session indique que vous pouvez placer tout type de contenu dans les options : images, vidéos, émojis. La démo utilise un SVG et un libellé texte par option, avec un texte alternatif d’image vide pour que les lecteurs d’écran n’annoncent le libellé qu’une seule fois, et dispose le menu en grille CSS à l’aide de grid-template et gap.1

Qu’est-ce que l’élément selectedcontent ?

<selectedcontent> est l’élément qui affiche le contenu riche de l’option actuellement sélectionnée à l’intérieur du bouton du select. Customizable select autorise un <button> comme premier enfant de <select>, ce qui n’était auparavant pas permis en HTML ; placer <selectedcontent> dans ce bouton reflète le contenu de l’option sélectionnée, comme un SVG à côté de son libellé, et l’élément peut être stylé directement.12

Que se passe-t-il dans les navigateurs qui ne prennent pas en charge customizable select ?

Le contrôle se dégrade en douceur. L’amélioration progressive signifie que le select reste pleinement utilisable et que les clients obtiennent la fenêtre contextuelle native, et parce que <select> est un élément sémantique, les fonctionnalités d’accessibilité intégrées subsistent. La session recommande de tester dans les navigateurs non pris en charge et avec des outils d’assistance avant la mise en production.1


Customizable select supprime une dépendance de la même façon que CSS Grid Lanes le fait pour les mises en page en maçonnerie, et l’association est délibérée : la session 315 elle-même se clôt en orientant les spectateurs vers la session Grid Lanes, et le site de démo utilise les deux fonctionnalités ensemble.1 Apple ne cesse d’étendre ce que les simples éléments HTML peuvent faire, la même trajectoire que celle couverte dans l’élément model de HTML sur les plateformes Apple, et chaque bibliothèque de menu déroulant que vous n’expédiez plus renforce l’argumentaire du manifeste no-build. Le hub complet de la série est la série Apple Ecosystem.

Références


  1. Apple, WWDC 2026 session 315, Rediscover the HTML select element. Source pour l’état antérieur (lourdes bibliothèques JavaScript ou nombreux éléments div) ; la disponibilité à partir de Safari 27 et Chrome 135, avec Safari Technology Preview et Safari Beta pour un accès anticipé ; appearance: base-select appliqué sur le select et sur ::picker(select) ; les sélecteurs ::picker-icon et ::checkmark stylés via content et width ; la pseudo-classe :open ; le sélecteur préexistant :checked pour mettre en avant la sélection ; du HTML arbitraire à l’intérieur des options (images, vidéos, émojis) avec la démo SVG-plus-libellé et le détail de l’alt vide pour les lecteurs d’écran ; la mise en page en grille du menu déroulant via grid-template et gap ; le <button> premier enfant remplaçant le bouton intégré (auparavant non autorisé en HTML) ; la démo du sélecteur de couleur radial ; l’appellation « pull down buttons » sur les plateformes Apple ; et le repli d’amélioration progressive vers la fenêtre contextuelle native. 

  2. WebKit, News from WWDC26: WebKit in Safari 27 beta. Source pour le nom de l’élément <selectedcontent>, son placement à l’intérieur du <button> premier enfant du select, et son comportement consistant à afficher le contenu de l’option actuellement sélectionnée tout en étant directement stylable. 

  3. MDN Web Docs, appearance. Source pour la valeur de spécification appearance: base

  4. Paraphrasé d’un enregistrement transcrit localement du Safari & Web Technologies Group Lab de la WWDC 2026 ; les sous-titres officiels étaient partiels. Apple, WWDC 2026, Safari & Web Technologies Group Lab. Source pour les déclarations de feuille de route sur appearance: base (« pas livré pour l’instant », plus tard, discussion de spécification encore en suspens avec désaccord en direct sur la base non stylée) et ses objectifs de conception énoncés (hériter au maximum des styles de la page, aucune magie de mise en page, rendu de base identique et structure DOM identique entre les moteurs) ; l’historique selon lequel la proposition d’origine était un nouvel élément <selectmenu> avant qu’un ingénieur des standards de WebKit ne pousse à réutiliser <select> afin que les navigateurs non compatibles conservent gratuitement le repli natif ; et la règle selon laquelle les options doivent conserver du contenu textuel car les options à icône seule rendent une fenêtre contextuelle native vide dans les navigateurs sans prise en charge. 

Articles connexes

Pourquoi Safari 27 livre 525 correctifs : notes du labo WebKit

Le labo Safari de la WWDC 2026 sur la façon dont WebKit décide quoi construire : 525 correctifs, une réécriture du charg…

10 min de lecture

CSS Grid Lanes : le masonry natif dans Safari

CSS Grid Lanes apporte la disposition masonry native à Safari 26.4 en trois lignes de CSS, avec un réglage flow-toleranc…

10 min de lecture

Le manifeste sans build : livrer sans bundler

FastAPI + HTMX + CSS pur avec zéro outil de build et des scores Lighthouse parfaits. Des chiffres de production réels, d…

10 min de lecture