Masonry-Layout, im Web, bedeutet, dass Elemente ungleicher Größe so angeordnet werden, dass keine ungleichen Lücken entstehen. Ich würde vermuten, dass der Begriff für das Web von David DeSandro geprägt (oder zumindest populär gemacht) wurde, wegen seiner beliebten JavaScript-Bibliothek Masonry, die es seit 2010 gibt.
JavaScript-Bibliothek. Nichts gegen JavaScript, aber es ist verständlich, dass wir uns für Layoutzwecke nicht darauf verlassen wollen. Gibt es heutzutage etwas, das wir direkt in CSS tun können? So ungefähr.

Ist vertikale Reihenfolge mit unebenen unteren Rändern in Ordnung?
Wenn ja, dann sind CSS-Spalten gut genug.
Flexbox kann auch vertikale Spalten mit unebenen Enden
Aber es ist nicht ganz so clever, da Sie eine Höhe einstellen müssen, um das Umbrechen der Spalten zu erreichen. Sie müssen auch explizit Breiten angeben, anstatt es die Spalten für Sie entscheiden zu lassen.
Aber es ist machbar und die Abstände werden automatisch verteilt, wenn Platz vorhanden ist.
Brauchen Sie eine saubere Unterkante? Eine Flexbox/JavaScript-Kombination kann helfen.
Jamie Perkins schrieb dies ursprünglich, dann hat Janosh Riebesell es umgeschrieben und jetzt portiere ich es hierher.
Es durcheinanderbringt die Reihenfolge komplett und erfordert, dass die Kinder bezüglich ihrer Höhe flexibel sind, aber es funktioniert.
Ist horizontale Linien-Masonry in Ordnung?
Wenn es nur um den unebenen ziegelsteinartigen Look geht, den Sie suchen, dann ist horizontales Masonry viel einfacher. Sie könnten wahrscheinlich sogar Dinge fluten, wenn Ihnen der zerklüftete Rand egal ist. Wenn Sie es als Block behalten wollen... Flexbox mit erlaubt flex-grow ist die Lösung.
Man würde denken, CSS Grid könnte helfen
CSS Grid ist sehr erstaunlich und nützlich im täglichen Leben eines CSS-Entwicklers, aber es ist nicht wirklich für Masonry-ähnliche Layouts konzipiert. CSS Grid dreht sich darum, Linien zu definieren und Elemente entlang dieser Linien zu platzieren, während Masonry davon handelt, Elemente dort enden zu lassen, wo sie liegen, aber dennoch einen gewissen Positionsbezug auszuüben.
Balázs Sziklai hat ein schönes Beispiel für automatisch fließende Grids, die alle schön zusammen gestapelt sind, *mit ziemlich guter horizontaler Anordnung*.
Aber man sieht, wie streng die Linien sind. Es gibt jedoch einen Weg!
Grid + JavaScript-manipulierte Zeilenbereiche
Andy Barefoot hat einen großartigen Leitfaden dazu geschrieben. Der Trick besteht darin, wiederholende Grid-Zeilen einzurichten, die ziemlich kurz sind, die Elemente nach Belieben horizontal im Grid fallen zu lassen und dann ihre Höhen mit einiger ziemlich leichter Mathematik anzupassen, um zu berechnen, wie viele Zeilen sie überspannen sollen.
Rahul Arora ging diesen Weg ebenfalls.
Beides ist ziemlich cool, da die DOM-Reihenfolge und die visuelle Reihenfolge sinnvoll sind.
Ordnungsverschobene Elemente in einem Flexbox-Layout
Normalerweise, wenn Sie darüber nachdenken, order zu verwenden, um Dinge in einem Flexbox- oder Grid-Layout zu verschieben, bewegen Sie sich auf gefährlichem Terrain, da die Tabulatorreihenfolge wahrscheinlich der DOM-Reihenfolge folgt, die nicht mehr mit der erwarteten Tabulatorreihenfolge übereinstimmt, weil sich visuell Dinge verschoben haben. In dieser Demo von Diederik van Leeuwen wird order verwendet, um etwas zu machen, das als spaltenorientierte Flexbox beginnt, aber mit etwas cleverem JavaScript zu einer horizontalen Ordnung manipuliert wird.
DOM-verschobene Elemente in einem CSS-Spaltenlayout
Was die Leute im Allgemeinen wollen, ist eine Spaltenstapelung (unterschiedliche Höhen der Elemente), aber mit horizontaler Anordnung. Die letzte Grid-Demo oben bewältigt dies ziemlich gut, aber es ist nicht die einzige Methode.
Jesse Korzan hat es mit CSS-Spalten angegangen. Es benötigt auch JavaScript, um es zu erledigen. In diesem Fall verschiebt es die Elemente im DOM, um sie von links nach rechts anzuordnen, während es eine horizontale Stapelung mit einem CSS-Spaltenlayout bereitstellt. Dies führt zu einem kleinen Barrierefreiheitsproblem, da die visuelle Reihenfolge (links nach rechts) und die Quellreihenfolge (oben nach unten) sehr unterschiedlich sind – obwohl dies vielleicht mit programmatischem tabindex behoben werden kann?

Es gibt auch die ursprüngliche Bibliothek und Variationen
Schwimmen Sie davon, meine Hübschen.
Und es gibt die neuere, hippere Version: Colcade!
Und hier ist MagicGrid, bei dem ein Flexbox-Layout mit einer JavaScript-Bibliothek leicht manipuliert wird.
CSS Houdini!
Houdini ist in verschiedene APIs unterteilt, die zu unterschiedlichen Zeiten veröffentlicht werden. Die Paint- und Typed OM APIs sind am weitesten fortgeschritten, aber es gibt einige Unterstützung für die Layout API, was unglaublich aufregend ist, da es Möglichkeiten wie Masonry-Layouts eröffnet.flex-gro
Hier ist eine Demo von Google.
Toller Artikel, Chris! Die neueste Grid-bezogene Herausforderung, die mir begegnet ist, ist ein Anwendungsfall, bei dem die mobile Reihenfolge von der Desktop-Layoutreihenfolge abweichen muss, Sie aber Ihren Inhalt nach Wichtigkeit im DOM behalten möchten.
Ich habe mich selbst herausgefordert, nur CSS zu verwenden (musste es am Ende mit einer Einzeiler-JS-Lösung abrunden).
Ich habe einen Beitrag über meine Lösung hier geschrieben: http://joshpalmeri.com/blog/2018/10/01/complex-layouts-with-css-grid-or-flexbox-or-neither-2/
Ich würde gerne Ihre Meinung dazu hören!
-Josh
Ich mag die ursprüngliche Masonry-Bibliothek, aber es sieht so aus, als ob sich beim Umbrechen von Elementen die Spalten nicht erweitern, um den freien Platz zu füllen. Gibt es dafür Workarounds?
Das Beispiel "durcheinanderbringt die Reihenfolge" ist nicht darauf zurückzuführen, dass es Flexbox oder Masonry oder etwas anderes ist. Aus irgendeinem Grund mischt der JS-Code die Reihenfolge der Kinder (indem er ihnen eine
order-Eigenschaft gibt, die gleich ihrem Index modulo 3 ist). Beachten Sie, dass er bis 1, 4, 7, 10, 13 hochzählt und dann wieder bis 2, 5, 8, 11 usw. heruntergeht. Ich habe keine Ahnung, warum er das tut; die Höhen sind bereits zufällig, also hilft es nicht einmal beim Ausbalancieren oder so etwas.Das "Grid mit dichter automatischer Platzierung" ist meine Lieblingstechnik, und ich wünschte, wir könnten sie mit der Version "kleine Zeilenhöhe" etwas besser zum Laufen bringen. Letztendlich muss das aber als etwas getrennt von Grid behandelt werden, das auf denselben Konzepten aufbaut.
Tolle Zusammenfassung! Colcade sollte auch erwähnt werden (Eine weitere verrückte Kreation von DeSandro).
Wie er es ausdrückt
Beispiel, abgeleitet von denen in diesem Beitrag.
PS. Ich liebe die neue Website! Sie haben das mit all den Details wirklich gut gemacht. Ich glaube, ich habe gerade das einzige gefunden, was durchgerutscht ist. Links in Kommentaren (zumindest in der Vorschau) sehen beim Hovern großartig aus, sind aber sonst nicht unterscheidbar. Benötigt einen dünnen orange-pinken Farbverlauf-Unterstrich oder so etwas :)
Es gibt auch CSS Multi-Col, Rachel Andrew hat dazu einen ausführlichen Artikel geschrieben (https://www.smashingmagazine.com/2019/01/css-multiple-column-layout-multicol/), der auch einiges über das Masonry-Layout behandelt.
Ja! Super nützlich. Es ist die erste Demo in diesem Artikel.
React Spring ist ziemlich nett.
https://codesandbox.io/embed/26mjowzpr
Ich habe kürzlich eine Masonry-Website für einen Kunden mit https://packery.metafizzy.co entwickelt. Dies war sehr hilfreich für die Neuanordnung und anschließende Speicherung und Abfrage der Reihenfolge.
Es gibt auch eine Vue.js-Version von Magic Grid: https://github.com/imlinus/Vue-Magic-Grid
Ich stieß letztes Jahr auf einige Probleme mit dem ursprünglichen Masonry, als das Grid mit Bildern unterschiedlicher Breiten und Höhen gefüllt wurde. Ich habe über diese Probleme und wie man sie in React umgeht, hier geschrieben: https://www.damiannicholson.com/posts/2018/07/14/creating-a-layout-like-pinterest-with-react-and-the-partition-problem/, da Sie möchten, dass die Bilder dicht gepackt sind, mit einer sauberen Unterkante, während gleichzeitig die Bildseitenverhältnisse beibehalten werden (d. h. keine Bildverzerrung).
Hallo. Ich benötige fast bei jedem zweiten Projekt ein Masonry-Layout. Ich habe kürzlich diese kleine Neufassung von Masonry entdeckt, die sehr wenig JS benötigt, in Kombination mit Flexbox. Falls jemand interessiert ist, schauen Sie es sich an.
https://columnsjs.com
Es funktioniert sowohl in IE als auch in allen anderen modernen Browsern.
Beste Grüße
https://github.com/paulcollett/vue-masonry-css
Von Guido Jansen
Ein Grid, das auf einzelnen Pixeln basiert, befremdet mich ein wenig. Es scheint nicht besonders performant zu sein, besonders mit dem
resize-Handler am Fenster, aber es ist sicherlich clever.