Cette page a été traduite à partir de l'anglais par la communauté. Vous pouvez contribuer en rejoignant la communauté francophone sur MDN Web Docs.

View in English Always switch to English

::scroll-button()

Limited availability

This feature is not Baseline because it does not work in some of the most widely-used browsers.

Expérimental: Cette fonction est expérimentale
Puisque cette fonction est toujours en développement dans certains navigateurs, veuillez consulter le tableau de compatibilité pour les préfixes à utiliser selon les navigateurs.
Il convient de noter qu'une fonctionnalité expérimentale peut voir sa syntaxe ou son comportement modifié dans le futur en fonction des évolutions de la spécification.

Le pseudo-élément CSS ::scroll-button() représente un bouton permettant de contrôler le défilement d'un conteneur de défilement. Ces boutons sont générés sur les conteneurs de défilement lorsque leur propriété content n'est pas définie à none. La direction du défilement est déterminée par la valeur du paramètre.

Syntaxe

css
::scroll-button(<scroll-button-direction>) {
  /* ... */
}

Paramètres

<scroll-button-direction>

Une valeur représentant la direction du bouton de défilement à sélectionner. Les valeurs suivantes sont disponibles :

*

Sélectionne tous les boutons de défilement de l'élément d'origine, ce qui permet de leur appliquer des mises en évidence dans une seule règle.

down

Sélectionne le bouton qui fera défiler le contenu vers le bas.

left

Sélectionne le bouton qui fera défiler le contenu vers la gauche.

Sélectionne le bouton qui fera défiler le contenu vers la droite.

up

Sélectionne le bouton qui fera défiler le contenu vers le haut.

block-end

Sélectionne le bouton qui fera défiler le contenu vers la fin du bloc.

block-start

Sélectionne le bouton qui fera défiler le contenu vers le début du bloc.

inline-end

Sélectionne le bouton qui fera défiler le contenu vers la fin de l'axe en ligne.

inline-start

Sélectionne le bouton qui fera défiler le contenu vers le début de l'axe en ligne.

La spécification définit également deux autres valeurs — next et prev — mais elles ne sont actuellement prises en charge par aucun navigateur.

Description

Les pseudo-éléments ::scroll-button() sont générés à l'intérieur d'un conteneur de défilement uniquement lorsque leurs propriétés content sont définies sur une valeur autre que none. Ils sont générés comme des éléments frères des enfants DOM du conteneur de défilement, immédiatement avant ceux-ci et avant tout ::scroll-marker-group généré sur le conteneur.

Vous pouvez générer jusqu'à quatre boutons de défilement par conteneur, qui feront défiler le contenu vers le début et la fin des axes de bloc et en ligne. L'argument du sélecteur précise la direction de défilement sélectionnée. Vous pouvez aussi utiliser la valeur * pour cibler tous les pseudo-éléments ::scroll-button() et leur appliquer des mises en évidence dans une seule règle.

Les boutons générés se comportent comme de véritables éléments <button>, y compris leurs styles par défaut spécifiques au navigateur. Ils sont focalisables, accessibles et peuvent être activés comme des boutons classiques. Lorsqu'un bouton de défilement est activé, le contenu du conteneur est défilé dans la direction spécifiée d'une « page », soit environ la dimension du conteneur, de manière similaire à la pression des touches PgUp et PgDn.

Il est recommandé de configurer le verrouillage du défilement CSS sur le conteneur de défilement et de définir chaque élément de contenu que vous souhaitez défiler comme une cible d'ancrage. Ainsi, l'activation d'un bouton de défilement fera défiler le contenu jusqu'à la cible d'ancrage située à une « page » de distance. Bien que les boutons de défilement fonctionnent sans verrouillage du défilement, l'effet obtenu risque de ne pas être optimal.

Lorsqu'il n'est pas possible de défiler davantage dans une direction donnée, le bouton correspondant est automatiquement désactivé, sinon il est activé. Vous pouvez mettre en évidence les boutons de défilement dans leurs états activé et désactivé en utilisant les pseudo-classes :enabled et :disabled.

Exemples

Voir Créer des carrousels en CSS pour d'autres exemples.

Créer des boutons de défilement

Dans cet exemple, nous montrons comment créer des boutons de défilement sur un carrousel en CSS.

HTML

Nous avons une liste <ul> HTML de base avec plusieurs éléments <li>.

html
<ul>
  <li>Élément 1</li>
  <li>Élément 2</li>
  <li>Élément 3</li>
  <li>Élément 4</li>
  <li>Élément 5</li>
  <li>Élément 6</li>
  <li>Élément 7</li>
  <li>Élément 8</li>
</ul>

CSS

Mettre en évidence le carrousel

Nous transformons notre <ul> en carrousel en définissant display sur flex, créant une seule ligne non enroulée d'éléments <li>. La propriété overflow-x est définie sur auto, ce qui signifie que si les éléments débordent de leur conteneur sur l'axe x, le contenu défile horizontalement. Nous convertissons ensuite le <ul> en conteneur d'ancrage au défilement, garantissant que les éléments s'alignent toujours lorsqu'on fait défiler le conteneur, grâce à une valeur scroll-snap-type de mandatory.

css
ul {
  display: flex;
  gap: 4vw;
  padding-left: 0;
  overflow-x: auto;
  overscroll-behavior-x: contain;
  scroll-snap-type: x mandatory;
}

Ensuite, nous mettons en évidence les éléments <li>, en utilisant la propriété flex pour les rendre égaux à 100 % de la largeur du conteneur. La valeur scroll-snap-align start permet d'aligner le côté gauche de l'élément visible le plus à gauche avec le bord gauche du conteneur.

css
li {
  list-style-type: none;
  background-color: #eeeeee;
  flex: 0 0 100%;
  height: 100px;
  padding-top: 20px;
  scroll-snap-align: start;
  text-align: center;
}
Créer les boutons de défilement

Tout d'abord, tous les boutons de défilement sont ciblés avec des styles rudimentaires, ainsi qu'avec des mises en évidence selon différents états. Il est important de définir des styles :focus pour les utilisateur·ice·s utilisant un clavier. De plus, comme les boutons de défilement sont automatiquement mis en état disabled lorsqu'il n'est plus possible de défiler dans une direction, nous utilisons la pseudo-classe :disabled pour cibler cet état.

css
ul::scroll-button(*) {
  border: 0;
  font-size: 2rem;
  background: none;
  color: black;
  opacity: 0.7;
  cursor: pointer;
}

ul::scroll-button(*):hover,
ul::scroll-button(*):focus {
  opacity: 1;
}

ul::scroll-button(*):active {
  translate: 1px 1px;
}

ul::scroll-button(*):disabled {
  opacity: 0.2;
  cursor: unset;
}

Note : Nous définissons aussi une valeur cursor pointer sur les boutons de défilement afin de rendre plus évident qu'ils sont interactifs (une amélioration pour l'UX générale et l'accessibilité cognitive), puis nous la supprimons lorsque les boutons sont en état :disabled.

Ensuite, une icône adaptée est définie sur les boutons gauche et droit via la propriété content, ce qui déclenche également la génération des boutons :

css
ul::scroll-button(left) {
  content: "◄";
}

ul::scroll-button(right) {
  content: "►";
}

Il n'est pas nécessaire de définir de texte alternatif pour les icônes de content, car le navigateur fournit automatiquement des noms accessibles appropriés.

Résultat

Notez que les boutons de défilement apparaissent en bas à gauche du carrousel. Essayez de les activer pour voir comment le contenu défile.

Positionner les boutons de défilement

L'exemple précédent fonctionne, mais les boutons ne sont pas idéalement placés. Dans cette section, nous ajoutons du CSS pour les positionner en utilisant le positionnement par ancrage.

CSS

Tout d'abord, une référence anchor-name est définie sur le <ul> pour l'identifier comme ancre nommée. Ensuite, chaque bouton de défilement a sa propriété position définie à absolute et sa propriété position-anchor définie sur le anchor-name de la liste, afin de les associer.

css
ul {
  anchor-name: --mon-carousel;
}

ul::scroll-button(*) {
  position: absolute;
  position-anchor: --mon-carousel;
}

Pour positionner réellement chaque bouton de défilement, nous commençons par définir une valeur align-self anchor-center sur chacun, afin de les centrer verticalement sur le carrousel :

css
ul::scroll-button(*) {
  align-self: anchor-center;
}

Nous définissons ensuite des valeurs sur leurs propriétés d'insertion pour gérer le positionnement horizontal. Nous utilisons les fonctions anchor() pour positionner les côtés des boutons par rapport aux côtés du carrousel. Dans chaque cas, la fonction calc() est utilisée pour ajouter un espace entre le bord du bouton et celui du carrousel. Par exemple, le bord droit du bouton gauche est placé 45 pixels à droite du bord gauche du carrousel.

css
ul::scroll-button(left) {
  right: calc(anchor(left) - 45px);
}

ul::scroll-button(right) {
  left: calc(anchor(right) - 45px);
}

Résultat

Spécifications

Specification
CSS Overflow Module Level 5
# scroll-buttons

Compatibilité des navigateurs

Voir aussi