Carrousels met CSS

Gepubliceerd: 20 maart 2025

Vanaf Chrome 135 kunt u gebruikmaken van functies uit de CSS Overflow 5-specificatie die zijn ontworpen om scroll- en carrouselervaringen te creëren.

Dit bericht geeft een overzicht van de vele verschillende scroll- en carrouselervaringen die met deze nieuwe functies en zonder JavaScript tot stand zijn gekomen. Bekijk de volgende video en wees enthousiast over wat er nu mogelijk is.

In de video wordt een samenspel getoond van scrollknoppen, scrollmarkeringen, scrollgestuurde animatie, scroll-state() query's, :has(), raster, anker en nog veel meer.

Nog indrukwekkender is het toegankelijkheidsverhaal.

De browser hanteert best practices voor carrousels, dankzij de samenwerking tussen de engineering- en toegankelijkheidsteams. Het zou heel moeilijk zijn om een ​​toegankelijkere carrousel te maken dan deze.

De elementen van een carrousel worden weergegeven in een toegankelijkheidsboomweergave, waarbij de knoppen en tabbladen duidelijk worden aangegeven om een ​​voorbeeld te geven van wat een schermlezer in de carrousel ziet.
Schermafbeelding van de toegankelijkheidsboom van de carrousel van Chrome DevTools — Demo

Maak kennis met ::scroll-button() ::scroll-marker() ()

Een carrousel is een scrollgebied met maximaal twee toegevoegde UI-functies: knoppen en markeringen.

In versie één van de CSS-carrouselfuncties worden de knoppen en markeringen gemaakt met CSS. De browser plaatst de elementen als neven, met de juiste rollen, in de juiste tabvolgorde en behoudt hun status. Dit maakt het ontwikkelen van een toegankelijke carrousel eenvoudiger.

  • Scrollknoppen
    Door de browser geleverde, stateful en interactieve scroll-ability <button> -elementen die helpen bij de toegang tot inhoud en het scrollen van 85% van een scrollgebied wanneer erop wordt gedrukt.

  • Scrollmarkeringen
    Door de browser geleverde, stateful navigatie <a> -elementen die helpen bij de toegang tot de inhoud van elk opgevraagd item in het scrollgebied.

In de rest van dit bericht leggen we uit hoe u met behulp van deze nieuwe functies een carrousel kunt bouwen.

Begin met een scroller

U kunt knoppen en markeringen toevoegen aan elk scrollgebied op uw site.

De volgende CSS creëert een basisscrollgebied dat in latere stappen gebruikt kan worden om knoppen en markeringen aan toe te voegen. Scroll snapping is niet vereist voor een carrousel, maar in dit voorbeeld wordt het wel gebruikt. Carrousels werken ook voor verticale scrollers en bidirectionele scrollers.

.carousel {
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  
  > li {
    scroll-snap-align: center;
  }
}
Er wordt een scrollgebied weergegeven zonder enige voorzieningen of aanwijzingen, behalve dat de inhoud is afgesneden.

Voeg scrollknoppen toe met ::scroll-button()

Afhankelijk van je besturingssysteem kunnen er al scrollknoppen rond je schuifbalken zitten. Ingebouwde schuifbalkknoppen hebben de neiging om een ​​scrollgebied te verschuiven, terwijl CSS-scrollknoppen 85% van het scrollgebied beslaan.

Browser Support

  • Chroom: 135.
  • Rand: 135.
  • Firefox: niet ondersteund.
  • Safari: niet ondersteund.

Source

Voor carrousels die slechts één item over de volledige breedte tegelijk weergeven met scroll-snappunten , lijkt dit op een item-voor-item-hoeveelheid. Voor lange lijsten met items waarvan er meer dan één tegelijk zichtbaar is, scrolt het bijna een volledige pagina.

Om scrollknoppen toe te voegen met CSS:

  1. Voeg ze toe zoals andere pseudo-elementen, met een selector: .carousel::scroll-button(right) voor een knop om naar rechts te scrollen.
  2. Geef content op met optionele toegankelijke alternatieve alt-tekst .

De browser creëert echte knoppen, met jouw content erin, als zusterknoppen van de scroller. Je kunt deze knoppen nu naar eigen wens indelen, stylen of anchor() gebruiken. De volgende CSS maakt er twee: één voor een scrollknop naar links en één voor een scrollknop naar rechts.

.carousel {
  

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

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

Voeg scrollmarkeringen toe met ::scroll-marker()

Net als het scrollbalk-duimelement kunnen CSS-scrollmarkeringen een indicatie geven van de grootte van de carrousel en tegelijkertijd de mogelijkheid bieden om snel naar het einde of begin te gaan. Een CSS-scrollmarkering verschilt van de schuifbalk omdat elke markering een link is die elk item in de scrollbalk kan vertegenwoordigen.

Browser Support

  • Chroom: 135.
  • Rand: 135.
  • Firefox: niet ondersteund.
  • Safari: niet ondersteund.

Source

Een voorbeeld van dit onderscheid: neem de seizoenen van een tv-serie. In plaats van een markering voor elk van de 10 afleveringen, maak je 2 markeringen die naar het begin van het hoofdstuk gaan.

Er wordt een horizontale lijst met tv-afleveringen weergegeven, beginnend bij Seizoen 2, Aflevering 1. Daarboven staan ​​twee lijsttitels, Seizoen 1 en Seizoen 2, elk met pijlen die ernaartoe wijzen om aan te geven dat dit de gegenereerde scrollmarkeringen zijn.

Merk op dat deze markers geen stippen zijn, maar de eigenschap content: "Season 1" van hun pseudo-element. Markers kunnen ook miniaturen zijn, die vaak worden gebruikt voor galerijcarrousels in e-commerce of op foto's gerichte websites.

Markeringen zijn vergelijkbaar met <a> -links op de pagina, maar hebben een aantal speciale kenmerken:

  1. Ze bevatten een :target-current -status voor wanneer de marker in beeld is of is vastgeklikt.
  2. Navigatie via toetsenbord is inbegrepen en functioneert als een focusgroep .
  3. Schermlezerfunctie is inbegrepen en de rapporten lijken op een tabblad.

Voeg markeringen toe aan zinvolle aandachtspunten in uw scroller met de volgende stappen:

  1. Definieer de plaatsing van de scroll-marker-group als before of after .
  2. Selecteer de aandachtspunten met een selector .carousel .point-of-interest::scroll-marker .
  3. Geef content op met optionele, toegankelijke alternatieve alt-tekst : cijfers, tekst, leeg of een afbeelding.

De browser maakt alle markeringen aan en plaatst ze in de markergroepcontainer. In dit voorbeeld wordt voor elke <li> een lege marker gemaakt, zodat er voor elk item een ​​markerpunt ontstaat.

.carousel {
  

  scroll-marker-group: after;
  
  > li::scroll-marker {
    content: ' ';
  }

  > li::scroll-marker:target-current {
    background: var(--accent);
  }
}
Demonstratie

Het element dat de markers bevat, heet ::scroll-marker-group en wordt aangemaakt als een sibling van de scroller, net als de scrollknoppen. Deze container kan naar wens worden gestyled en geplaatst.

Markeringen en knoppen tegelijk

Als je deze twee combineert, lijkt het op een draaimolen, maar dan met de volgende voordelen:

  • Werkt met JavaScript uitgeschakeld.
  • Geen hydratatie of lazy sizing (verminder CLS).
  • Klaar voor alle soorten scrollanimaties en triggers.
  • Toegankelijkheid is inbegrepen.
  • Geschikt voor aanraking, muis en toetsenbord.

Doe minder, bereik meer, sneller.

Demonstratie

Bronnen

In dit bericht worden deze functies meestal aangeduid als "carrousel", maar hun mogelijkheden en bruikbaarheid reiken veel verder dan alleen carrouselgebruik. Voor een volledig beeld van de mogelijkheden van deze nieuwe functies kunt u de Carrouselgalerij bekijken en andere componenten bekijken, zoals: scrollspy, tabbladen en dia's.

Voor visuele en interactieve leerlingen is de Carousel Configurator een goede optie.

Het biedt schakelaars, bijvoorbeeld voor scrollknoppen, en wanneer deze zijn ingeschakeld, verschijnen er direct knoppen in de carrousel, plus de bijbehorende CSS.

Een screenshot van de configuratorwebsite met een HTML-codefragment van een eenvoudige lijst. Onder de HTML bevinden zich vier schakelaars: scrollknoppen, puntnavigatie, automatische pagina's en inert. Onder de schakelaars bevindt zich een lijst met kaarten, klaar om elk schakelaaraanbod toe te voegen.
https://chrome.dev/carousel-configurator/

Het bevat ook voorbeelden van meer geavanceerde concepten die aan de carrousel grenzen:

Een showcase voor iedereen die nieuwsgierig is naar hoe ver je met deze functies kunt gaan, met antwoorden op vragen zoals "kan het X?". Elke demo is gebaseerd op een use case die je op internet kunt vinden. Elke demo laat zien hoe je deze knoppen en markers kunt orkestreren met scroll-gestuurde animatie , scroll-state()- query's en nog veel meer.

Leuk weetje: de hele site maakt geen gebruik van JavaScript.

Een screenshot van de landingspagina voor de carrouselgalerij. Bevat een welkomstheader, wat informatie over de site en een lijst met carrouselvoorbeelden als links.
https://chrome.dev/carousel/

De voorbeelden variëren van heerlijk eenvoudig tot fantastisch robuust en boordevol functies. Het bekijken van de galerij moet inspirerend en geruststellend zijn, en natuurlijk ook leesbaar voor de code. Zoek en inspecteer @layer utilities voor hulpprogramma's die je kunnen helpen bij het maken van carrousels.

Verder werk

We zijn er trots op hoe goed deze functies integreren met alle HTML en CSS. De toegankelijkheid van een CSS-carrousel is uitstekend. De prestaties van een CSS-carrousel zijn beter dan die van welke JavaScript-oplossing dan ook. De gebruikerservaring van een CSS-carrousel is natuurlijk, vloeiend en rijk. Er zijn echter mogelijkheden voor verbetering.

Breng je eigen elementen mee

Er wordt al gewerkt aan het toevoegen van je eigen componenten voor scrollknoppen en markeringen. Dit betekent dat je je eigen <a> -tags kunt leveren met rijke content, zoals pictogrammen. Je kunt ook je eigen meerlaagse knoppen gebruiken, gebouwd met Tailwind .

Cyclisch scrollen

Veel draaimolens draaien zichzelf om als ze aan het einde zijn, zoals een draaimolen op een kermis. Dit staat op onze radar en we zijn van plan er een platformoplossing voor te bieden.

We hopen dat u deze functie leuk vindt. We kijken ernaar uit dat alle webgebruikers met "JavaScript uitgeschakeld" nu een prettige scrollervaring krijgen en profiteren van alle CLS-besparingen die de beter getimede levenscyclus van een ingebouwde carrousel met zich meebrengt.

Minder werk voor u, geweldige gebruikerservaringen en betere prestaties.