Style de barre de défilement

Utilisez les propriétés scrollbar-width et scrollbar-color pour styliser les barres de défilement.

Introduction

Depuis la version 2 de Chrome, il est possible de styliser les barres de défilement avec les pseudo-éléments ::-webkit-scrollbar-*. Cette approche fonctionne bien dans Chrome et Safari, mais n'a jamais été normalisée par le groupe de travail CSS.

Les propriétés scrollbar-width et scrollbar-color, qui font partie de la spécification du module de style des barres de défilement CSS, niveau 1, ont été normalisées. Ces propriétés sont compatibles à partir de Chrome 121.

Browser Support

  • Chrome: 121.
  • Edge: 121.
  • Firefox: 64.
  • Safari: 26.2.

Source

Principes de base des barres de défilement

Anatomie d'une barre de défilement

Une barre de défilement se compose au minimum d'une piste et d'un curseur. La piste est la zone dans laquelle le curseur peut se déplacer. La piste représente la distance de défilement totale. Le pouce représente la position actuelle dans la région à faire défiler. Lorsque vous faites défiler l'écran, il se déplace dans la piste. Le pouce est souvent également déplaçable.

Cependant, les barres de défilement peuvent comporter d'autres éléments que le pouce et la piste. Par exemple, une barre de défilement peut comporter un ou plusieurs boutons permettant d'incrémenter ou de décrémenter le décalage de défilement. Les parties qui composent une barre de défilement sont déterminées par le système d'exploitation sous-jacent.

Illustration des éléments qui composent une barre de défilement.
Illustration des éléments qui composent une barre de défilement. L'illustration de gauche montre une barre de défilement minimale avec uniquement une piste et un curseur. Celle de droite comporte également des boutons.

Barres de défilement classiques et superposées

Avant de voir comment styliser les barres de défilement, il est important de comprendre la distinction entre deux types de barres de défilement.

Barres de défilement en superposition

Les barres de défilement superposées sont des barres de défilement flottantes affichées au-dessus du contenu sous-jacent. Ils ne s'affichent pas par défaut, mais uniquement lorsque vous faites défiler l'écran. Pour que le contenu situé en dessous reste visible, elles sont souvent semi-transparentes, mais c'est au système d'exploitation de décider. Leur taille peut également varier lorsque vous interagissez avec eux.

Illustration d'un navigateur avec une barre de défilement superposée.
Illustration d'un navigateur avec une barre de défilement en superposition. La barre de défilement recouvre le contenu et le curseur est partiellement transparent.

Barres de défilement classiques

Les barres de défilement classiques sont placées dans une gouttière de barre de défilement dédiée. La gouttière de la barre de défilement est l'espace entre le bord intérieur et le bord extérieur de la marge intérieure. Ces barres de défilement sont généralement opaques (non transparentes) et prennent de la place sur le contenu adjacent.

Illustration d'un navigateur avec une barre de défilement classique.
Illustration d'un navigateur avec une barre de défilement classique. La barre de défilement est placée à côté du contenu, dans sa propre zone dédiée. La largeur disponible du contenu est réduite par rapport à la largeur disponible lorsque des barres de défilement superposées sont utilisées.

Propriétés scrollbar-color et scrollbar-width

Donner une couleur aux barres de défilement avec scrollbar-color

La propriété scrollbar-color vous permet de modifier le jeu de couleurs des barres de défilement. La propriété accepte deux valeurs <color>. La première valeur <color> détermine la couleur du bouton et la seconde, celle de la piste.

.scroller {
  scrollbar-color: hotpink blue;
}

Lorsque vous utilisez une barre de défilement superposée, la couleur de la piste n'a aucun effet par défaut. Toutefois, la barre de défilement s'affiche lorsque vous pointez dessus.

Démonstration : Styliser les barres de défilement : scrollbar-color

Pour utiliser le rendu par défaut fourni par le système d'exploitation, définissez sa valeur sur auto.

Modifier la taille de la barre de défilement avec scrollbar-width

La propriété scrollbar-width vous permet de choisir une barre de défilement plus étroite, voire de la masquer complètement sans affecter la possibilité de défiler.

Les valeurs acceptées sont auto, thin et none.

  • auto : largeur par défaut de la barre de défilement fournie par la plate-forme.
  • thin : variante fine de la barre de défilement fournie par la plate-forme ou barre de défilement personnalisée plus fine que celle par défaut de la plate-forme.
  • none : masque efficacement la barre de défilement. L'élément reste toutefois défilable.

Il n'est pas possible d'utiliser un <length> tel que 16px comme valeur pour scrollbar-width.

.scroller {
  scrollbar-width: thin;
}

Lorsque vous utilisez une barre de défilement superposée, le pouce n'est dessiné que lorsque vous faites défiler activement la zone de défilement.

Démonstration : Styliser les barres de défilement : scrollbar-width

Compatibilité avec les anciennes versions de navigateur

Pour les versions de navigateur qui ne sont pas compatibles avec scrollbar-color et scrollbar-width, il est possible d'utiliser les nouvelles propriétés scrollbar-* et ::-webkit-scrollbar-*.

.scroller {
    --scrollbar-color-thumb: hotpink;
    --scrollbar-color-track: blue;
    --scrollbar-width: thin;
    --scrollbar-width-legacy: 10px;
}

/* Modern browsers with `scrollbar-*` support */
@supports (scrollbar-width: auto) {
    .scroller {
        scrollbar-color: var(--scrollbar-color-thumb) var(--scrollbar-color-track);
        scrollbar-width: var(--scrollbar-width);
    }
}

/* Legacy browsers with `::-webkit-scrollbar-*` support */
@supports selector(::-webkit-scrollbar) {
    .scroller::-webkit-scrollbar-thumb {
        background: var(--scrollbar-color-thumb);
    }
    .scroller::-webkit-scrollbar-track {
        background: var(--scrollbar-color-track);
    }
    .scroller::-webkit-scrollbar {
        max-width: var(--scrollbar-width-legacy);
        max-height: var(--scrollbar-width-legacy);
    }
}
Démonstration : Styliser les barres de défilement à l'aide de scrollbar-* avec un retour à ::-webkit-scrollbar-*

Notez que lorsque vous définissez le width ou le height de ::-webkit-scrollbar, une barre de défilement superposée est toujours affichée, ce qui la transforme en barre de défilement classique.

Pour conserver l'illusion, vous pouvez choisir de ne modifier les couleurs que lorsque vous pointez sur le sélecteur.

.scroller::-webkit-scrollbar-thumb {
    background: transparent;
}
.scroller::-webkit-scrollbar-track {
    background: transparent;
}
.scroller:hover::-webkit-scrollbar-thumb {
    background: var(--scrollbar-color-thumb);
}
.scroller:hover::-webkit-scrollbar-track {
    background: var(--scrollbar-color-track);
}

.scroller:hover {
    --fix: ; /* This custom property invalidates styles on hover, thereby enforcing a style recomputation. This is needed to work around a bug in Safari. */
}
Démonstration : styliser les barres de défilement à l'aide de scrollbar-* avec un retour à ::-webkit-scrollbar-*, en n'appliquant les couleurs ::-webkit-scrollbar-* qu'au survol