Warum ist CSS Grid ein großes Ding und warum sollten wir uns darum kümmern?
Nun, CSS Grid ist das erste echte Layout-System für das Web. Es wurde entwickelt, um Inhalte sowohl in Spalten als auch in Zeilen zu organisieren und gibt Entwicklern endlich fast gottähnliche Kontrolle über die Bildschirme vor uns. Das bedeutet, dass wir jahrzehntelange Hacks und Workarounds zum Platzieren von Elementen auf einer Webseite endlich aufgeben können – letztendlich bedeutet dies, dass komplexe Layouts und schön typografierte Seiten nun nicht nur möglich, sondern auch *einfach* und *wartbar* sind.
Mit CSS Grid wird das Web ein viel schönerer Ort werden, als wir es gewohnt sind.
Okay, aber wie funktioniert Grid? Es gibt viele komplexe Tutorials da draußen, die sich mit sehr vielen Details befassen, aber ich denke, wir sollten mit den absoluten Grundlagen beginnen. Was wir hier machen werden, ist ein relativ einfaches Typenmuster mit einer Reihe von Zeichen aus einem Alphabet, die auf einer Seite angeordnet sind.
Um loszulegen, fügen wir unser Markup hinzu
<div class='wrapper'>
<div class='letter'>
A
</div>
<div class='letter'>
B
</div>
</div>
Zuerst stylen wir diese Buchstaben, um die richtige `font-size` und `color` zu verwenden, und zentrieren dann diese Buchstaben in den Divs mit Flexbox-Eigenschaften wie `align-items` und `justify-content`. Und ja, das stimmt! CSS Grid ersetzt Flexbox-Eigenschaften nicht, sondern ergänzt sie, was sie bereits tun. Wir können sogar viele dieser Eigenschaften in Verbindung mit CSS Grid verwenden. Aber vorerst kehren wir zur Demo zurück

Im obigen Beispiel haben wir zwei einfache Divs, die übereinander liegen, weil sie standardmäßig `display: block` haben. Als nächstes stellen wir unser Elternelement so ein, dass es das Grid-Layout verwendet
.wrapper {
display: grid;
}
Was dann zu diesem Ergebnis führt
Siehe den Pen Type Specimen Grid Demo – 1 von Robin Rendle (@robinrendle) auf CodePen.
Jetzt stellen Sie vielleicht fest, dass nichts wirklich passiert ist. Und Sie hätten Recht! Im Gegensatz zum Setzen von `display: inline-block;` oder `display: inline;` ist nicht ganz klar, was passiert, wenn wir display auf `grid` setzen. Tatsächlich müssen wir unserem Grid zuerst eine bestimmte Anzahl von Spalten oder Zeilen zuweisen, damit es überhaupt *etwas* tut. In diesem Beispiel werden wir die Buchstaben einfach nebeneinander in zwei Spalten ausrichten
.wrapper {
display: grid;
grid-template-columns: 1fr 1fr;
grid-column-gap: 1px;
background-color: black;
}
Lassen Sie uns diese neuen Codezeilen aufschlüsseln. Zuerst erstellen wir zwei Spalten für unser Grid mit `grid-template-columns`. Dieser Wert von `1fr` mag seltsam erscheinen, wenn Sie ihn noch nie zuvor gesehen haben, aber es ist eine gültige CSS-Einheit, die jeder Spalte sagt, dass sie einen Bruchteil unseres Grids ausmachen soll. In diesem Fall bedeutet dies, dass es zwei Spalten gleicher Breite geben wird.
Das wird dann etwa so aussehen
Siehe den Pen Type Specimen Grid Demo – 2 von Robin Rendle (@robinrendle) auf CodePen.
Juhu! Es funktioniert. Aber sehen Sie diese merkwürdige Lücke zwischen den beiden Spalten? Das ist der Hintergrund des `wrapper`, der durch jeden `letter`-Div schimmert, und das liegt daran, dass wir die Eigenschaft `grid-column-gap` auf 1px gesetzt haben. Normalerweise würden wir einen größeren `column-gap` wünschen, besonders wenn wir Textblöcke nebeneinander ausrichten. Aber in diesem Fall ist ein Pixel gut genug für uns.
Was passiert also, wenn wir zwei neue Buchstaben zu unserem Markup hinzufügen? Wie wird sich das auf das Layout auswirken?
<div class='wrapper'>
<div class='letter'>
A
</div>
<div class='letter'>
B
</div>
<div class='letter'>
C
</div>
<div class='letter'>
D
</div>
</div>
Nun, technisch gesehen wird sich das Grid überhaupt nicht ändern – wir haben dem Grid bereits gesagt, dass es zwei Spalten haben soll, also werden diese beiden Letter-Divs direkt unter den anderen ihren Platz finden und genau `1fr` breit sein.
Siehe den Pen Type Specimen Grid Demo – 3 von Robin Rendle (@robinrendle) auf CodePen.
Nun kommt das Seltsame – warum gibt es keine 1-Pixel-Lücke zwischen den Buchstaben A und C sowie zwischen B und D? Nun, `grid-column-gap` ist nur für Spalten, und was wir hier effektiv getan haben, ist die Erstellung einer neuen *Zeile* in unserem Grid. Wir müssen `grid-row-gap` verwenden, damit diese Änderung wirksam wird
.wrapper {
grid-column-gap: 1px;
grid-row-gap: 1px;
/* other styles go here */
/* we could have also used the shorthand `grid-gap` */
}
Und so sieht das aus
Siehe den Pen Type Specimen Grid Demo – 4 von Robin Rendle (@robinrendle) auf CodePen.
Wir haben unser allererstes Grid erstellt. Wir haben eine Zeile und eine Spalte erstellt, und alles, was wir wirklich tun mussten, war, das Markup zu ändern. Aber lassen Sie uns unsere Spalten noch ein wenig genauer betrachten. Was würde passieren, wenn wir der `grid-template-columns`-Eigenschaft einen weiteren Wert hinzufügen? So
.wrapper {
grid-template-columns: 1fr 1fr 1fr;
}
Nun, wir würden natürlich eine weitere Spalte erstellen! Und beachten Sie, wie wir den Hintergrund des `wrapper`-Elements jetzt deutlich sehen können, weil keine Kinder vorhanden sind, um diesen Platz zu füllen.
Siehe den Pen Type Specimen Grid Demo – 5 von Robin Rendle (@robinrendle) auf CodePen.
Und wenn wir den Wert eines `fr` in dieser Eigenschaft ändern, würden wir effektiv das erstellen, was als asymmetrisches Grid bekannt ist. Nehmen wir an, wir möchten, dass unsere erste Spalte in unserem Grid dreimal so viel Platz einnimmt wie die anderen beiden Spalten
.wrapper {
grid-template-columns: 3fr 1fr 1fr;
}
Dies würde dazu führen, dass die Spalten mit *A* und *D* größer sind als die anderen beiden Spalten, genau wie wir es erwarten würden
Siehe den Pen Type Specimen Grid Demo – 6 von Robin Rendle (@robinrendle) auf CodePen.
Ist das nicht mächtig? Wir müssen uns nicht mehr um negative Margins oder den perfekten %-Wert einer Grid-Spalte kümmern, um Dinge richtig auszurichten. Wir können super komplexe Grids erstellen, ohne die Berechnungen durchführen zu müssen, die uns früher gezwungen waren. Jetzt müssen wir nur einen neuen Wert zur `grid-template-columns`-Eigenschaft hinzufügen und voilà, eine neue Grid-Spalte erscheint wie von Zauberhand!
Aber was ist mit responsiven Grids, könnten Sie fragen? Nun, das ist wirklich genauso einfach wie das Ändern dieser Eigenschaft innerhalb einer Media Query. Nehmen wir an, wir möchten 2 Spalten als unsere Standard-Gridgröße, dann bei 500 Pixeln möchten wir 3 Spalten und schließlich, auf größeren Bildschirmen, werden wir den gesamten Inhalt in 4 Spalten verschieben. Alles, was wir schreiben müssten, ist dies
.wrapper {
display: grid;
grid-template-columns: 1fr 1fr;
}
@media screen and (min-width: 500px) {
.wrapper {
grid-template-columns: 1fr 1fr 1fr;
}
}
@media screen and (min-width: 800px) {
.wrapper {
grid-template-columns: 1fr 1fr 1fr 1fr;
}
}
Stellen Sie sicher, dass Sie diese Demo in einem neuen Tab öffnen und die Größe des Viewports ändern, um die responsive Magie zu sehen!

Die Eigenschaft `grid-template-columns` ist also viel komplizierter, als ich hier gezeigt habe, aber dies ist ein großartiger Ausgangspunkt. Als Nächstes sollten wir über die wirklich lebensverändernde Eigenschaft im CSS Grid-Standard lernen: `grid-template-rows`.
Okay, gehen wir blind hinein. Lassen Sie uns in dem kleinen Codeausschnitt unten und mit dem, was wir bisher über Grid gelernt haben, herausfinden, was diese neue Eigenschaft tun könnte
.wrapper {
display: grid;
grid-template-columns: 3fr 1fr 1fr;
grid-template-rows: 1fr 3fr;
}
Anstatt die Breite von Spalten und ihre Beziehung zueinander festzulegen, legen wir nun die Höhe von Zeilen und ihre Beziehung fest. Wenn wir also zwei Zeilen wie in unserer vorherigen Demo haben und die letzte Einheit auf 3fr gesetzt ist, bedeutet dies, dass die zweite Zeile immer dreimal so hoch sein wird wie die erste.
Siehe den Pen Type Specimen Grid Demo – 8 von Robin Rendle (@robinrendle) auf CodePen.
Das mag ziemlich einfach aussehen, aber bisher konnten wir das noch nie wirklich tun. Wir mussten immer hässliche Hacks schreiben, wie das Setzen einer `min-height` auf ein bestimmtes Element oder das Ändern eines Klassennamens. Aber wir konnten noch nie *Beziehungen* zwischen Zeilen wie diese herstellen; das ist es, was CSS Grid so mächtig macht.
Mit diesem winzigen Wissensschatz und einer Handvoll neuer Eigenschaften können wir fabelhaft komplexe Layouts erstellen – asymmetrische und responsive Grids sind nur ein kleiner Teil davon. Und bisher war dies nur ein Einblick in den monströsen CSS Grid-Standard, da es noch viel zu behandeln gibt. Aber ich denke, Jen Simmons hat es am besten beschrieben, als sie über Grid schrieb
Wir müssen CSS Grid erkunden, bis wir verstehen, was es tun will, wozu es gezwungen werden kann und was es ablehnt. Viele Designer werden vielleicht nie lernen, CSS zu codieren, aber Sie müssen CSS gut genug verstehen, um unser künstlerisches Medium zu verstehen.
Und sicher, all der obige Code sieht zuerst sehr seltsam aus. Aber was es bedeutet ist, dass wir keine riesigen CSS-Frameworks verwenden müssen und auch eine ganze Reihe von Layout-Hacks jetzt völlig irrelevant sind. Aber was mich an Grid am meisten begeistert, ist, dass es uns zwingt, den Raum in einem Browser auf eine völlig neue Weise zu betrachten.
Wir werden nicht nur eine Reihe neuer Eigenschaften lernen müssen, sondern auch unsere bisherigen Erkenntnisse komplett überdenken müssen. CSS Grid ist also nicht nur ein Standard, sondern eine seltsame Philosophie an sich.
Finden wir es gemeinsam heraus!
Browser-Unterstützung
Diese Browser-Unterstützungsdaten stammen von Caniuse, die weitere Details enthält. Eine Zahl gibt an, dass der Browser die Funktion ab dieser Version und höher unterstützt.
Desktop
| Chrome | Firefox | IE | Edge | Safari |
|---|---|---|---|---|
| 57 | 52 | 11* | 16 | 10.1 |
Mobil / Tablet
| Android Chrome | Android Firefox | Android | iOS Safari |
|---|---|---|---|
| 127 | 127 | 127 | 10.3 |
Weitere Informationen
- Jen Simmons und Rachel Andrew haben viele erstaunliche Tutorials und Anleitungen zu diesem Thema geschrieben
- Grid Inspector Tools in Firefox sind super praktisch
- Wir haben einen vollständigen Leitfaden für Grid, der auf jede Eigenschaft und jeden Wert detaillierter eingeht
Verzeihen Sie die einfache Frage, aber warum ist es besser, sich darauf zu verlassen, dass jede Browserfirma Unterstützung einbaut (und sie auf dem neuesten Stand hält), als eine CSS-Datei einzubinden?
Ich war auf Chrome 56 und keiner der Demos funktionierte, bis ich auf 57 aktualisierte. In Firefox dasselbe. Keine Demos funktionierten, bis ich aktualisierte. Ich habe auch IE11. Sie funktionieren nicht und ich nehme an, sie werden es tun.
Verdammt. Das sollte heißen *niemals*
Meinten Sie eine JavaScript-Datei (Polyfill)?
Das Einbinden einer CSS-Datei für CSS Grid würde absolut nichts nützen, da ältere Browser CSS gar nicht verstehen. Wenn ein Browser CSS nicht versteht, überspringt er es per Design.
Der Grund, warum Sie Chrome und Firefox aktualisieren mussten, ist, dass nur die aktuellsten Versionen CSS Grid unterstützen.
Eine vernünftige Frage, tatsächlich, obwohl ich nicht sicher bin, ob ich die richtige Person bin, um sie zu beantworten, da all mein Wissen über modernes Webdesign Buchwissen ist. Es kommt hauptsächlich auf die Tatsache an, dass CSS-Grid (der Standard) weitaus flexibler ist als die Grid-Systeme, die von Nicht-CSS-Grid-CSS implementiert werden.
Es kann leicht Effekte erzielen, die mit Grid-Systemen schwierig oder unmöglich sind, ohne viel Boilerplate, JavaScript oder Annahmen hinzuzufügen. Insbesondere erlaubt es, dass die Quellreihenfolge keinen Einfluss auf die Positionierung auf der Seite selbst hat, sowohl vertikal als auch horizontal, soweit ich das verstehe.
Es kann auch Größenbeziehungen erzielen, bei denen die Größe der Referenz-"Zelle" durch den Fluss des Inhalts bestimmt wird, anstatt sie vorher zu berechnen. Es wäre einfach, eine Demo von jedem dieser Elemente mit einem herkömmlichen Grid-System zu erstellen, aber das liegt daran, dass diese Demos alle leicht vorkalkuliert sind. Stellen Sie sich vor, Sie versuchen, etwas wie dies einzurichten, bei dem der Inhalt der Zellen auf Benutzereingaben basiert, sodass Sie nicht einfach sagen können: "Dieser Kontext hat eine Höhe von X*3, damit er dreimal so hoch ist wie dieser andere Kontext, der eine Höhe von X hat."
Grundsätzlich ist dieser Artikel eine Einführung in CSS-Grid, er befasst sich nicht wirklich mit einigen der fortgeschritteneren Dinge, die CSS-Grid tun kann. Er betont auch nicht die Tatsache, dass CSS-Grid dies mit beliebigem Inhalt tun kann und das Grid bei Bedarf anpasst, um das Grid auszubalancieren. Und ja, CSS kann Hinweise und Regeln dafür geben, wie die Zellen wachsen und sich gegenseitig verdrängen.
Oh Mann, bis ich Ihren Kommentar sah, war ich sehr verwirrt. Ich dachte, ich würde mich verlesen, aber es stellt sich heraus, dass mein Chrome nicht automatisch aktualisiert hat, wie ich dachte. Nach dem Update sieht es viel anders aus und ergibt Sinn (offensichtlich), aber ich stimme Ihnen zu, wir werden in CSS Fallbacks für ein paar Generationen anbieten müssen, und in diesem Fall möchten Sie CSS Grid vorerst aufgeben, bis Generationen von Browsern abfallen.
In der Zwischenzeit erinnert es mich an die Verwendung von srcset für Bilder. Es ist mühsam und frustrierend, und wenn ich mich damit befassen muss, möchte ich manchmal Dinge schlagen, aber am Ende führt es zu einem insgesamt besseren Web-Erlebnis.
Ersetzt CSS Grid FlexBox?
CSS Grid ersetzt Flexbox nicht. Sie können zusammen verwendet werden. Eine der einfachsten Möglichkeiten, um zu wissen, welche man verwenden soll
Verwenden Sie Flexbox für eindimensionale Layouts, wie horizontal oder vertikal.
Verwenden Sie CSS Grid für zweidimensionale Layouts, wie die Deklaration von Stilen für sowohl horizontale als auch vertikale Layouts.
Sie können also CSS Grid verwenden, um ein Seitenlayout zu erstellen, und dann Flexbox auf einzelne Elemente innerhalb dieses Layouts anwenden.
Sie können sogar Grids verschachteln, wenn nötig.
Keineswegs, es implementiert und teilt nur einige der Eigenschaften. Sie können zusammenarbeiten.
Grid und FlexBox schließen sich nicht gegenseitig aus. Sie sind unterschiedliche Werkzeuge für unterschiedliche Aufgaben, wie ein Auto und ein LKW oder eine Handsäge und eine Tischsäge. Sie können sie verwenden, um ähnliche Layouts zu erzielen, aber sie haben jeweils ihre eigenen Stärken.
Grid ist für die globale Anordnung, während Flexbox gut für die Darstellung von Elementen ist.
Für Single-Page-Anwendungen: Grid ist für das Seitenlayout, während Flexbox für interne Listenelemente ist.
Ihre caniuse-Daten sind falsch. Der Link verweist auf diese Statistiken für CSS Grid-Unterstützung
Firefox: 52+ (gerade veröffentlicht)
Chrome: 57+ (gerade veröffentlicht)
Safari: 10.1 (in Beta)
IE: 11+ aber eine alte Version des Standards
Edge: aktuelle Version immer noch mit einer alten Version des Standards
iOS Safari: noch nicht
Android: nein
Eine Reihe von Leuten haben auf diese Informationen zur Browserunterstützung geantwortet.
Diese Daten stammen *tatsächlich* von **CanIUse…* und sind aktuell, aber ich stimme zu, dass sie etwas verwirrend sind, da sie den allerersten Browser auflisten, der auch nur teilweise Unterstützung für Grid hatte.
Rohdaten finden Sie hier: https://github.com/Fyrd/caniuse/blob/master/data.json
Rachel Andrews hat eine Browser-Support-Seite in einfacher Sprache: http://gridbyexample.com/browsers/
"p" in den caniuse-Daten steht nicht für "teilweise unterstützt", sondern für "unterstützt durch Polyfill" (nicht auf caniuse.com verwendet)
https://github.com/Fyrd/caniuse/issues/665
Lesen Sie mehr über die caniuse-Syntax hier
https://github.com/Fyrd/caniuse/blob/master/CONTRIBUTING.md
Ah ja! Guter Punkt. Ich habe unseren Backend-Code geändert, um "p"-Werte zu ignorieren.
Ich freue mich darauf, dass es schnell auf mobilen Browsern unterstützt wird!
Um mich mit CSS Grid vertraut zu machen, habe ich Ihren Code kopiert und mit den Einheiten herumgespielt. Können Sie mir bitte sagen, warum dies in Edge nicht richtig angezeigt wird, obwohl ich es durch einen PrePros laufen ließ, um die richtigen Präfixe zu erhalten? Nur die letzte Box wird angezeigt. Siehe CodePen in Edge – http://codepen.io/anon/pen/BWdLej
sub-grid möglich?