Responsive Masonry Layouts mit CSS erstellen
Mit CSS Grid Lanes können echte Masonry-Layouts ohne JavaScript realisiert werden.
Mit dem sog. Masonry-Layout können Inhalte wie Bilder oder Card-Elemente ansprechend und platzsparend auf einer Website angezeigt werden. Im Gegensatz zu »klassischen Rastern« zeichnet es sich durch eine versetzte Kachel-Optik aus – daher auch der Name (Masonry = Mauerwerk). Lange Zeit war ein echtes Masonry-Layout nur mit JavaScript umsetzbar. Mit display: grid-lanes gibt es eine native CSS-Lösung.
Was ist das »echte« Masonry?
Das echte Masonry-Layout unterscheidet sich von den nicht echten Varianten durch die Leserichtung: Inhalte werden von links nach rechts angeordnet, nicht spaltenweise. Insbesondere bei langen Listen und in responsiven Layouts spielt das echte Masonry seine Stärken aus.

Natives CSS Masonry mit display: grid-lanes
Die CSS Grid Layout Level 3 Spezifikation definiert Masonry als eigenständigen display-Wert: grid-lanes. Masonry ist damit kein Teil von CSS Grid mehr, sondern eine eigene Layout-Methode. Spalten werden wie im CSS Grid-Layout definiert; auf der Zeilenachse ordnen sich die Elemente automatisch lückenlos an.
Ein minimales Beispiel:
.masonry {
display: grid-lanes;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: 1em;
}Das war es. Kein weiterer Code notwendig. Die Elemente im Container ordnen sich automatisch im Masonry-Stil an. Eine umfangreiche Übersicht über alle Features inkl. Layout-Generator findet ihr bei Webkit.
Fallback-Verhalten
In Browsern ohne Unterstützung für display: grid-lanes wird der Wert ignoriert. Als Progressive Enhancement empfiehlt sich deshalb, zuerst ein CSS-Columns- oder Grid-Fallback zu definieren und display: grid-lanes anschließend mit @supports zu überschreiben:
.masonry {
columns: 250px;
gap: 1em;
}
@supports (display: grid-lanes) {
.masonry {
display: grid-lanes;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
columns: unset;
}
} Browser Support
Den detaillierten Browser-Support für dieses Feature könnt ihr auf caniuse.com einsehen.
Ältere Lösungen
Die folgenden Ansätze dokumentieren, wie Masonry-Layouts vor der nativen CSS-Lösung umgesetzt wurden. Sie sind für aktuelle Projekte nicht mehr empfehlenswert, aber als Referenz weiterhin nützlich.
CSS Columns (Fake Masonry)
Mit CSS Columns lässt sich optisch ein Masonry-Layout erzeugen. Der Nachteil: Die Leserichtung verläuft spaltenweise, nicht von links nach rechts.
.fake-masonry {
column-width: 300px;
column-gap: 1em;
}Flexbox und order (Fake Masonry)
Auf Basis von Flexbox lässt sich ebenfalls ein Masonry-Effekt erzeugen. Die Lösung erfordert jedoch sehr viel CSS und funktioniert bei flexiblen Container-Höhen und responsiven Layouts nur eingeschränkt.
.fake-masonry {
display: flex;
flex-flow: column wrap;
align-content: space-between;
height: 665px;
}
.fake-masonry::before,
.fake-masonry::after {
content: "";
flex-basis: 100%;
width: 0;
order: 2;
}
.item {
box-sizing: border-box;
width: 32%;
margin-bottom: 2%;
padding: 1em;
}
.item:nth-child(3n+1) { order: 1; }
.item:nth-child(3n+2) { order: 2; }
.item:nth-child(3n) { order: 3; }Lösungen mit JavaScript
Vor der nativen CSS-Lösung war JavaScript die einzige Möglichkeit für ein echtes Masonry-Layout. Das originale Masonry-Script von David DeSandro ist die bekannteste Bibliothek; daneben existieren zahlreiche weitere.
[…] Theme gegen den Strom schwimme. Eine Webseite muss heute unbedingt eine Startseite im Grid- oder Masonry-Layout besitzen. Der eigentliche Blog sollte zwei Spalten bestehen. Das alles ist hier nicht zu […]
Danke für die Hilfe. Dein Artikel hat mich auf die Lösung gebracht, wie der ungewollte Umbruch verhindert werden kann. Hat wirklich sehr geholfen.
Ich lasse jetzt die Ergebnisse einer Suche nach Kochrezepten ganz elegant über eine Liste in 3 Spalten reinfließen. Vorlage war natürlich Pinterest.
[…] Beitrag mit Beispielen und Code zum Thema Pinterest Style mit CSS3 hat Jonas Hellwig auf seinem Blog Kulturbanause veröffentlicht. Mit Hilfe von CSS-Columns […]
[…] Pinterest style layout https://blog.kulturbanause.de/2014/03/responsive-pinterest-style-layout-mit-css3/ […]
Wer sich die grauen Haare sparen will, kann übrigens Isotope einsetzen:
http://isotope.metafizzy.co/
Das ist zwar für den kommerziellen Einsatz kostenpflichtig ($ 25 Entwickler, $ 90 Team), aber die einmal zu bezahlende (!) Lizenz lohnt sich. Wir haben Stunden bei dem Versuch verbraten, etwas ähnliches zu machen, und es nie annähernd hinbekommen.
Viele kommerzielle Templates setzen auf Isotope, man sieht das oft erst, wenn man genau in den Code schaut.
Funktioniert das Ganze Internet Explorer 9 und 8?
Nein, halte ich in diesem Zusammenhang allerdings nicht für schlimm. Inkompatible Browser erhalten eine einspaltige Darstellung als Fallback. Es ist halt immer die Frage wie es eingesetzt wird. In meinem Fall war es absolut okay, übrigens auch was die Reihenfolge angeht. Siehe auch: http://html5please.com/#multicolumn
Vielen Dank für deine ausführliche Antwort!
Leider ist die Lösung auch nicht optimal, da die Boxen nun vertikal statt horizontal angeordnet werden (erste Reihe liest sich 1,4,8,11…).
Das gleiche Problem hatten wir auch, wollte aber auf eine Script-Lösung verzichten.. Leider scheint es keine saubere, CSS reine Lösung zu geben :/
Mittels display:flex, order und einer Serverseitigen Ausgabelogik könntest du das Problem ohne weiteres in den Griff kriegen =)
Habe selber auch Ewigkeiten an einer Lösung ohne JS getüfftelt, doch zu meinem Vorteil verwende ich Google AMP auf meiner Seite, da bleiben mir, was eigenes JS angeht, die Hände gebunden.
Das Problem bei der Multiple Columns Lösung ist m.E. die Reihenfolge. In den meisten Fällen möchte man seine neuesten „Pins“ ja oben auf der Seite haben und nicht in der ersten Spalte, es sei denn man scrollt seitwärts.