CSS · Masonry · Grid · Browser-Flags · Polyfill
CSS Masonry Layout Draft
Pinterest-Layouts nativ ohne JavaScript

Masonry-Layouts – Raster, bei denen Items unterschiedlicher Höhe lückenlos gestapelt werden – sind seit Jahren ein JavaScript-Problem. Die CSS Masonry Draft-Spezifikation bringt dieses Verhalten nativ in den Browser: grid-template-rows: masonry verspricht, was bisher nur Bibliotheken wie Masonry.js oder Isotope liefern konnten.

11 Min. Lesezeit grid-template-rows: masonry · Browser-Flags · Polyfill-Vergleich · Interop 2025 CSS Grid Level 3 · Experimentell · Firefox / Chrome Nightly

1. Was ist ein Masonry Layout?

Ein CSS Masonry Layout beschreibt ein Raster-Layout, bei dem Items in Spalten angeordnet werden, aber die Zeilenhöhe nicht fixiert ist. Stattdessen rutscht jedes neue Item in die Spalte, die den geringsten verbrauchten vertikalen Platz hat – ähnlich wie Steine beim Mauerbau (englisch: masonry). Das Ergebnis ist ein dichtes Raster ohne Lücken zwischen unterschiedlich hohen Elementen, das Pinterest berühmt gemacht hat.

Das grundlegende Problem mit klassischem CSS Grid: Grid-Layouts basieren auf einem strikten Zeilen-Spalten-Raster. Wenn Items unterschiedliche Höhen haben, entstehen entweder Lücken zwischen ihnen (weil die Zeile so hoch wie das höchste Item ist) oder Items müssen grid-row-span erhalten, was voraussetzt, dass ihre genaue Höhe im Voraus bekannt ist. Beides ist für dynamische Inhalte unbrauchbar. Bisherige Lösungen nutzten entweder JavaScript (Masonry.js, Isotope, react-masonry-css), Multi-Column-Layouts (column-count) oder absolute Positionierung – alle mit erheblichen Nachteilen bei Performance, Zugänglichkeit oder Dokumentenreihenfolge.

Das CSS Masonry Draft löst das Problem auf der Ebene des Layout-Algorithmus selbst: Der Browser berechnet die Platzierung aller Items nach einem Masonry-Algorithmus, ohne dass JavaScript die Element-Höhen messen und Positionen berechnen muss. Das ist nicht nur einfacher zu implementieren, sondern auch performanter und zugänglicher, weil die Dokumentenreihenfolge erhalten bleibt.

2. Die CSS Masonry Draft-Spezifikation

Das CSS Masonry-Feature ist Teil der CSS Grid Layout Level 3-Spezifikation, die vom CSS Working Group entwickelt wird. Der aktuelle Status ist "Editor's Draft" – das bedeutet, die Spezifikation ist noch nicht stabil, aber die grundlegende API ist festgelegt und Implementierungen in Browsern sind vorhanden. Die Spezifikation definiert Masonry als eine Erweiterung des bestehenden Grid-Modells: Ein Grid-Container kann auf einer seiner Achsen den Masonry-Algorithmus anstelle des normalen Grid-Algorithmus verwenden.

Es gab eine wichtige Debatte in der CSS Working Group: Google schlug vor, CSS Masonry als separate Eigenschaft außerhalb von Grid zu definieren (display: masonry), während Mozilla die Integration in Grid (grid-template-rows: masonry) bevorzugte. Nach einer langen Diskussion entschied sich die Working Group für die Grid-Integration, die auch der Mozilla-Implementierung entspricht. Das bedeutet, dass CSS Masonry die gesamte Grid-Toolbox – Gap, Alignment, Spanning, Named Lines – nutzen kann.

3. grid-template-rows: masonry – Syntax und Verhalten

Die grundlegende Syntax für CSS Masonry ist einfach: grid-template-rows: masonry in Kombination mit einer normalen grid-template-columns-Definition. Das masonry-Keyword auf der Zeilenachse aktiviert den Masonry-Algorithmus für diese Richtung. Alternativ kann grid-template-columns: masonry verwendet werden, um ein horizontales Masonry (Spalten wachsen nach rechts, Items füllen in Zeilenrichtung auf) zu erzeugen – was seltener vorkommt, aber für spezielle Layouts nützlich ist.

Das Verhalten des CSS Masonry-Algorithmus: Der Container definiert die Spalten normal (z.B. grid-template-columns: repeat(3, 1fr)). Items werden in Leserichtung platziert, aber nicht in feste Zeilen gezwungen – sie füllen immer die kürzeste vorhandene Spalte. gap funktioniert normal und erzeugt Abstände zwischen allen Items sowohl horizontal als auch vertikal. Items können grid-column: span 2 erhalten, um sich über mehrere Spalten zu erstrecken.

/* CSS Masonry Draft: basic syntax */

/* Enable masonry on the row axis */
.masonry-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-template-rows: masonry; /* activates masonry algorithm */
  gap: 1rem;
}

/* Responsive masonry: auto-fill columns with min width */
.masonry-responsive {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  grid-template-rows: masonry;
  gap: 1.25rem;
}

/* Horizontal masonry (items fill row-by-row) */
.masonry-horizontal {
  display: grid;
  grid-template-rows: repeat(3, auto);
  grid-template-columns: masonry;
  gap: 1rem;
}

/* Feature detection: apply masonry only where supported */
@supports (grid-template-rows: masonry) {
  .gallery {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
    grid-template-rows: masonry;
    gap: 1rem;
  }
}

4. Erstes Beispiel: Bild-Galerie als Masonry Grid

Das praktische CSS Masonry-Beispiel schlechthin ist eine Bild-Galerie mit Fotos unterschiedlicher Seitenverhältnisse. Mit einem normalen Grid würden alle Bilder auf dieselbe Höhe skaliert – man verliert das originale Seitenverhältnis oder bekommt Lücken. Mit CSS Masonry behält jedes Bild sein natürliches Seitenverhältnis, und der Algorithmus stapelt die Bilder lückenlos in die kürzeste Spalte.

Ein wichtiges Detail für Bild-Galerien: img { width: 100%; height: auto; display: block; } ist die Voraussetzung, damit Bilder ihre natürliche Höhe beibehalten und der CSS Masonry-Algorithmus korrekt arbeiten kann. Bilder mit fester Höhe würden den Masonry-Algorithmus aushebeln, weil alle Bilder dann dieselbe Höhe hätten. Der Block-Display verhindert außerdem die Standard-Lücke unter Inline-Bildern.

Für Cards mit variablem Textinhalt – etwa Blog-Beiträge mit unterschiedlicher Teaser-Länge oder Produktkarten mit variablem Beschreibungstext – ist CSS Masonry noch nützlicher. Statt alle Cards auf die höchste zu stretchen oder JavaScript für gleichmäßige Abstände zu schreiben, arrangiert der Browser die Cards automatisch lückenlos. Das ist das Hauptversprechen des Spezifikationsentwurfs.

5. Alignment und Spanning in Masonry Grids

Da CSS Masonry als Grid-Erweiterung definiert ist, gelten die bekannten Alignment-Eigenschaften. justify-items und align-items funktionieren für Items im Masonry-Container. justify-self kann auf einzelnen Items verwendet werden, um sie innerhalb ihrer Spalte zu positionieren. Das ist besonders nützlich für Items, die schmaler als ihre Spalte sind – zum Beispiel Buttons oder kleine Bilder in einem CSS Masonry-Layout.

Spanning ist in CSS Masonry auf die Spaltenachse beschränkt. grid-column: span 2 lässt ein Item zwei Spalten breit werden – das funktioniert wie im normalen Grid. grid-row: span 2 macht in einem Masonry-Layout keinen Sinn, da die Zeilenachse durch den Masonry-Algorithmus kontrolliert wird und keine festen Zeilen hat. Das ist ein wichtiger Unterschied zum regulären Grid-Spanning.

/* CSS Masonry Draft: alignment and spanning */

.masonry-gallery {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-template-rows: masonry;
  gap: 1rem;
  align-tracks: start; /* align items to the top of each track */
}

/* Featured item spans two columns */
.masonry-gallery .featured {
  grid-column: span 2;
}

/* Small item: centered within its column */
.masonry-gallery .small-badge {
  justify-self: center;
  width: 80%;
}

/* Images: natural aspect ratio preserved */
.masonry-gallery img {
  width: 100%;
  height: auto;
  display: block;
  border-radius: 0.5rem;
  object-fit: cover;
}

/* Masonry with named grid lines for semantic spanning */
.masonry-layout {
  display: grid;
  grid-template-columns: [main-start] 1fr 1fr [sidebar-start] 1fr [sidebar-end main-end];
  grid-template-rows: masonry;
  gap: 1.5rem;
}

6. Browser-Flags: So aktiviert man die Vorschau

Das CSS Masonry Draft ist in Firefox und in Chromium-basierten Browsern hinter experimentellen Flags verfügbar. In Firefox kann man grid-template-rows: masonry seit Firefox 77 über layout.css.grid-template-masonry-value.enabled in about:config aktivieren. In Chrome Canary und Chromium Nightly-Builds ist das Feature über den Flag #enable-experimental-web-platform-features in chrome://flags verfügbar. Produktions-Chrome und Safari unterstützen CSS Masonry ohne Flag zum Stand von Mai 2026 noch nicht.

Für die Entwicklung empfiehlt sich Firefox Nightly als Referenzbrowser für CSS Masonry-Features. Die Firefox-Implementierung folgt am engsten der aktuellen Spezifikation, weil Mozilla maßgeblich an der Entwicklung des CSS Masonry-Proposals beteiligt war. Chrome Canary ist für Cross-Browser-Tests nützlich, aber die Implementierungen können in Details abweichen, während die Spezifikation noch nicht abgeschlossen ist.

Für Produktionsumgebungen ist @supports (grid-template-rows: masonry) die richtige Strategie: Im Unterstützungsfall wird das native CSS Masonry-Layout verwendet, außerhalb davon ein Multi-Column- oder flexibles Grid-Fallback. Dieser progressive Enhancement-Ansatz ermöglicht es, heute mit der nativen API zu experimentieren, ohne bestehende Nutzer ohne Unterstützung mit kaputten Layouts zu konfrontieren.

7. Polyfill-Vergleich: JavaScript vs. natives CSS

Vor dem CSS Masonry Draft waren JavaScript-Bibliotheken die einzige valide Option für echte Masonry-Layouts. Die bekannteste ist Desandro's Masonry.js – seit 2010 eine der meistgenutzten Layout-Bibliotheken überhaupt. Sie misst die Höhe jedes Elements, berechnet Positionen, setzt absolute Positionen und reagiert auf Resize-Events. Das Ergebnis ist korrekt, aber teuer: Initiales Layout erfordert DOM-Lesezugriffe für alle Items (Layout Thrashing), Resize-Events müssen debounced werden, und JavaScript muss geladen und ausgeführt sein, bevor das Layout korrekt ist.

Ein alternativer CSS-Ansatz ohne JavaScript ist column-count oder columns: Die Elemente werden in Spalten angeordnet, aber in der Reihenfolge der Spalten, nicht in Leserichtung. Ein Item in Spalte 1 kommt vor einem Item in Spalte 2, egal ob letzteres im HTML früher kommt. Das ist für Inhalte mit semantischer Reihenfolge (z.B. Blog-Posts nach Datum) problematisch – Screenreader und Tab-Navigation folgen der DOM-Reihenfolge, nicht der visuellen Spaltenanordnung. Nativ CSS Masonry löst dieses Problem, weil es die Dokumentenreihenfolge beibehält.

8. CSS Masonry-Ansätze im Vergleich

Die verschiedenen Masonry-Implementierungsansätze unterscheiden sich fundamental in Performance, Zugänglichkeit und Implementierungsaufwand.

Ansatz DOM-Reihenfolge Performance Browser-Support
CSS Masonry Draft Erhalten Nativ, kein JS Nur hinter Flags
Masonry.js Erhalten JS-Overhead, Layout-Thrashing Alle Browser
column-count CSS Spaltenweise Nativ, kein JS Alle Browser
Grid + grid-row: span Erhalten Nativ Alle Browser
Flexbox multi-column Spaltenweise (manuell) Nativ Alle Browser

Die "Grid + grid-row: span"-Variante – die bekannteste CSS-only-Alternative ohne CSS Masonry – funktioniert nur für Inhalte mit bekannten Höhen. Man teilt die Inhaltshöhe durch eine feste Zeilenhöhe (z.B. 10px) und setzt grid-row: span X entsprechend. Das ist wartungsaufwändig, erfordert entweder JavaScript zur Berechnung oder feste Höhen, und scheitert bei dynamischen Inhalten. Es ist die bestmögliche CSS-Annäherung ohne natives CSS Masonry, aber kein vollwertiger Ersatz.

/* CSS Masonry alternatives: current best practices */

/* Option 1: column-count (DOM order caveat!) */
.gallery-columns {
  columns: 3 240px; /* 3 columns, min 240px each */
  column-gap: 1rem;
}
.gallery-columns > * {
  break-inside: avoid; /* prevent items from splitting */
  margin-bottom: 1rem;
}

/* Option 2: CSS Grid with JS-calculated span (dynamic) */
.masonry-grid-approx {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  grid-auto-rows: 10px; /* small row unit for JS span calculation */
  gap: 1rem 1rem;
}
/* JS sets: element.style.gridRowEnd = 'span ' + Math.ceil(height / 10) */

/* Option 3: Progressive enhancement with @supports */
.gallery { columns: 3; column-gap: 1rem; }
.gallery > * { break-inside: avoid; margin-bottom: 1rem; }

@supports (grid-template-rows: masonry) {
  .gallery {
    columns: unset;
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
    grid-template-rows: masonry;
    gap: 1rem;
  }
  .gallery > * { margin-bottom: 0; }
}

9. Interop 2025 und der Weg zur Standardisierung

Das Interop-Projekt ist eine Zusammenarbeit zwischen den Browser-Herstellern Apple, Google, Microsoft und Mozilla, um Cross-Browser-Kompatibilität für wichtige Web-Features zu verbessern. CSS Masonry war ein Kandidat für Interop 2025 und wurde mit hoher Priorität eingestuft, was signalisiert, dass die Browser-Hersteller das Feature für wichtig halten. Interop-Features erhalten koordinierte Implementierungsarbeit in allen beteiligten Browsern – was historisch der schnellste Weg von einem Draft zu Baseline-Status ist.

Für Entwickler bedeutet das: CSS Masonry ist kein spekulatives Feature, sondern eines mit klarem Standardisierungspfad. Die Frage ist nicht ob, sondern wann es ohne Flags in allen Browsern verfügbar sein wird. Die konservative Schätzung basierend auf ähnlichen Features: 12-24 Monate nach Interop-Aufnahme. Das bedeutet, dass Teams heute mit der nativen API experimentieren, Fallback-Strategien entwickeln und sich auf den progressiven Enhancement-Übergang vorbereiten sollten.

Mironsoft

Moderne CSS-Layouts, Masonry-Galerien und Hyvä-Theme-Entwicklung

Masonry-Layouts heute – ohne JavaScript-Overhead?

Wir implementieren Masonry-Galerien mit progressivem Enhancement: natives CSS Masonry für unterstützende Browser, elegante column-count-Fallbacks für alle anderen – und bereiten Projekte auf den vollständigen Browser-Support vor.

Galerie-Layouts

Masonry-Galerien für Magento-Produktseiten und Blog-Listings mit CSS und JS-Fallback

Progressive Enhancement

@supports-basierte Strategie für natives Masonry mit robustem Fallback

Hyvä-Integration

Masonry-Layouts in Tailwind v4 und Alpine.js-Komponenten für Hyvä-Themes

10. Zusammenfassung

Das CSS Masonry Draft bringt natives Masonry-Layout durch grid-template-rows: masonry als Teil der CSS Grid Level 3-Spezifikation. Der Algorithmus platziert Items in die kürzeste verfügbare Spalte, behält die DOM-Reihenfolge bei und macht JavaScript-Bibliotheken wie Masonry.js überflüssig. Gap, Alignment und Spalten-Spanning aus dem regulären Grid-Modell funktionieren vollständig.

Zum Stand Mai 2026 ist CSS Masonry in Firefox Nightly und Chrome Canary hinter Flags verfügbar. @supports (grid-template-rows: masonry) ermöglicht progressive Enhancement: native API für unterstützende Browser, column-count-Fallback für alle anderen. Mit Interop 2025 ist der Standardisierungspfad klar – Projekte, die heute Masonry benötigen, sollten die native API vorbereiten und mit robusten Fallbacks arbeiten.

CSS Masonry Draft — Das Wichtigste auf einen Blick

Syntax

display: grid; grid-template-columns: repeat(3, 1fr); grid-template-rows: masonry; gap: 1rem;

Browser-Support (Mai 2026)

Firefox Nightly (layout.css.grid-template-masonry-value.enabled) und Chrome Canary (#enable-experimental-web-platform-features). Kein Produktions-Support ohne Flag.

Vorteile vs. JS-Polyfills

Kein Layout-Thrashing, DOM-Reihenfolge erhalten, kein JavaScript-Overhead, native Grid-Features (Gap, Alignment, Spanning) verfügbar.

Heutiger Fallback

@supports-Strategie: columns: 3 als Fallback, @supports (grid-template-rows: masonry) für natives Masonry. Progressive Enhancement ohne Kompromisse.

11. FAQ: CSS Masonry Layout

1Was ist CSS Masonry Layout?
Grid-Erweiterung: Items füllen immer die kürzeste Spalte. Dichte Raster mit unterschiedlich hohen Items ohne Lücken – nativ, ohne JavaScript.
2Aktivierung in Firefox?
about:config → layout.css.grid-template-masonry-value.enabled → true. Chrome Canary: chrome://flags → #enable-experimental-web-platform-features.
3Produktionsreif?
Nein (Mai 2026). Nur hinter Flags. @supports-Fallback empfohlen: column-count für alle, natives Masonry wo unterstützt.
4Besser als column-count?
Ja – DOM-Reihenfolge bleibt erhalten. column-count trennt visuelle von DOM-Reihenfolge, was Screenreader und Tab-Navigation falsch macht.
5gap in CSS Masonry?
Ja. gap, column-gap und row-gap funktionieren wie im regulären Grid – zwischen allen Items horizontal und vertikal.
6Spalten-Spanning möglich?
Ja. grid-column: span 2 funktioniert. grid-row: span hat keine Wirkung – die Zeilenachse ist durch den Masonry-Algorithmus kontrolliert.
7CSS Masonry vs. Masonry.js?
Masonry.js misst DOM-Elemente mit JS und setzt absolute Positionen – Layout-Thrashing. Nativ: Teil des Browser-Renderings, kein JS-Overhead.
8Was ist Interop 2025?
Koordinierte Browser-Implementierung wichtiger Web-Features durch Apple, Google, Microsoft und Mozilla. CSS Masonry als Kandidat bedeutet priorisierte Standardisierung.
9Sicherer Fallback?
.gallery { columns: 3; } @supports (grid-template-rows: masonry) { .gallery { columns: unset; display: grid; grid-template-rows: masonry; } }
10Debatte: Grid vs. display: masonry?
Google wollte display: masonry, Mozilla die Grid-Integration. Working Group entschied Grid-Integration – ermöglicht Zugriff auf Gap, Alignment und Spanning.