Ein „Slider“, also ein Haufen von Boxen nebeneinander, zwischen denen Sie navigieren können. Sie wissen, was ein Slider ist. Es gibt viele Funktionen, die Sie sich für einen Slider wünschen könnten. Nur als Beispiel: Sie möchten vielleicht, dass der Slider gewischt oder gescrollt werden kann. Oder Sie möchten das vielleicht *nicht* und der Slider soll nur auf Klick- oder Tipp-Buttons reagieren, die zu den Folien navigieren. Oder Sie möchten beides. Oder Sie möchten all das mit Autoplay kombinieren.
Ich sage einfach mal, dass Slider ein ausreichend kompliziertes UI-Element sind, für das **JavaScript** erforderlich ist. Flickity ist ein gutes Beispiel. Ich würde auch sagen, dass Sie mit HTML und CSS allein ziemlich weit kommen können, um einen gut aussehenden, funktionalen Slider zu erstellen. Diesen Weg zu beginnen, erleichtert das JavaScript und ist, traue ich mich zu sagen, ein gutes Beispiel für progressive Enhancement.
Betrachten wir zuerst die semantische Markup.
Ein Haufen von Boxen ist wahrscheinlich so einfach wie
<div class="slider">
<div class="slide" id="slide-1"></div>
<div class="slide" id="slide-2"></div>
<div class="slide" id="slide-3"></div>
<div class="slide" id="slide-4"></div>
<div class="slide" id="slide-5"></div>
</div>
Mit ein paar Zeilen CSS können wir sie nebeneinander anordnen und scrollen lassen.
.slider {
width: 300px;
height: 300px;
display: flex;
overflow-x: auto;
}
.slide {
width: 300px;
flex-shrink: 0;
height: 100%;
}

Können wir es auch reibungslos auf WebKit-basierten Mobilbrowsern wischen lassen.
.slider {
...
-webkit-overflow-scrolling: touch;
}

Wir können es noch besser machen!
Lassen Sie jede Folie mit Snap-Punkten einrasten.
Dies hat sich seit der ursprünglichen Veröffentlichung ein wenig geändert! Ich aktualisiere die untenstehenden Codeblöcke.
.slider {
...
/* CURRENT way. */
scroll-snap-type: x mandatory;
/* OLD WAY. Probably not worth including at all.
-webkit-scroll-snap-points-x: repeat(300px);
-ms-scroll-snap-points-x: repeat(300px);
scroll-snap-points-x: repeat(300px);
-webkit-scroll-snap-type: mandatory;
-ms-scroll-snap-type: mandatory;
scroll-snap-type: mandatory;
*/
}
.slides > div {
/* CURRENT way. */
scroll-snap-align: start;
}
Schauen Sie, wie viel schöner es jetzt ist

Sprunglinks
Ein Slider hat wahrscheinlich eine kleine Benutzeroberfläche, um zu einer bestimmten Folie zu springen. Lassen Sie uns das also auch semantisch tun, mit Ankerlinks, die zur richtigen Folie springen.
<div class="slide-wrap">
<a href="#slide-1">1</a>
<a href="#slide-2">2</a>
<a href="#slide-3">3</a>
<a href="#slide-4">4</a>
<a href="#slide-5">5</a>
<div class="slider">
<div class="slide" id="slide-1">1</div>
<div class="slide" id="slide-2">2</div>
<div class="slide" id="slide-3">3</div>
<div class="slide" id="slide-4">4</div>
<div class="slide" id="slide-5">5</div>
</div>
</div>
Ankerlinks, die tatsächlich als Link zu verwandten Inhalten fungieren, sind semantisch und zugänglich, also keine Probleme damit (fühlen Sie sich frei, mich zu korrigieren, wenn ich falsch liege).
Lassen Sie uns die Dinge ein wenig stylen… und wir haben ein paar Buttons, die ihre Aufgabe erfüllen.

Sowohl auf dem Desktop als auch auf dem Mobilgerät können wir immer noch sicherstellen, dass wir eine reibungslose Schiebeaktion erhalten!
.slides {
...
scroll-behavior: smooth;
}
Vielleicht würden wir die Buttons nur in Situationen anzeigen, in denen kein schönes, schnelles Wischen möglich ist?
Wenn der Browser scroll-snap-type unterstützt, bietet er ein schönes, schnelles Wischen. Wir könnten die Buttons einfach ausblenden, wenn wir wollten.
@supports (scroll-snap-type) {
.slider > a {
display: none;
}
}
Müssen wir der „aktiven“ Folie etwas Besonderes hinzufügen?
Dafür könnten wir :target verwenden. Wenn einer der Buttons zum Navigieren von Folien geklickt wird, ändert sich die URL zu diesem #Hash, und dann wird :target wirksam. Also.
.slides > div:target {
transform: scale(0.8);
}

Es gibt eine Möglichkeit, diesen Slider mit dem Checkbox-Hack zu erstellen und trotzdem „aktive Folien“-Dinge mit :checked zu machen, aber man könnte argumentieren, dass das etwas weniger semantisch und zugänglich ist.
Hier ist, wo wir bisher stehen.
Siehe den Pen
Real Simple Slider von Chris Coyier (@chriscoyier)
auf CodePen.
Hier ist, wo die Dinge ein wenig auseinanderfallen.
Die Verwendung von :target ist ein netter Trick, aber er funktioniert zum Beispiel nicht, wenn die Seite ohne Hash geladen wird. Oder wenn der Benutzer von sich aus scrollt oder wischt, ohne die Buttons zu benutzen. Ich glaube nicht, dass es hierfür eine reine HTML- und CSS-Lösung gibt, noch glaube ich, dass das ein völliges Versagen von HTML und CSS ist. Es ist einfach die Art von Ding, für das JavaScript da ist.
JavaScript kann herausfinden, was die aktive Folie ist. JavaScript kann die aktive Folie setzen. Es lohnt sich wahrscheinlich, sich die Intersection Observer API anzusehen.
Was sind weitere Einschränkungen?
Wir haben so ziemlich das Ende dessen erreicht, was mit reinem HTML und CSS allein möglich ist.
- Möchten Sie mit der Maus wischen können? Das ist kein Mausverhalten, also müssen Sie das alles mit DOM-Events machen. Jede Art von exotischem interaktivem Verhalten (z.B. Physik) erfordert JavaScript. Es gibt aber einen seltsamen Trick, um vertikales Scrollen für horizontales zu simulieren.
- Möchten Sie wissen, wann eine Folie geändert wird? Wie ein Callback? Das ist JavaScript-Gebiet.
- Benötigen Sie Autoplay? Sie könnten etwas Rudimentäres mit einer Checkbox,
:checkedund der Steuerung vonanimation-play-stateeiner@keyframes-Animation machen, aber es wird sich begrenzt und ruckelig anfühlen. - Möchten Sie, dass es unendlich in eine Richtung scrollt und sich bei Bedarf wiederholt? Das erfordert das Klonen und Bewegen von Elementen im DOM. Oder vielleicht eine schlimme Fehlverwendung von
<marquee>.
Damit belasse ich es. Mein Punkt ist nur, dass man viel tun kann, bevor man JavaScript braucht. Von dieser starken Basis aus zu beginnen, könnte ein guter Weg sein, der ein schönes Fallback bietet, unabhängig davon, was Sie darauf aufbauen.
Das ist ein großartiger Artikel! Leider brauchte ich ihn vor 3 Jahren. Slider sind ein großer Teil des mobilen Designs, oder zumindest können sie es sein, für mich. Ich liebe es, die Größe meiner Websites/Apps zu reduzieren, wo immer ich kann.
Ein weiterer interessanter Effekt, der in reinem CSS gemacht werden kann
Alle Folien in einem Mini-Mosaik anzeigen.
z.B.: http://xem.github.io/talks/boxmodel/index.html#slide0
(klicken Sie auf den unteren Button)
Ausgezeichnete Beispiele
FYI CSS Scroll Snap Points werden leider noch nicht in Chrome unterstützt,
https://bugs.chromium.org/p/chromium/issues/detail?id=497851
Sehen Sie, jetzt fühlen Sie sich ignorant, Chris! Ich hatte keine Ahnung, dass eine Reihe dieser CSS-Attribute existieren! :p
Schöne einfache Implementierung!
Eine Sache, die mich stört… Wenn man die Transition auf
.slides > diventfernt, ist die Positionierung der Folien bei Verwendung der Buttons falsch. Ich kann einfach nicht herausfinden, warum…Schauen Sie hier, die einzige Änderung ist das Auskommentieren der Transition-Zeile (:42).
Die anfängliche Positionierung scheint für mich in Ordnung zu sein. Alles, was mir einfällt, ist, dass Sie erwartet haben, dass sie sich automatisch so einstellt, dass sie das gesamte Div ausfüllt, was die Transition bewirkt hat – um die Folie *reibungslos* zum Ausfüllen des Divs zu bringen. Stattdessen springt sie, da keine Beschleunigung mehr beteiligt ist.
Das war ein toller Artikel! Er beweist einfach, wie mächtig und unterschätzt CSS heutzutage ist. Es schmerzt mich zu sehen, wie Entwickler bei einem Problem direkt zu JavaScript greifen. Ich wünschte, es gäbe mehr Artikel darüber, wie man einen CSS-Ansatz statt eines JavaScript-Ansatzes wählt.
Ich habe das Gefühl, dass ich einer der wenigen Webentwickler auf diesem Planeten bin, der JavaScript nicht mag. Es scheint eine Webseite immer irgendwie zu verlangsamen. Vielleicht liegt das daran, dass ich einen Hintergrund in der Spieleentwicklung habe, wo Performance alles ist.
Ich „schlage“ JavaScript nicht unbedingt, sondern weise darauf hin, dass es nicht immer verwendet werden sollte. Besonders heutzutage, wo mobile Webseiten bei viel JavaScript viel langsamer zu sein scheinen. Ich empfehle immer, zuerst eine Lösung in CSS zu finden und dann auf JavaScript zurückzugreifen, wenn es unbedingt notwendig ist.
Ich denke, das Problem ist, dass man in der Produktion nach der schnellsten Lösung sucht. Es ist viel einfacher, zu einer JavaScript-Bibliothek zu greifen, um etwas zu lösen, als eine CSS-Umgehung zu finden. Das heißt nicht, dass es richtig ist oder so sein sollte, aber in meinem Job hat die Produktion Priorität.
Ich bin Webdesigner im Iran (Bundesland Lorestan). Dieser Artikel ist sehr gut für mich
Danke sehr
Ich würde das einen Karussell nennen. Ein Slider ist ein Steuerelement, das man innerhalb einer Schiene zieht, um einen numerischen Wert einzustellen.
Hey, danke für den tollen Artikel!
Ich habe aber eine einfache Frage: Ich habe auf caniuse.com nachgeschaut, um die Unterstützung von Eigenschaften wie „scroll-behavior“ oder „scroll-snap“ zu sehen, und festgestellt, dass sie in Chrome noch nicht unterstützt werden.
Dennoch bin ich auf Chrome und sehe das erwartete Ergebnis in dem Codepen, das Sie gepostet haben. Bedeutet das, dass Codepen die Arbeit selbst erledigt, wenn Ihr Browser Kompatibilitätsprobleme hat? Danke
Schade, dass scroll-snap-points veraltet sind (weiß jemand warum übrigens?) und in Chrome nicht funktionieren.
Ausgezeichneter Artikel. Ich meine, ich bin sicher, dass es viele Situationen gibt, in denen die Verwendung dieses „begrenzten“ CSS-basierten Sliders entscheidend ist. Danke, Chris.
Hallo Chris,
Nur weil Sie gefragt haben
Ich glaube, dieser Ansatz entspricht der Konstruktion, die viele Entwickler für Tab-Panels verwenden, aber meiner Meinung nach ist dies völlig falsch, da dieser Navigationsmechanismus sich zuerst auf den Inhalt bezieht, wie in diesem alten Artikel von Nielsen erklärt.
Mit anderen Worten, Sprunglinks sind dazu gedacht, mit Inhalten verwendet zu werden, die langes Scrollen erfordern, um entdeckt zu werden. Meiner Meinung nach haben wir diese Konstruktion aus dem einzigen Grund übernommen (und verteidigt), dass sie einfach zu stylen ist.
Auf jeden Fall sollten „Sprunglinks“ in einer Liste gruppiert werden (sie sollten sich in Listenelementen befinden).
#petpeeve
Abgesehen von den Snap-Punkten, dem sanften Scrollen, der Touch-Unterstützung und :target, habe ich vor 7 Jahren angefangen, Slider nur mit HTML und CSS zu erstellen. Abgesehen von der Touch-Unterstützung (die nicht benötigt wurde, bevor Touchscreens Teil der persönlichen Computernutzung waren) und einigen schönen, aber für die Funktionalität nicht unbedingt notwendigen Optionen, ist diese Methode extrem rückwärtskompatibel. Selbst IE6 verhält sich mit dieser Art von nicht-JS-Slider-Karussell ziemlich gut.
Erstaunlicher Artikel. Vielen Dank. Habe viel daraus gelernt.
Ich habe eine Radio/nur-CSS-Option entwickelt, aber sie erfordert ein paar zusätzliche Markups, bei denen doppelte Labels für die Navigation der ersten und letzten Folie erstellt werden, um eine vollständige Schleife zu ermöglichen. Sie würde als nicht-schleifender Slider ohne ordnungsgemäße Markups gut funktionieren, wenn diese entscheidend sind.