Générateur de barre de défilement CSS

Suivant

Les barres de défilement personnalisées étaient autrefois un cauchemar de pseudo-éléments préfixés par le fournisseur. Aujourd’hui, scrollbar-color et scrollbar-width couvrent les cas courants dans tous les navigateurs modernes : largeur étroite ou normale et thème à deux couleurs (curseur et rail). Pour un contrôle au pixel près (marge intérieure du rail, rayon du curseur, états au survol), les anciens pseudo-éléments ::-webkit-scrollbar fonctionnent toujours dans Chrome et Safari. Ce générateur produit les deux versions et les combine correctement en cascade.

Comment styliser une barre de défilement

  1. 1

    Choisissez la largeur

    Auto (largeur par défaut de la plateforme), étroite (plus fine) ou une valeur en pixels précise via les règles webkit.

  2. 2

    Définissez les couleurs du curseur et du rail

    La propriété moderne `scrollbar-color` prend deux couleurs. Les règles webkit permettent des couleurs, rayons et états au survol distincts.

  3. 3

    Ajoutez un effet au survol (facultatif)

    Le curseur s'éclaircit au survol. Fonctionne via `::-webkit-scrollbar-thumb:hover`.

  4. 4

    Choisissez la portée

    Appliquez-le à `html` / `body` (toute la page) ou uniquement à un conteneur défilant précis.

  5. 5

    Copiez le CSS

    Règles modernes et webkit combinées : fonctionne dans tous les navigateurs modernes avec une dégradation élégante.

Propriétés standard modernes (2023 et après)

/* Applies to the element that scrolls */
html {
  scrollbar-width: thin;           /* auto | thin | none */
  scrollbar-color: #4f46e5 #e5e7eb; /* thumb track */
}

Compatibilité des navigateurs (2024) :

  • scrollbar-width : Chrome 121+, Safari 18.2+, Firefox 64+.
  • scrollbar-color : Chrome 121+, Safari 18.2+, Firefox 64+.
  • scrollbar-gutter: stable : Chrome 94+, Safari 14+, Firefox 97+. Réserve l’espace de la barre de défilement même lorsqu’elle n’est pas nécessaire, ce qui évite les sauts de mise en page.

Pseudo-éléments webkit (Chrome, Safari, ancien Edge)

::-webkit-scrollbar {
  width: 10px;
  height: 10px;
}
::-webkit-scrollbar-track {
  background: #e5e7eb;
  border-radius: 10px;
}
::-webkit-scrollbar-thumb {
  background: #4f46e5;
  border-radius: 10px;
}
::-webkit-scrollbar-thumb:hover {
  background: #3730a3;
}

Un contrôle plus fin. width définit la largeur de la barre de défilement verticale ; height définit la hauteur de la barre horizontale. Ajoutez les deux pour les conteneurs qui peuvent défiler dans les deux sens.

Combinez les deux approches en cascade

Indiquez d’abord les règles modernes, puis webkit comme amélioration pour les navigateurs qui interprètent les deux :

.scroll-area {
  scrollbar-width: thin;
  scrollbar-color: #4f46e5 #e5e7eb;
}
.scroll-area::-webkit-scrollbar       { width: 8px; }
.scroll-area::-webkit-scrollbar-track { background: #e5e7eb; }
.scroll-area::-webkit-scrollbar-thumb {
  background: #4f46e5;
  border-radius: 4px;
  border: 2px solid #e5e7eb;
}

Firefox ne respecte que les règles modernes scrollbar-*. Chrome et Safari respectent les règles webkit (qui remplacent les modernes, pour un comportement cohérent).

scrollbar-gutter empêche le décalage du contenu

Sans gouttière réservée, le contenu se recompose lorsqu’une barre de défilement apparaît (fréquent dans les listes dynamiques). Solution :

html { scrollbar-gutter: stable; }
/* or */
html { scrollbar-gutter: stable both-edges; }

L’emplacement de la barre de défilement est réservé, que le contenu défile ou non. both-edges ajoute une gouttière équivalente du côté opposé pour garder le contenu visuellement centré.

Masquer entièrement les barres de défilement

.no-scrollbar {
  scrollbar-width: none;           /* Firefox */
}
.no-scrollbar::-webkit-scrollbar { display: none; }  /* Chrome, Safari */

Attention : masquer la barre de défilement empêche les utilisateurs de voir que le contenu peut défiler. Ne le faites qu’avec un indicateur clair (flèches, points de page) ou lorsque le défilement est évident d’après le contexte (carrousels horizontaux, historiques de discussion).

Considérations mobiles

Sous iOS et Android, les barres de défilement n’apparaissent qu’un instant pendant le défilement. Votre CSS de barre personnalisée s’applique quand même, mais les utilisateurs ne la voient peut-être jamais plus d’une seconde. Concevez en conséquence : n’investissez pas trop dans des fioritures visuelles qui apparaissent rarement.

Accessibilité

  • Contraste : le curseur par rapport au rail doit atteindre 3:1 pour le contraste non textuel (WCAG 1.4.11).
  • Largeur : les barres de défilement fines peuvent être difficiles à attraper à la souris, surtout pour les utilisateurs ayant des difficultés motrices. La largeur normale est une valeur par défaut plus sûre.
  • Ne retirez jamais la barre de défilement dans les zones défilantes sans fournir un autre moyen de défilement. Les utilisateurs qui dépendent de la barre se retrouveront bloqués.

Questions fréquentes

Oui, avec les propriétés modernes scrollbar-width et scrollbar-color. Firefox ne prend pas en charge les pseudo-éléments webkit ; pour une apparence cohérente entre les navigateurs, utilisez donc d’abord les propriétés modernes et ajoutez les règles webkit en complément.

Parce que les barres de défilement par défaut se superposent au contenu et ne réservent aucun espace avant d’être nécessaires. Définissez scrollbar-gutter: stable sur l’élément défilant pour toujours réserver la gouttière et éviter la recomposition lorsque la barre apparaît ou disparaît.

Généralement oui, car la barre de défilement paraît déplacée et concurrence le contenu. Ajoutez des points de pagination ou des flèches visibles pour que les utilisateurs sachent toujours que le contenu défile. Respectez prefers-reduced-motion si vous utilisez l’accroche au défilement (scroll-snapping).

Elle le peut. Les barres très fines ou peu contrastées sont difficiles à utiliser pour les personnes ayant des difficultés motrices ou une basse vision. Gardez la barre d’au moins 8–10 px de large pour une prise confortable et maintenez un contraste de 3:1 entre le curseur et le rail.

Outils similaires