- WebKit bittet Designer und Entwickler um Feedback zur Standardisierung des in CSS lange schwierigen Masonry-/Waterfall-Layouts als CSS Grid Level 3
- Das vorgeschlagene Modell schaltet auf Basis von
display: grid mit grid-template-rows: masonry die Erzeugung von Zeilen ab und füllt Inhalte wie Mauersteine in freie Lücken
- Apple ist der Ansicht, dass diese Funktion in Grid liegen muss, damit sie mit bestehenden Grid-Fähigkeiten wie
fr, minmax(), max-content, Spanning, expliziter Platzierung und subgrid kombiniert werden kann
- Ein separater Ansatz mit
display: masonry könnte Layout-Typen zwar einfach trennen, dürfte der Diskussion zufolge aber möglicherweise auf gleich breite Spalten beschränkt bleiben und die Track-Sizing-Fähigkeiten von Grid nur schwer nutzen können
- Nach dem Update im Oktober 2024 kam die CSS Working Group zu dem Schluss, dass variable Track-Breiten, explizite Platzierung, Spanning und Subgrid es wert sind, in Masonry aufgenommen zu werden, und sich performant implementieren lassen; die Syntax-Diskussion läuft jedoch weiter
Aktueller Stand von CSS Grid Level 3
- Nach dem Update im Oktober 2024 wurde ein offizieller W3C Working Draft für das CSS Grid Layout Module Level 3 erstellt, der das Verhalten von Masonry-Layouts dokumentiert
- Mitglieder der CSS Working Group kamen zu dem Schluss, dass folgende Funktionen für Masonry-Layouts wertvoll sind und performant implementiert werden können
- Tracks mit variabler Breite
- Explizite Platzierung
- Spanning
subgrid
- Die Debatte über die Syntax ist jedoch noch offen; WebKit führt sie in einem separaten Beitrag, Help us choose the syntax for Masonry in CSS, fort
Warum Masonry-Layouts nötig sind
- CSS Grid Level 1 wurde 2017 eingeführt und verringerte den Größen- und Platzierungsaufwand von Float-basierten Layouts; Grid Level 2 brachte Subgrid
- Doch auch nach der Einführung von CSS Grid gab es sieben Jahre lang keine klare Antwort auf die Frage, wie man ein „Masonry-Layout in CSS“ schreibt
- Ein Masonry-Layout ist ein Muster, bei dem Inhalte wie Ziegelsteine oder eine Steinmauer ineinandergreifend angeordnet werden; es wird auch Waterfall Layout genannt
- Es kann Inhalte mit unterschiedlichen Seitenverhältnissen handhaben, sodass weniger Bedarf besteht, alles zuzuschneiden oder zu verkleinern, um alle Elemente in gleiche Rechtecke zu pressen
- Da Inhalte über die ganze Seite verteilt werden, bleibt die Lesereihenfolge beim Scrollen natürlicher, und wenn am unteren Rand per Lazy Loading Inhalte ergänzt werden, müssen bestehende Inhalte nicht verschoben werden
Geschichte des Vorschlags und Standardisierungsdebatte
- Einen Mechanismus für Masonry-Layouts in CSS schlug Mozilla im Januar 2020 erstmals als Erweiterung von CSS Grid vor; in Firefox Nightly wurde er als experimentelle Funktion hinter einem Flag implementiert
- Apple begann 2022 in Safari Technology Preview damit, den Vorschlag für CSS Grid Level 3 zu implementieren; inzwischen ist er standardmäßig aktiviert
- Innerhalb der CSS Working Group gab es unterschiedliche Ansichten zur Grundrichtung
- Einige sahen Masonry nicht als Teil von CSS Grid, sondern als eigenen
display-Typ
- Andere waren nicht überzeugt, ob dieses Layout im Web nötig ist oder ob bekannte Websites es nutzen würden
- WebKit ist der Ansicht, dass Browser vor einer Veröffentlichung dieser Funktion zunächst einen Konsens der CSS Working Group benötigen
Grundlegende Nutzung: Grid mit deaktivierten Zeilen und nur Spalten
- Ein klassisches Masonry-/Waterfall-Layout wird geschrieben, indem man auf das
main-Element display: grid anwendet, Spalten definiert und in Zeilenrichtung den Wert masonry angibt
main {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(14rem, 1fr));
gap: 1rem;
grid-template-rows: masonry;
}
grid-template-columns: repeat(auto-fill, minmax(14rem, 1fr)) erzeugt wiederholt flexible Spalten mit mindestens 14rem Breite
gap: 1rem erzeugt einen Abstand von 1rem zwischen Spalten und Elementen
grid-template-rows: masonry weist den Browser an, keine Zeilen zu erzeugen, sondern Inhalte im Masonry-/Waterfall-Muster aufzufüllen
- Dieses Beispiel erzeugt mit vier CSS-Zeilen ein flexibles Layout, das ohne Media Queries oder Container Queries auf verschiedene Bildschirmgrößen reagiert
- Der Wertname
masonry kann sich vor der Veröffentlichung in Browsern noch ändern
Warum die Spaltendefinitionen von Grid erhalten bleiben sollen
- WebKit hat vier Demos erstellt, um zu zeigen, warum Masonry Teil von CSS Grid sein sollte; sie lassen sich unter webkit.org/demos/grid3 direkt ausprobieren
- Die Demos sind in Browsern mit Unterstützung für Grid Level 3 zu sehen
- CSS Grid bietet beim Definieren von Spalten viele Optionen
- Feste Größen in verschiedenen Einheiten wie
px, em, rem, cqi, lh, ch, ic, cap, vw, svh
max-content, min-content
- Die Einheit
fr
minmax()
- Größen in
%
auto
- Beispielsweise können die erste und letzte Spalte auf eine feste Breite von 14ch gesetzt werden, während die mittleren Spalten flexible Spalten mit mindestens 28ch sind
main {
display: grid;
grid-template-columns: 14ch repeat(auto-fill, minmax(28ch, 1fr)) 14ch;
grid-template-rows: masonry;
gap: 1rem;
}
- Durch die Kombination von
fr-Einheiten und minmax() lässt sich eine zweistufige Flexibilität erzeugen, bei der Spalten in unterschiedlichen Phasen wachsen und schrumpfen
max-content und min-content passen Spaltengrößen an die Inhaltsgröße an und ermöglichen so Anordnungen, die sich vom Anpassen der Inhalte an Spalten unterscheiden
- Mit
grid-template-columns: 1fr 1fr 2fr 3fr 5fr 8fr; lässt sich etwa eine Fibonacci-Folge nutzen, um Spalten unterschiedlicher Breite zu erstellen
- Das Mega-Menu-Beispiel verwendet
grid-template-columns: repeat(auto-fill, minmax(max-content, 30ch));, damit jede Spalte groß genug wird, um Linktexte ohne Zeilenumbruch aufzunehmen
- WebKit sieht die Diskussion um ein separates
display: masonry als in eine Richtung gehend, die ähnlich dem heutigen Multicolumn Layout nur gleich große Spalten erlaubt
Spanning, View Transitions und columnar grid
- CSS Grid kann Elemente über mehrere Spalten spannen lassen, wodurch auch in Masonry-Layouts vielfältige visuelle Kompositionen möglich werden
- Im Beispiel lässt sich jedes fünfte Bild über zwei Spalten spannen, während die übrigen Bilder nur eine Spalte einnehmen
- Auch Varianten sind möglich, bei denen Bilder mit breiterem Seitenverhältnis die Klasse
wider erhalten, mehrere Spalten belegen, Ecken rechteckig werden oder Abstände auf 0 reduziert werden
- Die Photos-Demo kombiniert dies mit View Transitions: Klickt oder tippt ein Nutzer auf ein Foto, wird dieses über mehrere Spalten hinweg vergrößert, und der Browser animiert den Übergang automatisch
- Diese Demo erfordert Safari Technology Preview 192 oder neuer
- WebKit sieht den Kern von Grid Level 3 weniger in einem spezifischen Muster namens „Masonry“ als vielmehr in einem Mechanismus zum Abschalten von Zeilen
- Dieser Ansatz erzeugt ein columnar grid, das nur aus Spalten besteht, im Gegensatz zu einem modular grid, bei dem sowohl Zeilen als auch Spalten ausgerichtet sind und das CSS Grid Level 1 gut erzeugt
Unterschied zwischen modular grid und columnar grid
- Ein modular grid ist ein Grid, bei dem Inhalte sowohl an Spalten als auch an Zeilen ausgerichtet werden; CSS Grid Level 1 eignet sich für diese Art von Layout
- Auch Float-basierte Layouts förderten die Nutzung modularer Grids im Web, weil Inhaltshöhen angepasst werden mussten, damit Floats korrekt bereinigt werden konnten
- Auf echten Websites werden häufig Bildseitenverhältnisse vereinheitlicht, Textlängen angeglichen oder Inhalte durch CMS-Regeln beziehungsweise CSS-Zuschnitt und Ellipsen in gleiche Boxen gepresst
- Ein columnar grid kann Inhalte in ihrer gewünschten Größe belassen und das Layout passend zu den Inhalten arbeiten lassen
- WebKit sieht anhand eines Beispiels, bei dem der neueste Artikel vier Spalten überspannt, einige aktuelle Artikel zwei Spalten und ältere Inhalte eine Spalte belegen, dass sich auch textlastige Inhalte lebendiger anordnen lassen
Kombination von Subgrid und expliziter Platzierung
- Subgrid aus CSS Grid Level 2 wird von den meisten Browsern unterstützt
- Das Beispiel einer Museumsseite listet die Metadaten von Bildkarten nicht in einer einzelnen linksbündigen Spalte auf, sondern platziert per
subgrid Jahr und Katalognummer rechts in jeder Karte und richtet sie mit denselben Daten anderer Karten aus
- Wenn Masonry in CSS Grid Level 3 aufgenommen wird, lassen sich auch bestehende Entwicklertools weiterverwenden
- Mit dem Grid Inspector in Safari Technology Preview kann
grid-template-rows: masonry ausprobiert werden
- Bei einem separaten Display-Typ gingen die Vorteile von Subgrid verloren
- Auch die explizite Platzierung aus CSS Grid Level 1 kann zusammen genutzt werden; im Beispiel platziert
grid-column: -3 / -1 den Header oben rechts auf der Seite in den letzten beiden Spalten
- WebKit ist der Ansicht, dass sich mit wenigen Zeilen Layout-Code Funktionen aus Grid Level 1, 2 und 3 kombinieren lassen, um ohne Media Queries oder Container Queries ein Layout zu erstellen, dessen Spaltenzahl sich je nach verfügbarem Platz ändert
Streitpunkte rund um display: masonry
- WebKit und Apple sehen Masonry als eine Funktion, die CSS Grid erweitert, sodass es nicht nur modular grids, sondern auch columnar grids erstellen kann
- In dieser Richtung lassen sich Grid-Funktionen wie Spaltendefinition, Track Spanning, explizite Platzierung und
subgrid zusammen nutzen
- Befürworter eines separaten Display-Typs sehen darin eine saubere Trennung der Layout-Typen
display: block;
display: inline;
display: flexbox;
display: grid;
display: masonry;
- Die CSS Working Group hat die Syntax eines separaten Masonry-Display-Typs noch nicht diskutiert, WebKit nennt jedoch eine Syntax ähnlich dem Multicolumn Layout oder eine eingeschränkte Grid-ähnliche Syntax als Beispiele
main {
display: masonry;
columns: 28ch;
}
main {
display: masonry;
masonry-columns: repeat(5, minmax(28ch, 1fr));
/* where only one repeating width is allowed */
}
- Ein separater Layout-Typ könnte die Arbeit vermeiden, die nötig wäre, um Grid und Masonry dauerhaft gemeinsam funktionieren zu lassen
- Das Layout-Modell wird einfacher
- Die Browser-Implementierung wird einfacher
- Die Wahrscheinlichkeit von Performance-Fallen sinkt
- Die Funktionssets von Grid und Masonry können voneinander abweichen
- Umgekehrt ist WebKit der Ansicht, dass bei verbundenen Grid-Layout-Typen die CSS Working Group künftige Funktionen sowohl für modular grids als auch für columnar grids definieren würde
- Wenn etwa in CSS Grid Level 4 Funktionen wie Styling für Grid Areas und Grid Lines, Hintergrundfarben für Tracks oder Rule Lines für Gaps hinzukämen, wäre es nach dieser Sicht besser, wenn sie von Anfang an in beiden Grid-Typen funktionieren
Wie „Grid“ zu verstehen ist
- Befürworter eines separaten
display: masonry sehen CSS Grid teils im Kern als zweidimensionale Ausrichtung und betrachten Masonry, weil es nur in eine Richtung ausrichtet, nicht als Grid
- WebKit verweist darauf, dass Grids in der Geschichte des Grafikdesigns Werkzeuge waren, um Text, Bilder und Inhalte in regelmäßigen Mustern anzuordnen und so Lesbarkeit und Nutzbarkeit zu unterstützen
- Schon bevor Modernisten des 20. Jahrhunderts in Europa und den USA die Ausrichtung an Spalten und Zeilen als „proper“ Graphic Design Grid betonten, wurden verschiedene Grids genutzt
- Mark Boulton sah symmetrische columnar grids als formell und langweilig an und förderte im Webdesign die Nutzung asymmetrischer compound grids
- CSS Grid Level 1 machte asymmetrische Grids und compound grids leicht umsetzbar, derzeit gilt das jedoch nur, wenn dieses Grid ein modular grid ist
- WebKit ist der Ansicht, dass sowohl modular grids als auch columnar grids Grids sind und dass CSS Grid auch die Fähigkeit haben sollte, columnar grids zu erstellen
Erbetenes Feedback von Entwicklern und Designern
- WebKit bittet Entwickler und Designer, selbst Demos zu erstellen, Meinungen in Blogs oder sozialen Medien zu veröffentlichen und Kommentare in Issues der CSS Working Group zu hinterlassen
- Die Fragen für Feedback lauten:
- Sollte „masonry“/„waterfall“ Teil von CSS Grid sein?
- Werden Funktionen für columnar grids einschließlich
subgrid, Spanning, expliziter Platzierung und vielfältigem Track Sizing benötigt?
- Reicht ein klassisches Masonry-Layout mit gleich großen Spalten aus?
- Würdet ihr diese Funktion tatsächlich nutzen, und was könntet ihr damit bauen?
- Gibt es Links zu Demos, die ihr erstellt habt?
- Gibt es Dinge, die sich mit diesem Modell nicht umsetzen lassen?
- Das WebKit-Team arbeitet seit anderthalb Jahren an Masonry; in Safari Technology Preview 163 wurde es im Februar 2023 standardmäßig aktiviert
- WebKit möchte die Funktion bald veröffentlichen, doch Details einschließlich des Namens sowie grundlegende Fragen müssen vorher geklärt werden
Namensdiskussion: masonry, waterfall, off
- WebKit hält es für sehr wahrscheinlich, dass
masonry nicht der beste Name für den neuen Wert ist
- CSS-Namen sind häufig einfache Wörter, die das Ergebnis direkt beschreiben, etwa
center, contain, clip, wrap, smooth
masonry ist eine Metapher, die Hintergrundwissen erfordert, und kann für Entwickler, die kein Englisch sprechen, schwerer zu merken sein
- In manchen Regionen wird dieses Layout häufiger
waterfall genannt, sodass auch grid-template-rows: waterfall ein möglicher Kandidat sein könnte
- WebKit sieht diese Funktion weniger als Pinterest-artiges Layout an sich, sondern eher als Mechanismus: „Erstelle ein Grid, aber erzeuge keine Zeilen“
grid-template-rows: none; könnte semantisch passen, ist aber nicht nutzbar, weil none bereits der Standardwert von grid-template-* ist und bedeutet: „Keine expliziten Zeilen, nur implizite Zeilen“
- Als Alternative wird
grid-template-rows: off; vorgeschlagen
main {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(14rem, 1fr));
grid-template-rows: off;
}
- Die CSSWG diskutiert den Namen in diesem Issue
- Derzeit verwenden Safari Technology Preview und die Demos entsprechend dem Editor’s Draft den Wert
masonry, der Name könnte sich künftig jedoch ändern
1 Kommentare
Hacker-News-Kommentare
Der Hintergrund ist, dass die Developer-Relations-Verantwortlichen der Browser-Anbieter in der CSSWG darüber diskutiert haben, wie Masonry-Layouts offiziell in CSS aufgenommen werden sollen. Diese Diskussion läuft mindestens seit 2020, als Firefox den ersten Vorschlag gemacht hat.
Die Neuigkeit ist, dass WebKit diese Diskussion öffentlich gemacht und Designer sowie Entwickler zu konkretem Handeln aufgefordert hat, etwa „postet in sozialen Medien, schreibt Blogbeiträge“.
Oberflächlich kann das wie ein formaler Prozess wirken, aber es könnte einen wichtigen Präzedenzfall schaffen. Der Kernpunkt ist, ob alle Layout-Optionen als Teil von CSS Grid behandelt werden sollen oder ob man bei Bedarf immer wieder neue CSS-Display-Eigenschaften hinzufügt.
Ersteres macht die ohnehin schon komplexe CSS-Grid-Spezifikation noch komplexer, Letzteres könnte die CSS-Spezifikation mit neuen Eigenschaften und Untereigenschaften aufblähen. Keine der beiden Optionen ist so einfach, wie sie aussieht.
Grid platziert zunächst alle Elemente im Raster, etwa als
col:2,row:3, und bestimmt anschließend die Rastergröße. Masonry möchte idealerweise zuerst die Track-Größen festlegen und dann die Elemente in diese Tracks platzieren.Die erste Implementierung in Firefox und die damalige Spezifikation besagten im Wesentlichen, dass Masonry-Elemente – abgesehen von der ersten Zeile und einigen komplizierten Regeln – nicht in die Berechnung der Track-Größen einbezogen werden. Dadurch war es sehr leicht, dass Elemente über ihre Tracks hinausragten.
Die aktuelle Spezifikation verlangt, jedes Element in jedem möglichen Track auszuprobieren. Im schlimmsten und zugleich ziemlich häufigen Fall ergibt das eine quadratische Performance von O(N_tracks * N_items), und quadratische Performance ist schlecht[1]; in anderen Layout-Algorithmen gibt es so etwas praktisch nicht.
Mit Verschachtelung verschlechtert sich die Performance quasi exponentiell, und auch schnelle CPUs machen das nicht gut. Man könnte sagen, solche Fälle seien nicht häufig, aber bei CSS-Layout-Modi testen Menschen immer die Grenzen aus, daher müssen sie grundsätzlich schnell sein.
Bei Grid bestimmt ein Element seine eigene Größe unterschiedlich, je nachdem, in welchem Track es liegt; deshalb muss man jede mögliche Position ausprobieren. Um dieses Problem zu entschärfen, könnte Masonry einen anderen Algorithmus für die Track-Größenberechnung benötigen, aber der Blogbeitrag behandelt diesen Punkt nicht ausreichend. Es hätte vielleicht eine Version der Grid-Größenberechnung ohne Abhängigkeit von der Elementposition geben können, aber dieser Zug ist bereits abgefahren.
[1] https://randomascii.wordpress.com/2019/12/08/on2-again-now-i...
Im Wesentlichen reicht
grid-row-template: masonry, und der Rest funktioniert weiterhin gut. Das ist positiv, und meiner Ansicht nach macht es Grid-Layouts nicht schwieriger nutzbar als heute.Die Nachteile liegen vor allem bei den Autoren von Browser-Engines. Denn die Messlatte für „vollständige CSS-Grid-Unterstützung“ wird höher. Außerdem heißt es, man könne dadurch Performance-Fallen vermeiden, bei denen Implementierungen, die alle Grid-Funktionen unterstützen müssen, in manchen Grid-Layouts langsamer werden als zu einer Zeit, als die Spezifikation noch einfacher war.
Gäbe es einen separaten Display-Modus, müsste man die
grid-column-Spezifikation für Masonry-Layouts wiederholen, und das wäre schade.Das hat nicht direkt mit CSS Masonry zu tun, aber ich habe kürzlich eine zweite Iteration einer Schnittstelle prototypisiert, in der es eine ähnliche Spannung gab. Es ging um die Frage, ob man im Datenmodell ähnliche, aber unterschiedliche Typen vermehrt oder ob man innerhalb bestehender Typen mehr feine Nuancen einführt, um Verfeinerung zu ermöglichen.
Zu Beginn bevorzugte ich stark Letzteres, aber als ich die Optionen tatsächlich durchgespielt habe, war es am Ende deutlich einfacher, die „aufgeblähte“ Schnittstelle zu konsumieren und den Anwendungscode daraus herzuleiten.
Zu CSS Masonry habe ich keine starke Position, aber es könnte eine ähnliche Überraschung zwischen der intuitiv wahrgenommenen Spannung und dem tatsächlichen Nutzungserlebnis geben. Gerade bei CSS dürfte es schwer sein, „Aufblähung“, also eine Zunahme an anwendungsfallspezifischer Bedeutung, zu rechtfertigen; zugleich könnten Nutzer aber dazu neigen, dichte APIs wie Grid als schwieriger zu empfinden.
Ich teste seit letztem Jahr in Firefox und Safari und habe an der Implementierung nichts auszusetzen. Es gibt Leute, die über die Position und die Namen der Eigenschaften meckern, aber man muss wohl anerkennen, dass es keine perfekte Lösung gibt, und pragmatisch implementieren.
JavaScript als Ersatzimplementierung lehne ich ab. Deshalb enthält der Fallback viel unschönes CSS, das die Reihenfolge nicht korrekt hinbekommt, aber für das Projekt, an dem ich arbeite, ist das kein großes Problem. Im Moment werden die meisten wohl JavaScript als Fallback nutzen, aber wenn JavaScript die Lösung für Layout ist, hat man im Grunde schon verloren.
Die Mega-Menü-Demo <https://webkit.org/demos/grid3/megamenu/> gefällt mir überhaupt nicht, und Masonry dort einzusetzen wirkt völlig unangebracht. Es bringt die Flussrichtung durcheinander und bricht die Erwartungen stark
Erwartete Lesereihenfolge: https://temp.chrismorgan.info/2024-04-23-masonry-megamenu-2....
Reihenfolge, die die tatsächliche Demo vermittelt: https://temp.chrismorgan.info/2024-04-23-masonry-megamenu-1..... Das beeinflusst die korrekte Lesereihenfolge und den Tabindex. Sehende Nutzer lesen praktisch immer in der „falschen“ Reihenfolge
Am Ende zeigt es nur, dass es keine Struktur gibt, sondern bloß eine unstrukturierte Tasche voller Links ist. Wenn man der Nummerierung folgt, wirkt es aber so, als hätte es eine ziemlich logische Reihenfolge gegeben, die durch die unpassende Masonry-Behandlung komplett zerstört wurde
Im Screenshot war „Elementnummern anzeigen“ aktiviert. Normalerweise sieht es wie gewöhnliche Spalten ohne Hintergrund aus
Die Implementierung hätte Spalten verwenden und jedem Abschnitt
break-inside: avoidhinzufügen sollen. In der Demo wurde das übersehenDie Zeitungs-Demo ist aus ähnlichen Gründen ebenfalls etwas fragwürdig, aber ein deutlich kleineres Problem
Bei unabhängigeren Blöcken, etwa Medien wie Bildern, bei denen die Lesereihenfolge nicht so tief verankert ist, passt ein Masonry-Layout besser. Rund um den Tabindex gibt es zwar immer noch etwas Unklarheit, aber es ist nicht mehr offensichtlich falsch
Die Erwartung sehender Nutzer bei einem Masonry-Layout ist nicht, dass es eine Kontinuität zwischen den Spalten gibt, sondern dass sie den visuellen Zeilen folgt. Auch die als „unerwartet“ dargestellte Reihenfolge folgt genau dem
Das Problem scheint darin zu liegen, dass die Tab-Reihenfolge die ursprüngliche Inhaltsreihenfolge ignoriert und versucht, das Visuelle nachzuahmen; sehr wahrscheinlich ist das ein Überbleibsel der aktuellen Implementierung
Das Gute an dieser Funktion ist: Wenn man sich die Demo in Browsern ansieht, die sie nicht unterstützen, also in praktisch allen aktuellen stabilen Browsern ohne spezielle Flags, wird sie trotzdem in einem recht vernünftigen festen Zeilenformat angezeigt, weil sie direkt auf Grid-Layout aufgebaut wurde: https://webkit.org/demos/grid3/
In jedem Fall sähe ein richtiges Masonry-Layout deutlich besser aus, aber auch so ist es ausreichend nutzbar. Wenn einem das nicht gefällt, kann man per Feature Detection auch eine bessere Fallback-Darstellung anbieten
Mir gefällt die allgemeine Anmutung von Masonry-/Wasserfall-Layouts wirklich sehr. Vielleicht weil ich mit gedruckten Zeitungen aufgewachsen bin und sie immer noch lese, fühlt sich ein spaltenbasiertes Layout wie eine intuitive Art an, eine Seite aufzuteilen
Allerdings hätte ich gern eine Alternative zur standardmäßigen Masonry-Ausrichtung. Soweit ich weiß, lautet die Grundregel etwa: „Platziere das nächste Element in der Spalte, in die es am weitesten oben passt“, wodurch die Links-rechts-Reihenfolge ab der zweiten Zeile stark durcheinandergerät
Eine bessere Variante, wie ich sie mir vorstelle, wäre ein Layout, das den Lesefluss von links nach rechts – oder bei bevorzugter Richtung von rechts nach links entsprechend – stärker bewahrt. Zum Beispiel: „Setze das nächste Element in die Spalte rechts vom vorherigen; wenn es bereits ganz rechts ist, setze es ganz links, und wenn die neue Unterkante nicht zu weit unter die Unterkante der linken Spalte fällt, darf ein zweites Element in derselben Spalte stehen“
Das wäre flexibler als striktes Links→rechts, würde die Ausrichtung weniger stark beschädigen und zugleich die Bedeutung der Leserichtung von links nach rechts in gewissem Maß erhalten
Man kann sicher nicht jede Formel abdecken, die man sich für Masonry wünschen könnte, aber bei Inhalten, bei denen die Reihenfolge zumindest etwas wichtig ist – vielleicht nicht Pinterest, aber etwa bei einem Journal –, halte ich so etwas für einen sinnvolleren Standard als die klassischen Masonry-Regeln
Bei einem magazinartigen Layout liest man doch erst Spalten von oben→unten und dann von links→rechts, oder? In CSS ist das bereits mit
columnsoder einer vertikalen Flexbox möglichEin weiteres Problem dieses Masonry-Layouts ist, dass die Unterkante ungleichmäßig ist. In einem Magazin wäre sie vermutlich ausgeglichen, und auch das lässt sich mit Spalten oder Flexbox erreichen
Im Web scheint es die unausgesprochene Annahme zu geben, dass Inhalte endlos gescrollt werden und die Form am unteren Seitenrand daher unwichtig ist. Das ist allerdings keine Annahme, die man unbedingt fördern sollte
{ /* Elemente beim Aktualisieren höchstens um 2 Spalten nach links oder rechts verschieben */ grid-template-max-horizontal-shift: 2 col; }Angenommen, man könnte ein nicht abwärtskompatibles System schaffen, das CSS ersetzt – wie sollte man vorgehen?
Gibt es Bücher oder Papers darüber, wie man ein konsistentes Layout-System entwirft?
Wie sieht es mit Alternativen wie Qt, Tk oder SwiftUI aus? Außer CSS habe ich nie etwas verwendet. Wenn es unter den tatsächlich breit implementierten Systemen etwas Besseres gibt: Was macht es besser?
Ich wünsche mir ein System, das Entwicklern eine bessere Schnittstelle bietet, weiß aber nicht, wie man das angehen sollte. Wenn man von vorn anfangen könnte: Welche Designprinzipien sollten gelten?
Eigenschaften sollten expliziter und stärker voneinander getrennt sein. Unsinn wie negative Margins sollte verschwinden, und alle Abstände sollten mehrstufig sein. Zum Beispiel in der Art von
padding = max(el.paddings[]).Begrenzungsboxen sollten explizit sein, und Rahmen sollten zu echten Elementen werden. Das Box-Modell an sich ist nicht schlecht; CSS hat seine Umsetzung nur furchtbar gemacht. Es ist voller fragiler Zaubersprüche und absurder Einschränkungen, bei denen bei jeder Berührung zu 99 % etwas kaputtgeht – und diese Einschränkungen erzeugen weitere Probleme und „Lösungen“.
Der Ansatz wurde dafür entworfen, Änderungen von Bildschirmgröße und -form aufzulösen. Apple ist zu SwiftUI gewechselt und hat sich möglicherweise von diesem Ansatz entfernt.
Flutter und XAML wären wohl ebenfalls einen Blick wert.
Ich poste das noch einmal als Top-Level-Kommentar, damit es besser sichtbar ist.
Ich habe eine Foto-Website und verwende kein JavaScript für das Layout. Beim Bau habe ich mir JavaScript-Masonry-Bibliotheken angesehen, war mit den Ergebnissen aber nicht zufrieden.
Ein echtes Masonry-Layout, das tatsächlich den gesamten verfügbaren Raum füllt, schneidet einige Bilder zu. Wenn man nicht zuschneiden und das Seitenverhältnis beibehalten will, muss man um die Fotos herum Leerraum lassen. Die einzige Möglichkeit, das nicht zu tun, ist Infinite Scroll – das mögen die unternehmerischen Suchtmaschinen wollen, aber für meine Website will ich das nicht.
So habe ich es gebaut:
https://yakubin.com/photography/albumless/
https://yakubin.com/photography/album/kenya-2023/
Um dieses Ergebnis zu erzielen, habe ich
display:inline-blockverwendet und die Fotos im Grunde wie Text behandelt, der in eine neue Zeile umfließen soll. Mit dem Ergebnis bin ich sehr zufrieden und ziehe es der Vorgehensweise von Masonry-Bibliotheken vor.Das Problem ist die Reihenfolge. Wenn die Reihenfolge nicht wichtig ist, funktionieren die heutigen reinen CSS-Lösungen gut. Soweit ich mich erinnere, können unten in den Spalten allerdings seltsame Formen übrig bleiben.
Dazu habe ich eine interaktive Demo zu den Grid-Prinzipien gebaut:
https://cssprinciples.com/3/grid/
Es gibt bereits das alte
floatund außerdem moderne Layouts mit Flexbox und Grid; da fragt man sich, ob es richtig ist, CSS immer weiter um „Layout“-Optionen zu ergänzen.Falls es immer noch Fälle gibt, die nicht abgedeckt sind, könnte es trotz zusätzlicher Komplexität die bessere Lösung sein, ein letztes Constraint-basiertes System zu haben, das alle Layout-Fälle abdeckt. Dann könnten CSS-Frameworks und Utility-Bibliotheken darauf die nächste Generation von Masonry Grids usw. aufbauen.
Trotzdem kommt der Houdini-Layout-Vorschlag dieser Idee am nächsten. Dabei wird das Layout an einen isolierten JavaScript-Kontext übergeben: https://github.com/w3c/css-houdini-drafts/blob/main/css-layo...
Ehrlich gesagt haben Flexbox und Grid sowie Dinge wie Containment aber bereits viele Probleme gelöst, sodass der Verbesserungsdruck deutlich geringer ist als in der Zeit vor Flexbox.
float-Hacks oder die bald veralteten CSS-Grid-/Flexbox-Hacks nicht mehr verwenden zu müssen. Das Masonry-Layout in Firefox fügt tatsächlich eine neue Eigenschaft hinzu, die Grid-Zeilen zusammenklappt; damit ist es im Grunde so implementiert, dass es alle Layout-Fälle abdeckt.display: grid;grid-template-rows: masonry;Allerdings ist es auf WebKit beschränkt. Ich hatte es im Galerie-Modus meines persönlichen Newsfeeds implementiert und schon im Oktober 2023 wieder verworfen.
Ein Constraint-basiertes System läge wohl irgendwo unbeholfen zwischen Grid und JavaScript; ich bin mir nicht sicher, ob das viel helfen würde.
Ich benutze das bereits. In Firefox aktiviere ich es in den Optionen und nutze es für Lesezeichen. Auf Mobilgeräten ist es kein Problem, weil alles einfach untereinander gestapelt wird. Auf Mobilgeräten gibt es kein
about:config.Das letzte Bild zeigt den deaktivierten Zustand.
https://imgur.com/a/o7OyZEW
Daher wird sich beim Ändern der Fenstergröße die Reihenfolge der Lesezeichen ändern.
Mehr Hintergrund und die Gegenargumente, nämlich die Diskussion, warum
display: masonrybesser sei alsdisplay:grid+grid-template-rows: masonry, findet man ausführlich hier: https://github.com/w3c/csswg-drafts/issues/9041