Style de barre de défilement

Utilisez les propriétés scrollbar-width et scrollbar-color pour appliquer un style aux 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é standardisée par le groupe de travail CSS.

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

Navigateurs pris en charge

  • 121
  • 121
  • 64
  • x

Source

Barres de défilement 101

Anatomie d'une barre de défilement

Une barre de défilement est composée, au minimum, d'une piste et d'un curseur. La piste est la zone dans laquelle le pouce peut bouger. La piste représente toute la distance de défilement. Le curseur représente la position actuelle dans la zone déroulante. Lorsque vous faites défiler l'écran, il se déplace sur la piste. Le curseur est aussi souvent déplaçable.

Les barres de défilement peuvent toutefois comporter plus de parties que le curseur et la piste. Par exemple, une barre de défilement peut comporter un ou plusieurs boutons permettant d'augmenter ou de diminuer le décalage de défilement. Les parties qui constituent une barre de défilement sont déterminées par le système d'exploitation sous-jacent.

Illustration des parties qui constituent une barre de défilement.
Illustration des parties qui constituent une barre de défilement. L'illustration de gauche représente une barre de défilement minimale avec seulement une piste et un pouce. Celui de droite comporte également des boutons.

Barres de défilement classique et superposée

Avant d'apprendre à appliquer un style aux barres de défilement, il est important de comprendre la différence entre deux types de barres de défilement.

Barres de défilement en superposition

Les barres de défilement des superpositions sont des barres de défilement flottantes affichées au-dessus du contenu qui se trouve en dessous. Elles ne s'affichent pas par défaut, mais uniquement lorsque vous faites défiler activement la page. Le contenu en dessous est souvent semi-transparent, mais le système d'exploitation en décide autrement. Lorsque vous interagissez avec eux, leur taille peut également varier.

Illustration d'un navigateur avec une barre de défilement en superposition.
Illustration d'un navigateur avec une barre de défilement en superposition. La barre de défilement se superpose au 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 marge de la barre de défilement correspond à l'espace entre le bord de la bordure intérieure et le bord de la marge intérieure extérieure. Ces barres de défilement sont généralement opaques (non transparentes) et suppriment de l'espace par rapport au 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 positionné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 en superposition sont utilisées.

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

Attribuer des couleurs 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 curseur, et la seconde la couleur à utiliser pour la piste.

.scroller {
  scrollbar-color: hotpink blue;
}

Lorsque vous utilisez une barre de défilement en superposition, la couleur de la piste n'a aucun effet par défaut. Toutefois, si vous passez la souris sur la barre de défilement, la piste s'affiche.

Démonstration: Appliquer un style aux barres de défilement: scrollbar-color

Pour utiliser le rendu par défaut fourni par le système d'exploitation, définissez la valeur 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 fonctionnalité de défilement.

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

  • auto: largeur de la barre de défilement par défaut 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 la barre de défilement par défaut de la plate-forme.
  • none: masque effectivement la barre de défilement. Toutefois, il est toujours possible de faire défiler l'élément.

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

.scroller {
  scrollbar-width: thin;
}

Lorsque vous utilisez une barre de défilement en superposition, le curseur ne s'affiche que lorsque vous faites défiler activement la zone à faire défiler.

Démonstration: Appliquer un style aux barres de défilement: scrollbar-width

Compatibilité avec les anciennes versions de navigateur

Pour prendre en charge les versions de navigateur qui ne sont pas compatibles avec scrollbar-color et scrollbar-width, vous pouvez utiliser à la fois 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 des barres de défilement à l'aide de scrollbar-* avec ::-webkit-scrollbar-* en remplacement

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

Pour garder l'illusion, vous pouvez choisir de ne changer que les couleurs lorsque vous passez la souris sur le conteneur de défilement.

.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 des barres de défilement à l'aide de scrollbar-* avec ::-webkit-scrollbar-* en appliquant uniquement les couleurs ::-webkit-scrollbar-* au passage de la souris