Carrousels avec CSS

Publié le 20 mars 2025

À partir de Chrome 135, vous pouvez utiliser les fonctionnalités de la spécification CSS Overflow 5 conçues pour créer des expériences de défilement et de carrousel.

Cet article présente de nombreuses expériences de défilement et de carrousel créées à l'aide de ces nouvelles fonctionnalités, et sans JavaScript. Regardez la vidéo suivante et découvrez les possibilités qui s'offrent à vous.

La vidéo présente une harmonie de boutons de défilement, de repères de défilement, d'animations basées sur le défilement, de requêtes scroll-state(), de :has(), de grilles, d'ancrages et bien plus encore.

L'histoire de l'accessibilité est encore plus impressionnante.

Les bonnes pratiques concernant les carrousels sont gérées par le navigateur, grâce à la collaboration des équipes d'ingénierie et d'accessibilité. Il serait très difficile de créer un carrousel plus accessible que celui-ci.

Les éléments d'un carrousel sont affichés sous forme d'arborescence d'accessibilité, où les boutons et les éléments d'onglet sont clairement indiqués pour donner un aperçu de ce qu'un lecteur d'écran verra dans le carrousel.
Capture d'écran de l'arborescence d'accessibilité du carrousel des outils pour les développeurs Chrome (démo)

Rencontrez ::scroll-button() et ::scroll-marker()

Un carrousel est une zone de défilement avec jusqu'à deux affordances d'UI supplémentaires : des boutons et des repères.

Dans la première version des fonctionnalités de carrousel CSS, les boutons et les repères sont créés à partir de CSS. Le navigateur place les éléments en tant que frères et sœurs, avec les rôles appropriés, dans l'ordre des onglets approprié et conserve leur état. Cela facilite le développement d'un carrousel accessible.

  • Boutons de défilement
    Éléments <button> de défilement interactifs, avec état et fournis par le navigateur, qui facilitent l'accès au contenu et permettent de faire défiler 85% d'une zone de défilement lorsqu'ils sont enfoncés.

  • Repères de défilement
    Éléments <a> de navigation avec état fournis par le navigateur qui facilitent l'accès au contenu de tout élément demandé dans la zone de défilement.

Le reste de cet article explique comment créer un carrousel à l'aide de ces nouvelles fonctionnalités.

Commencer avec un scroller

Vous pouvez ajouter des boutons et des repères à n'importe quelle zone de défilement de votre site.

Le code CSS suivant crée une zone de défilement de base à utiliser dans les étapes ultérieures pour ajouter des boutons et des repères. Le forçage du défilement n'est pas obligatoire pour un carrousel, mais il est utilisé dans cet exemple. Les carrousels fonctionnent également avec les défilements verticaux et bidirectionnels.

.carousel {
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  
  > li {
    scroll-snap-align: center;
  }
}
Une zone de défilement affichée sans affordances ni indices, à l'exception du contenu tronqué.

Ajouter des boutons de défilement avec ::scroll-button()

Selon votre système d'exploitation, il est possible qu'il existe déjà des boutons de défilement autour des barres de défilement. Les boutons de barre de défilement intégrés ont tendance à pousser une zone de défilement, tandis que les boutons de défilement CSS occupent 85% de la zone de défilement.

Pour les carrousels qui n'affichent qu'un seul élément en pleine largeur à la fois avec des points d'ancrage de défilement, le montant sera calculé par article. Pour les longues listes d'éléments où plusieurs sont affichés à la fois, le défilement occupe presque une page entière.

Pour ajouter des boutons de défilement avec CSS:

  1. Ajoutez-les comme les autres pseudo-éléments, avec un sélecteur: .carousel::scroll-button(right) pour un bouton de défilement vers la droite.
  2. Spécifiez content avec un texte alternatif de remplacement accessible facultatif.

Le navigateur crée des boutons réels, avec votre contenu à l'intérieur, comme des frères et sœurs du défilement. Vous pouvez maintenant organiser ces boutons, leur appliquer un style ou les anchor() selon vos besoins. Le code CSS suivant en crée deux, l'un pour un bouton de défilement vers la gauche et l'autre pour un bouton de défilement vers la droite.

.carousel {
  

  &::scroll-button(left) {
    content: "⬅" / "Scroll Left";
  }
  
  &::scroll-button(right) {
    content: "⮕" / "Scroll Right";
  }

  &::scroll-button(*)::focus-visible {
    outline-offset: 5px;
  }
}
Démo

Ajouter des repères de défilement avec ::scroll-marker()

Comme l'élément de la barre de défilement, les repères de défilement CSS peuvent donner une indication sur la taille du carrousel, tout en offrant la possibilité de passer rapidement à la fin ou au début. Un repère de défilement CSS est différent de la barre de défilement, car chaque repère est un lien pouvant représenter n'importe quel élément de la barre de défilement.

Prenons l'exemple des saisons d'une série TV. Au lieu de créer un repère pour chacun des 10 épisodes, créez deux repères qui redirigent vers le début du chapitre.

Une liste horizontale d&#39;épisodes de série TV s&#39;affiche, à partir de l&#39;épisode 1 de la saison 2. Deux titres de liste figurent au-dessus : &quot;Saison 1&quot; et &quot;Saison 2&quot;, chacun avec des flèches qui leur sont associées pour indiquer qu&#39;il s&#39;agit des repères de défilement générés.

Notez que ces repères ne sont pas des points. Ils utilisent la propriété content: "Season 1" de leur pseudo-élément. Les repères peuvent également être des miniatures, couramment utilisées pour les carrousels de galeries sur les sites Web d'e-commerce ou axés sur la photo.

Les repères sont comme des liens <a> sur la page, mais présentent certaines fonctionnalités spéciales:

  1. Ils incluent un état :target-current lorsque le repère est visible ou accroché.
  2. La navigation au clavier est incluse et se comporte comme un groupe de focus.
  3. L'expérience avec les lecteurs d'écran est incluse, ainsi que les rapports tels qu'une liste d'onglets.

Pour ajouter des repères à des points d'intérêt importants dans votre défileur, procédez comme suit:

  1. Définissez l'emplacement de l'scroll-marker-group sur before ou after.
  2. Sélectionnez les points d'intérêt à l'aide d'un sélecteur .carousel .point-of-interest::scroll-marker.
  3. Spécifiez content avec un texte alternatif de substitution accessible facultatif (chiffres, texte, vide ou image).

Le navigateur crée tous les repères et les place dans le conteneur du groupe de repères. Cet exemple crée un repère vide pour chaque <li>, afin de créer un point de repère pour chaque élément.

.carousel {
  

  scroll-marker-group: after;
  
  > li::scroll-marker {
    content: ' ';
    
    &:target-current {
      background: var(--accent);
    }
  }
}
Démo

L'élément contenant des repères est appelé ::scroll-marker-group. Il est créé en tant que frère du dispositif de défilement, tout comme les boutons de défilement. Vous pouvez styliser et placer ce conteneur où vous le souhaitez.

Marqueurs et boutons en même temps

En combinant les deux, l'expérience ressemble à un carrousel, mais présente les avantages suivants:

  • Fonctionne avec JavaScript désactivé.
  • Aucune hydratation ni aucune mise à l'échelle paresseuse (réduction du CLS).
  • Compatible avec tous les types d'animations et de déclencheurs de défilement.
  • L'accessibilité est incluse.
  • Compatible avec l'écran tactile, la souris et le clavier.

Faites moins, touchez plus, plus vite.

Démo

Ressources

Dans cet article, nous utilisons principalement le terme "carrousel" pour désigner ces fonctionnalités, mais leurs fonctionnalités et leur utilité vont bien au-delà des cas d'utilisation du carrousel. Pour découvrir tout le potentiel de ces nouvelles fonctionnalités, essayez la galerie carrousel et découvrez d'autres composants, comme le scrollpy, les onglets et les diapositives.

Pour les apprenants visuels et interactifs, essayez le configurateur de carrousel.

Il propose des boutons d'activation/de désactivation, par exemple pour les boutons de défilement. Lorsque l'option est activée, les boutons et le CSS associé s'affichent immédiatement dans le carrousel.

Capture d&#39;écran du site Web du configurateur montrant un extrait de code HTML d&#39;une liste simple. Sous le code HTML se trouvent quatre boutons: boutons de défilement, navigation par points, pages automatiques et inertie. Sous les commutateurs se trouve une liste de fiches, prêtes à être ajoutées à l&#39;offre de commutateurs.
https://chrome.dev/carousel-configurator/

Il inclut également des exemples de concepts plus avancés associés aux carrousels:

Un espace de présentation pour les utilisateurs qui souhaitent savoir dans quelle mesure ils peuvent exploiter ces fonctionnalités, en répondant à des questions telles que "Est-ce que je peux faire X ?". Chaque démonstration est basée sur un cas d'utilisation trouvé sur Internet. Chaque démonstration montre comment orchestrer ces boutons et repères avec une animation basée sur le défilement, des requêtes scroll-state() et bien plus encore.

Fait amusant : l'ensemble du site est sans JavaScript.

Capture d&#39;écran de la page de destination de la galerie carrousel. Elle comporte un en-tête de bienvenue, des informations sur le site et une liste d&#39;exemples de carrousels sous forme de liens.
https://chrome.dev/carousel/

Les exemples vont du délicieusement simple au fantastiquement robuste et riche en fonctionnalités. La navigation dans la galerie doit être inspirante, rassurante et, bien entendu, permettre d'inspecter le code à utiliser. Recherchez et inspectez @layer utilities pour trouver des utilitaires qui peuvent vous aider à créer des carrousels.

Autres tâches

Nous sommes fiers de la facilité avec laquelle ces fonctionnalités s'intègrent à l'ensemble du code HTML et CSS. L'accessibilité d'un carrousel CSS est optimale. Les performances d'un carrousel CSS sont meilleures que celles de n'importe quelle solution JavaScript. L'expérience utilisateur d'un carrousel CSS est naturelle, fluide et riche. Toutefois, il existe des moyens pour améliorer vos performances.

Utiliser vos propres éléments

Nous travaillons déjà pour vous permettre d'ajouter vos propres composants pour les boutons de défilement et les repères. Vous pouvez donc fournir vos propres balises <a> contenant du contenu enrichi, comme des icônes. Vous pouvez également utiliser vos propres boutons multicouches créés avec Tailwind.

Défilement cyclique

De nombreux carrousels se remettent en place à la fin, comme un manège de fête foraine. Nous avons bien noté ce point et nous prévoyons de proposer une solution de plate-forme.

Nous espérons que vous apprécierez cette fonctionnalité. Nous sommes impatients de voir tous les utilisateurs Web dont JavaScript est désactivé profiter d'une expérience de défilement agréable et de toutes les réductions de CLS qui seront obtenues grâce au cycle de vie mieux synchronisé d'un carrousel intégré.

Moins de travail pour vous, une expérience utilisateur de qualité et de meilleures performances.