Innerhalb von Drupal 10 Core implementieren wir eine neue automatische CSS-Grid-Technik, die meiner Meinung nach cool genug ist, um sie mit der Welt zu teilen.
Die Anforderungen sind
- Der Benutzer gibt eine maximale Anzahl von Spalten an. Dies ist der "natürliche" Zustand des automatisch befüllbaren Grids.
- Wenn eine Grid-Zelle eine vom Benutzer angegebene Breite unterschreitet, passt sich das automatisch befüllbare Grid an und verringert die Anzahl der Spalten.
- Die Grid-Zellen sollten sich immer so dehnen, dass sie die Breite des automatisch befüllbaren Grid-Containers ausfüllen, unabhängig von der Spaltenanzahl.
- All dies sollte unabhängig von der Ansichtsfensterbreite funktionieren und kein JavaScript erfordern.

Das automatisch befüllbare CSS-Grid in Aktion
Hier sehen Sie, wie sich das resultierende automatisch befüllbare CSS-Grid verhält, wenn es durch das ziehbare Div-Element links davon komprimiert wird.
Hier ist der Code
Wenn Sie nicht an der Theorie hinter dem automatisch befüllbaren Grid interessiert sind und einfach nur Code kopieren/einfügen möchten, hier ist er!
.grid-container {
/**
* User input values.
*/
--grid-layout-gap: 10px;
--grid-column-count: 4;
--grid-item--min-width: 100px;
/**
* Calculated values.
*/
--gap-count: calc(var(--grid-column-count) - 1);
--total-gap-width: calc(var(--gap-count) * var(--grid-layout-gap));
--grid-item--max-width: calc((100% - var(--total-gap-width)) / var(--grid-column-count));
display: grid;
grid-template-columns: repeat(auto-fill, minmax(max(var(--grid-item--min-width), var(--grid-item--max-width)), 1fr));
grid-gap: var(--grid-layout-gap);
}
Theorie und Werkzeuge hinter dem automatisch befüllbaren CSS-Grid
Der obige Code verwendet mehrere moderne CSS-Werkzeuge, darunter die Funktionen repeat(), auto-fill() und minmax() von CSS Grid sowie die CSS-Funktionen max() und calc(). Hier ist, wie es funktioniert.
Die auto-fill()-Funktion von CSS Grid
Der Schlüssel zu all dem ist auto-fill(). Wir möchten, dass jede Zeile mit so vielen Spalten wie möglich gefüllt wird. Für weitere Informationen zu auto-fill lesen Sie den großartigen Artikel von Sara Soueidan über den Unterschied zwischen auto-fill und auto-fit, der dieses hilfreiche Video enthält, das zeigt, wie es funktioniert.
Aber wie stellen wir sicher, dass es nicht *zu viele* Spalten auffüllt?
Die CSS-Funktion max()
Dafür ist die Funktion max() da! Wir möchten, dass die Breite jeder Grid-Zelle maximal einen bestimmten Prozentsatz beträgt, sagen wir 25% für ein Grid mit vier Spalten. Aber sie darf nicht unter die vom Benutzer angegebene Mindestbreite fallen.
Unter der Annahme eines Grids mit vier Spalten und einer Mindestbreite der Zelle von 100px würde die Funktion max() etwa so aussehen: max(25%, 100px).
Der Wert 25% ist jedoch immer noch nicht ganz korrekt, da er die Grid-Abstände nicht berücksichtigt. Was wir wirklich brauchen, ist stattdessen etwas wie dies:
max(calc(25% - <grid-gap-for-one-cell>), 100px)
Das können wir in CSS mit calc() berechnen! (Wer sagt, CSS sei keine Programmierung?)
--gap-count: calc(var(--grid-column-count) - 1);
--total-gap-width: calc(var(--gap-count) * var(--grid-layout-gap));
--grid-item--max-width: calc((100% - var(--total-gap-width)) / var(--grid-column-count));
Jetzt haben wir einen weiteren Schlüssel, um dies zu ermöglichen! Dies weist der Grid-Zelle an, ihre maximale Breite zu erreichen (die die vom Benutzer angegebenen Spalten berücksichtigt), wird aber niemals kleiner als 100px.
max(100px, var(--grid-item--max-width))
Erfahren Sie mehr über die Funktion max() in Chris Coyiers Artikel über die CSS-Funktionen min(),max() und clamp().
Die minmax()-Funktion von CSS Grid
Wir nähern uns, aber eine wichtige Zutat fehlt noch: Das Grid dehnt sich nicht immer auf die Breite seines übergeordneten Containers aus.
Genau dafür ist die Funktion minmax() konzipiert. Die folgende CSS legt die Mindestbreite auf die <grid-item-width> fest, und wenn Platz vorhanden ist, dehnt sie alle Zellen gleichmäßig aus, um die Breite des übergeordneten Elements auszufüllen!
minmax(<grid-item-width>, 1fr)
Fassen wir alles zusammen und zaubern!
Mit den oben genannten Werkzeugen können wir dieses magische Stück Code zusammenstellen, das genau das tut, was wir wollen!
--gap-count: calc(var(--grid-column-count) - 1);
--total-gap-width: calc(var(--gap-count) * var(--grid-layout-gap));
--grid-item--max-width: calc((100% - var(--total-gap-width)) / var(--grid-column-count));
grid-template-columns: repeat(auto-fill, minmax(max(var(--grid-item--min-width), var(--grid-item--max-width)), 1fr));
CSS macht Spaß!
CSS hat sich wirklich weiterentwickelt. Ich hatte viel Spaß bei der Arbeit daran, und ich bin so glücklich, dass Anwendungsfälle wie dieser jetzt ohne JavaScript möglich sind.
Besonderer Dank an Andy Blum, der auto-fill() gegenüber auto-fit() vorgeschlagen hat. Außerdem ein besonders großer Dank an alle Implementierer und Spezifikationsautoren, die fortgeschrittene Funktionen wie diese standardisiert und möglich machen.
Coole Einrichtung, zeigt wirklich die Leistungsfähigkeit von Grid-Layouts in Verbindung mit den neuen Funktionen.
Ich vermisse vielleicht etwas, aber der Name
--grid-item--max-widthscheint irreführend. Es ist kein Maximalwert, es ist ein Minimalwert wie der andere – ein Element wird niemals schmaler als einer von beiden.Ja, ich kann diesen Standpunkt nachvollziehen. Aber es ist nicht wirklich die minimal mögliche Breite. Es ist die "normale" Breite. Ich habe diese einfach
--grid-item--max-widthgenannt, weil sie nicht fest auf einen bestimmten Wert inpx(oder was auch immer) codiert ist.Du verstehst es richtig, es ist nur schwierig, das zu benennen :)
DANKE!!!
ERNSTHAFT DANKE!!!
Ha! Das hat mich zum Lächeln gebracht. Gern geschehen!
Wirklich cool! Die Verwendung von CSS Grid mit calc macht es wirklich leistungsstark.
Ich habe etwas Ähnliches mit dem Fylgja Auto-Grid gemacht.
Ich habe noch nie von Fylgja gehört... aber es sieht wirklich ähnlich aus (und ist cool!). Wenn man sich den Quellcode ansieht, ist es fast dasselbe, mit der Ausnahme, dass sie keine maximale Spaltenanzahl unterstützen.
Cool! Aber schau dir das an, wenn du nicht nur eine maximale Spaltenanzahl, sondern auch eine minimale Spaltenanzahl nur mit CSS angeben möchtest.
Erklärung
https://stackoverflow.com/questions/52417889/setting-minimum-and-maximum-number-of-columns-using-css-grid/52418341/#69154193
Demonstration
Ich habe auch einen ähnlichen Ansatz, um ein Grid mit nur einer maximalen Spaltenanzahl zu definieren
Ich experimentiere gerade mit einem Grid-System, das auf einer ähnlichen Idee basiert. Hier ist eine Dokumentationsseite dafür: https://fluid-grid.com/
Schauen Sie es sich einfach an, ich sammle gerade Feedback ;)
Das ist so cool! Die Dokumentation und die interaktiven Beispiele sind sehr gut. Ich habe Spaß damit und hoffe, viel zu lernen. Danke für die Zusammenstellung!
Hallo, coole Sache! Ich habe es gerade ausprobiert und glaube, ich habe ein kleines Problem gefunden: Ich bekomme immer eine Spalte weniger, als ich angebe.
Also gibt
--grid-column-count: 4mir 3 Spalten,--grid-column-count: 3gibt mir 2 Spalten und so weiter.Vergessen Sie meinen vorherigen Kommentar – ich habe den Abstand später in meinem CSS überschrieben. Das verursachte meine falsche Spaltenanzahl. Tolle Anleitung!!
Wirklich cool.
Aber hat jemand das gleiche Problem mit gulp-sass?
Fehler: „var(–grid-item–min-width)“ ist keine Zahl für `max’
Versuchen Sie Sass-Interpolation (https://sass-lang.de/documentation/interpolation). Wickeln Sie es im Grunde in
#{...}ein.Falls jemand anderes dieses Problem hat, kann es behoben werden, indem das Schlüsselwort
max(odermin) großgeschrieben wird.Wenn dies also fehlschlägt
minmax(max(var(--grid-item--min-width)Es sollte funktionieren, wenn Sie es so schreiben
minmax(Max(var(--grid-item--min-width)Ich habe die Antwort in diesem Thread auf GitHub gefunden.
Das ist fantastisch und passt perfekt zu meinem Anwendungsfall in einem Projekt, an dem ich arbeite. Vielen Dank für das Teilen.
Juhu!
Toller Beitrag! Ich liebe, wie dynamisch diese Lösung ist.
Wie würde man die Höhe des .grid-item auf die aktuelle Spaltenbreite setzen? Ich möchte, dass die Grid-Items perfekte Quadrate sind, aber ich schaffe es nicht ganz zu verstehen, wie ich die Funktion verwenden könnte, um die Spaltenbreite in Pixeln zu ermitteln und die Höhe des .grid-item darauf einzustellen.
Meine aktuellen Versuche konzentrierten sich darauf, die Zeilenhöhe gleich der Spaltenbreite zu setzen, aber alle waren erfolglos.
Jede Hilfe wäre sehr willkommen!
Sie müssen nicht in das Grid-System eingreifen. Um perfekte Quadrate zu erstellen, verwenden Sie die CSS-Eigenschaft
aspect-ratio. https://developer.mozilla.org/en-US/docs/Web/CSS/aspect-ratioOh wow, ich habe die Lösung übermäßig kompliziert. Danke!
Ich habe gerade den Artikel „Making Rainbows with CSS“ auf Ihrer Website gelesen. Ich hoffe, in Zukunft mehr von Ihren Inhalten auf CSS-tricks zu sehen.
Fantastische Ausarbeitung! Was ich nicht sehe, ist, wie
--grid-column-countaktualisiert wird. Die gesamte Mathematik hängt davon ab, dass dieser Wert dynamisch ist, oder?Danke!
Ja,
--grid-layout-gap,--grid-column-countund--grid-item--min-widthkönnen alle dynamisch sein.Sie benötigen entweder serverseitiges Templating oder JavaScript, um die Eigenschaften als Inline-Stil auf das
.grid-container-Element (oder eines seiner Vorfahren) anzuwenden.Schauen Sie sich mein Codepen unter https://codepen.io/mherchel/pen/xxXXbog an, um ein Beispiel dafür zu sehen, wie der Inline-Stil über JavaScript eingefügt wird.
Woa, großartig! Danke für diesen Tipp, das ist definitiv jenseits meines Könnens ;)
beste Grüße
Danke! Grid ist lustig. Spielen Sie damit herum und Sie können coole Dinge herausfinden :)
Gibt es eine Möglichkeit, die Anzahl der Spalten auf 1, 2 oder 4 zu erzwingen? Ich arbeite an einem Layout mit Bootstrap-Karten, bei denen ich maximal 4 Spalten haben möchte. 1 oder 2 Spalten sehen auf Mobiltelefonen oder kleinen Bildschirmen gut aus, aber es sieht schlecht aus, wenn es 3 Spalten erreicht.
Ich nehme an, ich könnte Media Queries verwenden, aber das scheint den Zweck eines flexiblen Layouts wie diesem zu verfehlen.
Großartig, genau das, was ich brauchte! Danke für die großartige Anleitung und das Teilen Ihres Codes.
Toller Beitrag!! Ist es möglich, die Mindestbreite jedes Elements an die Inhaltsbreite anzupassen?
Das ist so cool, vielen Dank!
Eine kleine Sache, die mir aufgefallen ist, ist, dass, da der Wert für
--grid-item--min-widthfest ist (z. B. 250px), es zu einem Überlauf auf der X-Achse kommen kann, wenn das Ansichtsfenster sehr schmal wird.Um dies zu verhindern, könnten Sie Ihre
--grid-item--min-widthauf das Minimum zwischen dem Benutzereingabewert und 100% setzen, alsoWas denkst du? ☺️