Das Design der Netflix-Browsing-Seite ist seit einigen Jahren ziemlich ähnlich geblieben. Eine Hauptkomponente ist der Vorschau-Slider, mit dem Benutzer durch Inhalte blättern und mit der Maus über Elemente fahren können, um eine Vorschau anzuzeigen.
Ein einzigartiges Merkmal der Benutzeroberfläche ist das Hover-Verhalten. Wenn sich eine Vorschau einer Show beim Hover erweitert, werden die Karten daneben nach außen geschoben, damit sie sich nicht überschneiden.
So wie das

Das können wir in CSS machen! Kein JavaScript. Keine Abhängigkeiten. Reines CSS. Aber bevor wir uns mit dem Code befassen, hier ist genau das, was wir tun wollen
- Die Karte, über die gehovert wird, sollte sich unter Beibehaltung ihres Seitenverhältnisses erweitern.
- Wenn eine Karte gehovert wird, sollten sich die anderen Karten nicht in der Größe ändern und nach außen bewegen, damit sie sich nicht überschneiden.
- Alle Karten sollten vertikal zentriert zueinander bleiben.
Klingt gut? Dann lassen Sie uns zum Code kommen.
HTML und flexible Elemente
Lassen Sie uns eine Reihe von Bildern einrichten, die die Videovorschauen von Netflix darstellen. Dazu gehören
- Ein übergeordnetes Elternelement mit dem Namen
.containermit mehreren untergeordneten Elementen mit dem Namen.item - Jedes
.item-Element, das aus einem Bild besteht, das in ein Anker-Tag eingeschlossen ist - Das
.containerin einen Flex-Container verwandeln, der die Elemente in einer Reihe ausrichtet - Das Flex-Verhalten für die
.item-Klasse festlegen, damit sie den gleichen Platz in der Reihe einnehmen
Erweiterung eines Elements beim Hover
Unser nächster Schritt ist es, ein Element beim Hover zu erweitern. Wir könnten dies tun, indem wir die width des Elements animieren, aber das würde den Fluss des Dokuments beeinträchtigen und dazu führen, dass die Geschwister des gehovertem Elements schrumpfen – außerdem ist das Animieren der width-Eigenschaft in manchen Fällen bekanntermaßen schlecht für die Leistung.
Um das Quetschen des Geschwisters des gehovertem Elements zu vermeiden, animieren wir stattdessen die transform-Eigenschaft – insbesondere ihre scale()-Funktion. Dies beeinträchtigt den Dokumentenfluss nicht auf die gleiche Weise wie width.
Geschwister nach außen bewegen
Die Geschwister eines gehovertem Elements vom gehovertem Element wegzubewegen ist der knifflige Teil des Ganzen. Eine CSS-Funktion, die uns zur Verfügung steht, ist der allgemeine Geschwister-Selektor. Dieser erlaubt uns, alle Geschwisterelemente auszuwählen, die sich *nach* dem gehovertem Element befinden.
Wir werden uns der translateX()-Funktion der transform-Eigenschaft bedienen, um die Dinge zu verschieben. Auch hier ist das Animieren von transform viel angenehmer als bei anderen Eigenschaften, die den Dokumentenfluss beeinflussen, wie z. B. Ränder und Abstände.
Da wir ein Element beim Hover auf 150 % skalieren, sollte die Translation auf 25 % gesetzt werden. Das ist die Hälfte des zusätzlichen Platzes, der vom gehovertem Element eingenommen wird.
.item:hover ~ .item {
transform: translateX(25%);
}
Das erledigt das Verschieben nach rechts, aber wie können wir die Elemente auf der *linken* Seite verschieben? Da der allgemeine Geschwister-Selektor nur für Geschwister gilt, die sich *nach* einem bestimmten Selektor befinden (kein Zurückgehen), benötigen wir einen anderen Ansatz.
Eine Möglichkeit besteht darin, eine zusätzliche Hover-Regel für den übergeordneten Container selbst hinzuzufügen. Hier ist der Plan
- Beim Hover über den übergeordneten Container alle darin enthaltenen Elemente nach links verschieben.
- Den allgemeinen Geschwister-Selektor verwenden, um die Elemente, die sich nach dem gehovertem Element befinden, nach rechts zu verschieben.
- Sehr spezifisch werden, damit ein gehovertes Element nicht wie die anderen Elemente verschoben wird.
Wir gehen davon aus, dass Ihr Dokument einen Linkslauf-Schreibmodus verwendet. Wenn Sie diesen Effekt in einem Rechtslauf-Kontext verwenden möchten, müssen Sie alle Elemente innerhalb des gehovertem äußeren Containers nach *rechts* verschieben und den allgemeinen Geschwister-Selektor verwenden, um alle ausgewählten Elemente nach *links* zu verschieben.
Demo!
Eine kleine Anmerkung: Diese endgültige Version verwendet die Pseudo-Klassen :focus und :focus-within zur Unterstützung der Tastaturnavigation. Das Netflix-Beispiel verwendet sie nicht, aber ich denke, das ist ein schöner Touch für die Zugänglichkeit.
Da haben wir es! Ja, wir hätten stattdessen JavaScript-Event-Listener anstelle von CSS-Hover-Regeln verwenden können, und das könnte möglicherweise besser für Wartbarkeit und Lesbarkeit sein. Aber es macht manchmal Spaß zu sehen, wie weit CSS uns bringen kann!
Ich denke, es wäre gut gewesen, etwas Inhalt in die einzelnen Elemente einzufügen (wie im Netflix-Beispiel), da dies ein viel nützlicherer Fall und schwieriger zu implementieren ist.
Zur Implementierung könnten Sie alle davon herunterskalieren und dann das gehovertem Element auf 1 skalieren, damit der Inhalt innerhalb jeder Karte seine ursprüngliche Größe behält.
Wenn die Elemente Inhalte haben, die jederzeit sichtbar sind, wird dies komplizierter..
Das erinnert mich daran
Ehrlich gesagt, wahrscheinlich ist das der Grund, warum Netflix Informationen erst anzeigt, wenn die Karte vollständig erweitert ist. Aber ein sehr guter Punkt. Ich würde das gerne mit etwas Inhalt ausprobieren und sehen, ob ich es zum Laufen bekomme.
(Entschuldigen Sie mein Englisch) Ich finde das sehr erstaunlich, aber wenn Sie genau hinschauen, haben Sie ein Problem mit dem ersten und letzten Bild, denn wenn sie gehovert werden, wird das Bild nicht vollständig angezeigt. Ich denke, Sie können das mit etwas CSS für das erste und letzte Kind verbessern. Ich hinterlasse mein CSS.
Aber nochmals vielen Dank, das war sehr hilfreich.
https://github.com/DvSemicolon/Nextflix-List
Hallo Chris,
Das ist wirklich cool.
Ich habe eine ähnliche Animation in einem meiner kleinen Projekte erstellt (https://github.com/souravbaranwal/superflix).
Ich würde mich sehr über Feedback freuen.
Live-Link: https://superflix.sourav.co/.
Mit freundlichen Grüßen,
Sourav
Das ist großartig – danke fürs Teilen!
Dies ist ein großartiges Beispiel dafür, warum man ein tiefes Wissen über CSS benötigt. Dies ist um viele Größenordnungen schneller zu implementieren als JavaScript. Gut durchdacht und geschrieben; ich komme hierher, um zu sehen, wie Leute über Designprobleme nachdenken, und dies ist ein wunderbares Beispiel.
So hilfreich. Vielen Dank! Meine Schneidet oben beim Zoomen ab, warum? https://codepen.io/PixelRelish/pen/eYpzxpw
Hallo Sheila – ich glaube, Ihr Problem hängt mit Überlauf zusammen. Wenn ich Ihre Überlaufeinstellungen für den .previewScroller-Container (sowohl x als auch y) durch ein einfaches 'overflow: visible' ersetze, dann erweitern sich die Bilder außerhalb des Containers. Sie müssen vielleicht noch weitere Anpassungen vornehmen, um mit dem scrollbaren Container zu arbeiten.
Sehr coole Implementierung übrigens!
Oh mein Gott: Eine so einfache Lösung! Vielen Dank, Chris – für die Hilfe und all die großartigen Artikel. Ich liebe CSS Tricks.
Schön. Mir sind jedoch zwei Dinge aufgefallen und ich frage mich, ob/wie sie behoben werden können
Beim Skalieren des Elements (aber nicht beim Verschieben der Geschwister) kommt es beim schnellen Überfahren eines benachbarten Geschwisters zu einem leichten „Glitch“, es kämpft darum, darüber gerendert zu werden. Kann das vielleicht mit z-index behoben werden?
Beim Skalieren und Verschieben, wenn Sie den Cursor schnell über die Elemente bewegen, bildet sich kurzzeitig ein Leerraum zwischen ihnen. Vielleicht muss die Übergangsdauer zwischen Translate und Scale auf eine bestimmte Weise angepasst werden?
Wie Sie vielleicht bemerkt haben, hat Netflix kürzlich (und ich benutze den Begriff locker) begonnen, eine Vorschau des Videos abzuspielen, wenn Sie mit der Maus darüber fahren. Ich frage nicht nach einer exakten Nachbildung, wie das gemacht wird, sondern frage mich nur, ob das mit reinem CSS/HTML5 machbar ist oder ob man dafür JavaScript benötigt?
Vielen Dank fürs Teilen!! Ich würde dem Übergang der .itm-Eigenschaft z-index 500ms hinzufügen, um das Überlappen zu vermeiden, wenn ein Bild den Hover verliert.
Danke für das Teilen dieser coolen Demo, Chris. Ich konnte dies verwenden und eine Slider-Animation hinzufügen, um beim Klicken mehr Elemente anzuzeigen. Vielen Dank für die Inspiration :)
Hallo! Das ist wirklich großartig. Danke fürs Teilen. Ich habe das tatsächlich ausprobiert und meine Bilder aus einem Ordner hinzugefügt, aber irgendwie funktioniert es nicht. Können Sie mir sagen, was die möglichen Gründe dafür sind, dass die Hover-Funktion nicht funktioniert? Danke.
In Chrome, wenn Sie schnell zwischen den Bildern wechseln und dann den Hover aufheben, können Sie diesen Bug sehen: https://imgur.com/a/QO6NdGq
Um ihn zu beheben, fügen Sie die Eigenschaft:
transform: scale(1);zu.item { }hinzu.Sollte so aussehen
.item {position: relative;
display: block;
flex: 1 1 0px;
transition: transform 500ms;
transform: scale(1);
}
Hallo! Ich bin neu in CSS… Ich wollte ein Netflix-Karussell haben. Ich benutze das Divi-Theme und das Divi-Blog-Karussell-Modul. Ich füge dieses CSS in die Anpassung ein, aber es funktioniert nicht. Sollte ich eine (einige) Klasse(n) zum Karussell hinzufügen? Vielen Dank!
activitesenergotherapie.com
Hallo! Der Trick ist großartig! Allerdings zeigt Netflix zusätzliche Informationen beim Hover an. Was wäre der beste Weg, um weitere Divs beim Hover hinzuzufügen?
Danke