Nein. Naja. Größtenteils Nein.
Grid ist viel neuer als Flexbox und hat etwas weniger Browserunterstützung. Deshalb ist es nur logisch, wenn Leute sich fragen, ob CSS Grid Flexbox ersetzen soll.
Um es auf den Punkt zu bringen
- Grid kann Dinge, die Flexbox nicht kann.
- Flexbox kann Dinge, die Grid nicht kann.
- Sie können zusammenarbeiten: Ein Grid-Element kann ein Flexbox-Container sein. Ein Flex-Element kann ein Grid-Container sein.
Obwohl Grid ziemlich neu ist, haben wir zahlreiche Artikel dazu, darunter einen Einführungsartikel, einen Artikel über ein grundlegendes Layout auf verschiedene Arten und einen vollständigen Leitfaden.
Falls Sie die Trompeten noch nicht gehört haben: März 2017 war der Meilenstein für Grid. Es wurde, vollständig unprefixed und einsatzbereit, in Chrome, Opera, Firefox und Safari veröffentlicht. Sogar Edge unterstützt es, wenn auch eine ältere Version des Standards, für die Sie mit der Verwendung von Autoprefixer etwas Unterstützung erhalten können.
Also.
Ersetzt Grid Flexbox?
Es scheint auf den ersten Blick etwas kompliziert. Besonders wenn Sie gerade erst anfangen, die seltsame, fremde Syntax von Flexbox zu verstehen. Jetzt gibt es *eine ganz andere* Syntax zu lernen? Donnerwetter.
Hier sind einige Dinge, bei denen Grid *speziell* besser ist als Flexbox
- Erstellung ganzer Seitenlayouts. Dafür ist es besser geeignet, selbst unter Berücksichtigung von Layout-Performance-Gründen.
- Erstellung buchstäblicher Grids. Wie X Spalten mit Y Abstand dazwischen, wie man es von homegrown Frameworks kennt.
grid-gapist wunderbar, da Lücken der Hauptschmerzpunkt von Grid-Systemen sind. - Weniger Medienabfrage-Interventionen mit wirklich leistungsstarker Funktionalität wie Auto-Layout,
minmax(),repeat()undauto-fill. Hier ist eine nette Idee.
Und ein weiterer großer Punkt: Grid kann Elemente in 2 Dimensionen positionieren. Sowohl Spalten als auch Zeilen. Das ist eine Premiere. Rachel Andrew hat das einmal sehr deutlich gemacht
Flexbox ist im Wesentlichen für das Layout von Elementen in einer einzigen Dimension – in einer Zeile ODER einer Spalte. Grid ist für das Layout von Elementen in zwei Dimensionen – Zeilen UND Spalten.
Schauen wir uns ein paar Demos an.
Nehmen wir an, wir bauen eine horizontale Navigationskomponente – das ist der perfekte Anwendungsfall für Flexbox, da es Inhalte nur in einer Richtung setzt. In Chris' Demo unten können Sie mit diesen Eigenschaften experimentieren und sehen, wie leistungsfähig Flexbox ist
Siehe den Pen Bar Navigation mit Flexbox und SVG-Icons von Chris Coyier (@chriscoyier) auf CodePen.
Es gibt jedoch einige Fälle, in denen diese Flexbox-Eigenschaften, wie justify-content oder align-items, in Verbindung mit Grid-Eigenschaften verwendet werden sollten. Nehmen Sie diese Demo zum Beispiel
Siehe den Pen Flexbox und Grid – Erste Demo von Robin Rendle (@robinrendle) auf CodePen.
Zuerst haben wir einen .wrapper erstellt, der auf display: flex; gesetzt ist. So können wir eine maximale Breite für unser .grid festlegen und justify-content: center; verwenden, um es in der Mitte des Viewports zu platzieren. Dann können wir unser Grid mit der richtigen Anzahl von Spalten erstellen
.wrapper {
display: flex;
justify-content: center;
}
.grid {
display: grid;
max-width: 800px;
grid-template-columns: 1fr 2fr;
}
Das ist nur der erste Schritt.
Machen wir nun, dass das .ad die gesamte Zeile unseres Grids einnimmt. Nun, das können wir tun, indem wir spezifisch unser ansprechen
ohne den Rest der Kinder unseres Grids zu beeinträchtigen
.ad {
grid-column-start: 1;
grid-column-end: 3;
}
Mit dem obigen Code sagen wir: *„Beginne dieses Div in der ersten Spalte und ende in der allerletzten Spalte.“* Das sollte ungefähr so aussehen
Siehe den Pen Flexbox und Grid von Robin Rendle (@robinrendle) auf CodePen.
Darüber hinaus wollen wir, dass unser Ad-Block immer doppelt so groß ist wie unsere erste Zeile – das können wir total machen! Wir müssen nur die Eigenschaft grid-template-rows verwenden
.grid {
display: grid;
max-width: 800px;
grid-template-columns: 1fr 2fr;
grid-template-rows: 1fr 2fr 1fr;
}
Das ist gleichbedeutend mit: *„Es gibt drei Zeilen in unserem Grid. Achten Sie immer darauf, dass die zweite Zeile doppelt so groß ist wie die erste und dritte.“* Mit anderen Worten, wir schaffen Beziehungen zwischen Zeilen und anderen Zeilen und definieren gleichzeitig die Anzahl der Spalten in unserem Grid!
Siehe den Pen Flexbox und Grid von Robin Rendle (@robinrendle) auf CodePen.
Mit CSS Grid können wir Beziehungen horizontal (mit grid-template-columns) und vertikal (mit grid-template-rows) gleichzeitig festlegen. Flexbox hingegen ist darauf beschränkt, entweder vertikale oder horizontale Layouts zu erstellen (mit flex-direction) – aber das bedeutet nicht, dass wir es aufgeben sollten.
Potenziell verwirrend: Ein „2D“-Layout mit Flexbox
Was etwas verwirrend sein kann, ist, dass es nicht unmöglich ist, mehrdimensionale Layouts nur mit Flexbox zu erstellen. Zum Beispiel
Siehe den Pen Ein „Grid“ mit Flexbox von Chris Coyier (@chriscoyier) auf CodePen.
Dort gibt es sicherlich Zeilen und Spalten, sogar ein letztes Element, das sich über mehrere Spalten erstreckt. Es ist einfach zu erstellen und flexibel. Es wird durch die Erlaubnis von flex-wrap auf dem Container, die flex-basis der Kinder auf 1/3 der Breite des Containers und die Erlaubnis von flex-grow, um Kinder bei Bedarf zu strecken, erreicht. (Die flex-Eigenschaft ist eine Kurzform für flex-grow, flex-shrink und flex-basis.)
Es ist nicht falsch, es ist nur eine Methode, etwas auf diese Weise zu tun, und man könnte wahrscheinlich argumentieren, dass es weniger intuitiv und anpassungsfähig ist.
Potenziell verwirrend: Ein „1D“-Layout mit Grid
Grid *kann* 2D-Layout, d. h. die Definition von grid-template-rows und grid-template-columns, aber es muss nicht beides verwenden. Hier ist eine Demo, wie man es nur verwendet, um Boxen in einer horizontalen Reihe anzuordnen
Siehe den Pen Einfache Spalten mit Grid von Chris Coyier (@chriscoyier) auf CodePen.
Das ist auch nicht falsch. Tatsächlich könnte man leicht argumentieren, dass dies einfacher zu verstehen und prägnanter ausgedrückt ist als die Verwendung von Flexbox. Zum Beispiel sind keinerlei Layout-Eigenschaften auf den Kindelementen erforderlich. Aber man könnte auch argumentieren, dass reines 1D-Layout wie dieses in Flexbox leistungsfähiger ist, da Flexbox es uns ermöglicht, diese Elemente einfacher zu bewegen (z. B. sie alle auf eine Seite zu verschieben, ihre Reihenfolge zu ändern, sie gleichmäßig zu verteilen usw.).
Zum Thema Verschachtelung
Noch einmal, um es zu festigen!
Das sollte man sich merken: Grid-Elemente können Flex-Eltern sein.

Siehe den Pen Einfache Spalten mit Grid von Chris Coyier (@chriscoyier) auf CodePen.
Und Flex-Elemente können Grid-Eltern sein

Siehe den Pen Einfache Spalten mit Grid von Chris Coyier (@chriscoyier) auf CodePen.
„Potenziell verwirrend: Ein ‚2D‘-Layout mit Flexbox“ – das ist kein 2D-Layout. Es ist ein umbrochenes Flex-Layout. Sobald Sie möchten, dass die letzte Box mit den Boxen in der ersten Spalte übereinstimmt, erkennen Sie, dass das, was Sie haben, nicht zweidimensional ist.
Flex-Wrapping macht es nicht zweidimensional. Jede Zeile (in Ihrem Beispiel) ist selbst ein Flex-Container, die Verteilung des Raumes erfolgt individuell über jede Zeile. Deshalb ist es nicht zweidimensional.
Mehr dazu https://rachelandrew.co.uk/archives/2017/03/31/grid-is-all-about-the-container/
Sie können auch Grid-Tracks gleichmäßig verteilen und so weiter. Die Box-Ausrichtung wird von den Flexbox- und Grid-Spezifikationen gemeinsam genutzt. Beispiele hierfür finden Sie unter http://gridbyexample.com/video/align-grid/
Daher die Anführungszeichen bei „2D“.
Vielleicht nur ich, aber ich denke, es wäre besser, korrekte Informationen im Text zu liefern, anstatt mit Satzzeichen etwas anderes anzudeuten.
Flexbox unterstützt immer noch nicht einmal
flex-flowmit Spaltenumbruch richtig für die Erstellung von mehrspaltigen Dropdown-Menüs mit begrenzter Höhe. Und jetzt das. Machen Sie sich bereit für eine wilde Fahrt! https://github.com/philipwalton/flexbugsIch bin ziemlich verwirrt von der Einführung von „2D“ ..
Danke für den anderen Verweis, aber ich bin jetzt doppelt verwirrt. :P
Was genau kann Flexbox, was Grid nicht kann?
Können Sie „Flexbox ermöglicht es uns, diese Elemente einfacher zu bewegen (z. B. sie alle auf eine Seite zu verschieben, ihre Reihenfolge zu ändern, sie gleichmäßig zu verteilen usw.)“ näher erläutern?
Wie? Ich dachte, das ginge mit Grid auch einfach.