La plupart des interfaces utilisateur générées par le navigateur peuvent être personnalisées dans une certaine mesure à l'aide de CSS. Même s'il nécessite des fonctionnalités modernes, il se dégrade de manière fluide dans les anciens navigateurs et ne nécessite donc souvent pas de polyfill ni de solution de remplacement.
Avant de recréer l'UI du navigateur (commandes de formulaire, barres de défilement, sélections, messages d'erreur, etc.), vérifiez d'abord les points suivants :
- L'UI du navigateur ne peut pas être suffisamment personnalisée pour répondre à vos besoins, même avec un CSS moderne.
- la personnalisation souhaitée est suffisamment importante pour justifier les compromis liés à la recréation de l'UI intégrée, notamment la perte de la sémantique accessible, de la gestion du clavier, de l'IME et de l'intégration des technologies d'assistance que l'UI native fournit sans frais.
Voici quelques exemples de personnalisations possibles :
- Utilisez
::selectionpour personnaliser les couleurs du texte mis en surbrillance. - À ÉVITER : Appliquer
user-select: noneau texte du contenu, car cela empêche le copier-coller, les outils de traduction et les gestes "lire à partir d'ici" des technologies d'assistance. Limitez-le à l'interface (poignées de déplacement, barres d'outils, libellés de boutons redondants). - Utilisez
accent-colorpour appliquer la couleur d'accentuation de la page à n'importe quelle UI générée par le navigateur. - Utilisez
color-schemepour que l'UI du navigateur s'adapte au mode clair/sombre. - Utilisez
scrollbar-colorpour personnaliser les couleurs de la barre de défilement etscrollbar-widthpour contrôler l'épaisseur de la barre de défilement. Veillez à ce que le curseur soit visiblement distinct de la piste (≥3:1) et ne définissez passcrollbar-width: nonesur les régions à défilement (utilisez-le uniquement lorsque le défilement est entièrement remplacé par une autre affordance). - Utilisez
:user-invalid/:user-validpour le style de validité, et non:invalid/:valid. Ils ne correspondent qu'après l'interaction de l'utilisateur avec le champ, ce qui évite de signaler par défaut les champs obligatoires vides comme des erreurs lors du chargement de page. Excluez les curseurs de plage lorsque vous ciblezinputde manière générale (par exemple,input:not(input[type="range"]):user-valid) afin que l'ajustement d'un curseur n'applique pas de bordures ni d'arrière-plans de validité de champ. - Les boutons et les champs de texte (y compris
<textarea>) peuvent généralement être stylisés comme des éléments normaux. - Utilisez
font-sizepour mettre à l'échelle et d'autres propriétés textuelles pour contrôler la typographie
Appliquer un style aux champs textuels (<input> et <textarea>)
Pour la plupart des styles (couleurs, bordures, arrière-plans, typographie, etc.), traitez ces éléments comme des conteneurs de texte normaux.
- Utilisez
:placeholder-shownet::placeholderpour styliser les espaces réservés de saisie. - Utilisez
field-sizing: contentpour adapter la taille des champs de texte au contenu. - Pour les éléments
<textarea>, utilisezresize: verticalpour désactiver le redimensionnement horizontal ouresize: nonepour désactiver tout redimensionnement.
Commandes à choix multiples (sélection, cases d'option, cases à cocher)
- Pour sélectionner une option parmi plusieurs présentées dans un menu déroulant : utilisez
<select>+appearance: base-select+::picker(select). Pour en savoir plus, consultez Style de sélection de marque. - Sélection d'une ou de plusieurs options parmi plusieurs options présentées en ligne sur la page : utilisez un
<input type=checkbox>ou un<input type=radio>dans un<label>pour chaque option. Style vialabel:has(:checked). - Stylisez les cases à cocher, les boutons radio et les boutons d'activation/désactivation via
appearance: none+ le contenu généré (::before/::after) ou les images de fond pour dessiner l'état coché.
<input>s non textuels (boutons, curseurs, entrées de fichiers, etc.)
- Entrées de fichier : utilisez
::file-selector-buttonpour appliquer un style au bouton. - N'utilisez pas
<input>avec untypedebutton,submitoureset. Utilisez plutôt<button>et appliquez-lui un style comme à un élément standard. - Curseurs : utilisez
appearance: none+ les pseudo-éléments de curseur (::-webkit-slider-thumb,::-moz-range-thumb, etc.) et les pseudo-éléments de piste (::-webkit-slider-runnable-track,::-moz-range-track, etc.) pour un contrôle plus précis.