Das Web ist ein ziemlich vertikaler Ort. Sie lesen eine Website so, wie Sie eine physische Seite lesen: von links nach rechts, von oben nach unten. Aber manchmal möchten Sie sich von der Vertikalität lösen und etwas Verrücktes tun: eine horizontale Liste erstellen. Oder noch verrückter, eine horizontale Website!
Es wäre schön, wenn wir so etwas tun könnten
/* This isn't real */
div {
scroll-direction: horizontal;
}
Leider wird das nicht passieren. Es steht noch nicht einmal auf der Roadmap für CSS.
Das ist schade, denn in dem Unternehmen, für das ich arbeite, wäre das ziemlich nützlich. Wir machen ziemlich viele Web-Präsentationen. Präsentationen sind eine sehr horizontale Sache – normalerweise haben Folien ein Seitenverhältnis von 4:3 oder 16:9. Das bedeutet, wir haben immer einen Kampf zwischen der Horizontalität von Präsentationen und der Vertikalität von Webtechnologien. Und mit "wir" meine ich mich. Aber wenn es eines gibt, das ich mag, dann ist es eine Herausforderung.
Ein weiterer Anwendungsfall
Der spezifische Anwendungsfall, der mich zu dieser Idee führte, war, dass ein Kunde alle seine Produkte auf einer einzigen Folie zeigen wollte. Natürlich war der Produktkatalog viel zu groß, um ihn in einer einzigen Ansicht unterzubringen. Also beschlossen wir, sie in drei Kategorien aufzuteilen, die jeweils horizontal scrollbar waren. So waren die drei prominentesten Produkte jeder Kategorie sichtbar und weniger wichtige Produkte waren immer noch leicht zugänglich.
Eine Methode ohne JavaScript
Es gibt, keine Überraschung, zahlreiche Möglichkeiten, dies in JavaScript zu tun. Einige davon finden Sie auf dieser Website.
Ich war neugierig, ob es in reinem CSS möglich war. Die Lösung war schließlich ziemlich einfach
- Erstellen Sie einen Container mit Elementen
- Drehen Sie den Container um 90 Grad gegen den Uhrzeigersinn, sodass die _Unterseite_ nach _rechts_ zeigt
- Drehen Sie die Elemente wieder aufrecht
Schritt 1) Container einrichten
Erstellen Sie ein <div> und fügen Sie eine Reihe von Kindelementen hinzu.
In diesem Beispiel ist unser horizontal scrollender Container 300 Pixel breit, mit 8 Elementen von jeweils 100×100 Pixel. Dies sind willkürliche Größen; sie könnten alles sein.
<div class="horizontal-scroll-wrapper squares">
<div>item 1</div>
<div>item 2</div>
<div>item 3</div>
<div>item 4</div>
<div>item 5</div>
<div>item 6</div>
<div>item 7</div>
<div>item 8</div>
</div>
Die Höhe des Containers wird zur „Breite“ und umgekehrt. Also wird unten die „Breite“ unseres Containers 300 Pixel betragen
.horizontal-scroll-wrapper {
width: 100px;
height: 300px;
overflow-y: auto;
overflow-x: hidden;
}
Nun die Kinder
.horizontal-scroll-wrapper > div {
width: 100px;
height: 100px;
}
Schritt 2) Den Container drehen
Nun drehen wir den Container mit einer CSS-transform um -90 Grad. Und da haben Sie es: einen horizontalen Scroller.
.horizontal-scroll-wrapper {
...
transform: rotate(-90deg);
transform-origin: right top;
}
Es gibt nur ein kleines Problem: Unsere Kinder sind auch rotiert, und nun ist alles darin auf der Seite.
Schritt 3) Die Kinder wieder aufrecht drehen
Wie bekommen wir die Kinder wieder aufrecht? Drehen Sie sie mit einer anderen, entgegengesetzten CSS-transform zurück.
.horizontal-scroll-wrapper > div {
...
transform: rotate(90deg);
transform-origin: right top;
}
Schritt 4) Die Positionierung korrigieren
Es beginnt gut auszusehen, aber es gibt immer noch einige Probleme.
Durch das Drehen des Wrappers mit der oberen rechten Ecke als Ankerpunkt hat sich unsere linke Seite um die Breite des Containers verschoben. Wenn Sie das schwer verstehen können, legen Sie einfach Ihren Finger auf die obere rechte Ecke einer Seite und drehen Sie sie. Die Lösung: verschieben Sie sie mit translateY zurück.
Besser. Aber das erste Element fehlt immer noch, aufgrund desselben Phänomens, das auch bei den Elementen auftritt. Wir könnten dies beheben, indem wir dem ersten Kind einen oberen Rand in Höhe seiner Breite geben oder alle Elemente so verschieben, wie wir es mit dem Wrapper gemacht haben. Der einfachste Weg, den ich gefunden habe, ist jedoch, dem Wrapper einen oberen Innenabstand in Höhe der Elementbreite hinzuzufügen, um eine Art Puffer für die Elemente zu schaffen.
.horizontal-scroll-wrapper {
...
transform:rotate(-90deg) translateY(-100px);
...
}
Demo
Siehe den Pen Horizontal scroll (simple example) von Pieter Biesemans (@pieter-biesemans) auf CodePen.
Hier ist ein weiterer, bei dem Sie nicht quadratische Kinder sehen können
Siehe den Pen Horizontal scroll (extensive example) von Pieter Biesemans (@pieter-biesemans) auf CodePen.
Kompatibilität
Ich habe auf den mir sofort verfügbaren Geräten getestet.
| Gerät | Betriebssystem | Browser | Funktioniert? |
|---|---|---|---|
| Desktop | Win10 | Chrome 54 | Y |
| Desktop | Win10 | Firefox 47 | Y (mit Scrollbalken) |
| Desktop | Win10 | IE11 | Y (mit Scrollbalken) |
| Desktop | Win10 | Opera 41 | Y |
| Desktop | Win10 | Vivaldi 1.4 | Y |
| Laptop (Touchscreen) | Win10 | Chrome 54 | N |
| Samsung Galaxy S3 | Android 4.3 | Chrome Mobile 52 | Y |
| Samsung Galaxy S6 | Android 5.0 | Chrome Mobile 52 | Y |
| Nexus 6P | Android 6 | Chrome Mobile 52 | Y |
| iPad2 | iOS | Chrome Mobile 52 | N |
| iPad2 | iOS | Safari Mobile 9.0 | N |
| iPad Air 2 | iOS | Safari Mobile 9.0 | N |
Desktop
Da das Styling von Scrollbalken derzeit nur von WebKit/Blink unterstützt wird, zeigen Firefox und IE immer noch die hässlichen grauen an. Sie könnten dies mit JavaScript erkennen und sie vollständig ausblenden, aber das ist Stoff für ein anderes Tutorial.
Die Verwendung des Mausrads funktioniert auf Desktops hervorragend. Mein Laptop war jedoch eine andere Sache. **Sowohl der Touchscreen als auch das Touchpad verhielten sich, als wäre das div nicht gedreht.**
Mobil
Ich war ziemlich überrascht festzustellen, dass Android tatsächlich verstand, dass der Container gedreht worden war, und Sie durch Wischen nach links und rechts seitwärts scrollen konnten.
**iOS hingegen spielte nicht gut mit.** Es verhielt sich so, als wäre der Container nicht gedreht worden, sodass Sie nach oben und unten wischen müssen, um seitwärts zu scrollen, was natürlich kontraintuitiv ist. Außerdem verschiebt das Wischen nach links und rechts die Elemente in ihrem Wrapper nach oben und unten, was unerwartet und seltsam ist. Das Setzen des Überlaufs auf „hidden“ lindert dieses Problem nicht.
Fazit
Laut Can I Use werden CSS-Transforms derzeit von über 93% der Nutzer unterstützt (zum Zeitpunkt des Schreibens, November 2016), also gibt es dort kein Problem.
Seien Sie jedoch vorsichtig bei der Verwendung in der Produktion. Ich habe dies auf einigen Geräten getestet, aber nicht sehr umfassend oder tiefgehend.
Das größte Problem sind Touch-Eingaben, bei denen Sie nach oben und unten wischen müssen, um nach links und rechts zu gelangen. Eine mögliche Lösung wäre, eine Nachricht auf Ihrer Website anzuzeigen, die dies erklärt, aber Sie wären darauf angewiesen, dass die Leute Ihre Nachricht lesen. Und selbst dann wäre es immer noch kontraintuitiv. Eine weitere mögliche Lösung wäre, die Touch-Eingabe mit JavaScript auf diesen Geräten abzufangen, aber dann wäre es besser, alles in JavaScript zu erledigen und diesen CSS-Hack komplett aufzugeben.
Das ist eine Technik, von der ich noch nie gehört habe. Aber selbst nachdem ich den Artikel zweimal gelesen habe, bin ich mir nicht ganz sicher, welches spezifische Problem Sie damit lösen wollen. Warum nicht einfach echtes natives horizontales Scrollen verwenden, zum Beispiel indem Sie Zeilenumbrüche mit
white-space: nowrapverhindern undinline-block-Elemente verwenden? Das ist viel, viel einfacher in Bezug auf die notwendigen Layout-Tricks und funktioniert auf jedem Gerät unabhängig vom Eingabetyp.Machen Sie all diese Mühen nur, um Scrollräder horizontal scrollen zu lassen?
Ich wollte gerade eine ähnliche Antwort schreiben. Ich würde bei
overflow-x: scrollbleiben, da die Demos etwas seltsam erscheinen, um nach unten scrollen zu müssen, um nach rechts zu gelangen.Interessant, eine andere Art, ein Problem zu lösen :)
Der ganze Punkt ist, dass das native Scrollen seitwärts statt auf und ab gehen soll. Es ist seltsam. Es ist ein Trick.
Ja, genau das. Und weil ich es kann.
Also funktioniert es nicht auf iOS, verhält sich auf Android wie
overflow-x: scrollund lässt auf (einigen) Desktops vertikal scrollen, um horizontal zu scrollen, weil, na ja, warum nicht, es ist ein Trick!Fair genug. Ich neige dazu zu denken, dass das horizontale Scrollen mit dem vertikalen Scrollrad genauso schlecht ist wie das Touchscreen-Problem, das Sie in Ihrem Artikel erwähnt haben (vertikales Wischen scrollt nach links und rechts), denn wirklich, beide haben das gleiche Problem, die Erwartungen der Benutzer zu untergraben.
Als Benutzer können Sie auf einem Nicht-Touch-Gerät horizontal scrollen, indem Sie die Umschalttaste gedrückt halten, während Sie das Scrollrad drehen. Natürlich wissen fast keine Benutzer davon, also würde ich ihnen als Entwickler helfen, indem ich Navigationsschaltflächen und eine Scrollleiste bereitstelle, anstatt das CSS-Layout auf schreckliche Weise zu verändern und das native Scrollen für Leute auf Touch-Geräten zu ruinieren. ;)
Auf jeden Fall verstehe ich es – es ist ein Hack.
Oder wir könnten einfach Flexbox ohne Umbruch verwenden. Das habe ich kürzlich für http://xoroshe.pl im Hauptbanner gemacht.
Oh, ich habe den Sinn dahinter nicht verstanden, Entschuldigung.
Sie können weit gehen und auch CSS-Multicol verwenden (sodass wir kein calc benötigen und die Breite nicht kennen müssen)
https://escss.blogspot.com/2015/03/mouse-wheel-down-scroll-right.html
Das ist ein CSS-Trick, den ich nicht befürworten kann. Die Nachteile sind zu gravierend. Clevere Idee, trotzdem. Danke, Pieter.
Hey, kein Problem. Ich habe nie gesagt, dass Sie es sowieso benutzen müssen. Ich würde das auch nicht in der Produktion verwenden.
Es scheint in Chrome Desktop mit Stift-/Tabletteingabe (die mein Hauptzeigegerät ist) nicht gut zu funktionieren. Es erzwingt die vertikale Scrollbewegung, während beim Standard-Browser-Scrollen das horizontale Scrollen perfekt funktioniert.
In der Tat. Es verhält sich auf meinem Touchscreen-Laptop ähnlich. Deshalb würde ich das nicht in der Produktion verwenden. Aber hey, der Punkt der Übung war nur zu sehen, ob ich es hacken könnte :)
Zugänglichkeit ist auch ein Problem. Sie benötigen wahrscheinlich einen anderen Mechanismus zum Scrollen nach links/rechts für Leute, die keine Maus (oder auch kein Mausrad) benutzen können.
Aber es ist ein großartiges Beispiel für das Denken außerhalb der Box. Ich selbst habe eine Website erstellt, die einen horizontal scrollenden Bereich verwendet; und ich habe das mit CSS-Spalten gemacht. Das ist vielleicht einfacher.
Barrierefreiheit ist definitiv ein Problem, die meisten Eingabegeräte werden damit Probleme haben. Ich war ziemlich überrascht, dass Android es nicht tat.
Ich würde dies nicht als einfacher als die Verwendung von Spalten bezeichnen, im Gegenteil. Es ist mehr eine Übung, um zu sehen, ob ich es könnte, als ob ich es sollte.
Ich weiß nicht, wie es Ihnen geht, aber bei jedem Artikel, den ich lese, lese ich den Einleitungssatz, um den Kern des Artikels zu erfassen, und dieser Artikel ist SEHR klar in Bezug auf den Zweck des Artikels. Der Zweck ist, dies als Startpaket für Präsentationen zum Anzeigen von Folien zu verwenden.
Ich finde es cool, wie Pieter die Lösung nur mit CSS entwickelt hat, da es Umgebungen gibt, in denen selbst JavaScript nicht einmal erlaubt ist.
Toll, Pieter, und danke fürs Teilen.
Gern geschehen, lcr. Ich hoffe, es hat Ihnen gefallen und Sie dazu inspiriert, mit dem Experimentieren und Hacken zu wagen.
Warum nicht einfach
overflow-x: auto?Mausrad wird nicht unterstützt.
Hallo Jens, der ganze Punkt war, das Scrollrad dazu zu bringen, etwas zu tun, was es normalerweise nicht tut: nach rechts scrollen. Es ist ein CSS-Trick oder Hack, wenn Sie so wollen, den Sie normalerweise nur mit Javascript erreichen können.
Yep,
Ich habe die gleiche Übung auf einem Codepen vor ~6 Monaten gemacht, und die wenigen getesteten Browser führten mich zu den gleichen Schlussfolgerungen: zu unterschiedliche Verhaltensweisen, um den Browsern in diesem speziellen Fall zu vertrauen.
Hallo Mehdi, ich wusste, dass ich nicht der Erste sein konnte, der an so etwas Einfaches gedacht hat. Danke fürs Teilen.
Hallo
Ich hatte genau dieses Problem vor ein paar Tagen und habe es mit ein bisschen hacky Nutzung von white-space:nowrap; geschafft.
Was ich bekam: https://jsfiddle.net/mzvaan/590grzuy/
Hallo Matej, das mache ich normalerweise auch. Der ganze Sinn dieser Übung war es, einen Sidescroller zu erstellen, der mit dem Mausrad gescrollt werden kann. Aber es ist hacky und verhält sich auf Touch-Geräten und ähnlichem nicht sehr gut, sodass wir vorerst bei
white-space: nowrapbleiben.Hm, das haben sie im Top-Menü von medium.com viel einfacher gemacht. Sie verwenden white-space: nowrap, overflow-x: auto; für das übergeordnete Element und letter-spacing:0; für die untergeordneten Elemente, dann wenden sie den richtigen Buchstabenabstand innerhalb der untergeordneten Elemente an.
Hallo Chris, das mache ich normalerweise auch in der Produktion. Der ganze Sinn dieser Übung war es, einen Sidescroller zu erstellen, der mit dem Mausrad gescrollt werden kann. Aber es ist hacky und verhält sich auf Touch-Geräten und ähnlichem nicht sehr gut, sodass wir vorerst bei white-space: nowrap bleiben.
Hier habe ich eine einfache Demo erstellt, die auf Desktop und Mobilgeräten funktioniert
http://codepen.io/bassta/pen/gLXWKm
Wahrscheinlich wird eine Anzeige benötigt, dass Scrollen möglich ist
Markup
Stile
@Chris Panayotov, der Sinn ist, über das Mausrad nach rechts zu scrollen
Ah, aber das würde erfordern, auf eine für die Plattform natürliche Weise zu scrollen, wie z. B. Shift + Scrollrad, oder mit dem Finger in eine Richtung zu ziehen, die dem Scrollen entspricht. Wer will das schon tun?
Dieser Artikel behebt dieses offensichtliche Problem, indem er es Ihnen ermöglicht, horizontal mit Ihrem vertikalen Scrollrad ohne Shift auf einigen Plattformen zu scrollen, aber nicht auf Android, iOS oder Laptops mit Touchscreens. Aber Sie können es auf Plattformen definitiv tun, auf denen Sie Shift + Scrollrad verwenden können, also sparen Sie eine ganze Tastendruck.
Ich bin neugierig, wie macht diese Seite das?
Es verhielt sich so, als wäre der Container nicht gedreht worden, **sodass Sie nach oben und unten wischen müssen, um seitwärts zu scrollen, was natürlich kontraintuitiv ist.**
Ist es intuitiv, nach oben und unten zu scrollen, um seitwärts zu scrollen?
Der ganze Sinn dieser Übung war es, diese Demo nur mit CSS nachzubilden: https://css-tricks.de/examples/HorzScrolling/
Aber zugegeben, das Scrollen mit dem Mausrad nach unten, um seitwärts zu gehen, ist auch nicht sehr intuitiv.
Seitenverhältnis*
Korrekt. Gut bemerkt.
Ich habe gerade eine Website geschlossen, die horizontales Scrollen hatte (von css-tricks verlinkt, nicht weniger).
Weil sie horizontales Scrollen hatte.
Wenn Sie dieses Offline-Papierkonzept ins Online-Zeitalter übertragen wollen, sind Sie wahrscheinlich irgendwo auf dem falschen Weg. Kein von Ihnen hier beschriebener Anwendungsfall wird durch horizontales Scrollen bessere Ergebnisse erzielen.
Das Internet ist kein Buch und Ihr Browser keine Zeitschrift. Arbeiten Sie mit und für das Medium, nicht dagegen.
Treten Sie einen Schritt zurück und lesen Sie https://en.wikipedia.org/wiki/Form_follows_function.
Ich verstehe und höre, was Sie sagen.
Aber seien Sie vorsichtig, nicht zu sehr in Dogmatismus zu verfallen: https://css-tricks.de/increasing-wariness-dogmatism/
Hallo Chris,
Ich bin auf ein Problem mit der Drehung in iOS gestoßen, und es scheint, als würde iOS Rotationen ignorieren, wenn sie ein Vielfaches von 90 sind. Wenn Sie es auf 89,9 ändern, sollte es funktionieren.
Ich hoffe, das hilft
Kommentar von Cleber Santana, nach Abpfiff
Ein Ansatz zu diesem Konzept, über Jari Thorup Palo