Wenn ein Elternelement auf display: flex gesetzt wird, werden seine Kindelemente von links nach rechts ausgerichtet, so:
Nun, eine der netten Dinge, die wir mit Flexbox machen können, ist, die Richtung zu ändern, sodass die Kindelemente vertikal übereinander in einer Spalte gestapelt werden. Das können wir mit der Eigenschaft flex-direction (oder mit dem Kurzschreibungs-Property flex-flow) erreichen.
Okay, cool. Aber wie würde ich so etwas mit CSS Grid machen? Sagen wir, ich möchte, dass alle diese Kindelemente so ausgerichtet werden:
1 3 5 7
--------
2 4 6 8
…anstatt so:
1 2 3 4
--------
5 6 7 8
Standardmäßig werden die Elemente, wenn ich ein Elternelement für CSS Grid einrichte, von links nach rechts positioniert, genau wie bei Flexbox. Im folgenden Beispiel weise ich dem Grid an, 6 Spalten und 2 Zeilen zu haben, und lasse dann die Kindelemente jede Spalte der ersten Zeile füllen, bevor sie die Spalten der zweiten Zeile füllen. Sie kennen das Standardverhalten beim Zeilenumbruch.
.parent {
display: grid;
grid-template-columns: repeat(6, 1fr);
grid-template-rows: repeat(2, 150px);
gap: 20px;
}
Im Grunde möchte ich hier das Gegenteil: Ich möchte, dass unsere Kindelemente Spalte 1, Zeile 1 und Zeile 2 füllen und dann zur nächsten Spalte übergehen. Mit anderen Worten, Spaltenumbruch! Ich weiß, dass ich, wenn ich ein Grid mit Zeilen und Spalten erstelle, diese Elemente individuell in diese Positionen platzieren könnte. So:
.parent {
display: grid;
grid-template-columns: repeat(6, 1fr);
grid-template-rows: repeat(6, 150px);
}
.child-1 {
grid-column: 1;
grid-row: 1;
}
.child-2 {
grid-column: 1;
grid-row: 2;
}
.child-3 {
grid-column: 2;
grid-row: 1;
}
/* etc, etc. */
Okay, fein! Das bringt mich zu dem, was ich will, aber es ist eine Riesenqual, die Position jedes Elements einzeln festlegen zu müssen. Es fühlt sich an, als würde ich position: absolute verwenden und es fühlt sich nicht besonders intelligent an. Was ist, wenn ich dieses Layout einfach für mich erledigen lassen wollte, sodass sich jedes neue Kindelement an der richtigen Stelle ausrichtet… richtig?
Was ich (glaube ich) frage, ist: Gibt es eine CSS Grid-Version von flex-direction: column?
Nun, nach einigem Suchen hat mich Rachel Andrew in ihrem ziemlich ausgezeichneten Spielplatz, Grid by Example, auf die richtige Antwort hingewiesen. Und wie Sie in dieser Demo sehen können, zeigt Rachel uns, wie das geht:
Neat! Rachel macht das mit der Eigenschaft grid-auto-flow: Sie teilt einem Grid-Container mit, wie der unbesetzte Platz mit Kindelementen gefüllt werden soll. Das kann ich also einfach so machen:
.parent {
display: grid;
grid-auto-flow: column;
/* set up columns and rows here */
}
Standardmäßig füllen die Kindelemente eines Grids jede Spalte, bis eine Zeile gefüllt ist, und dann fließen sie zur nächsten darunter. Deshalb ist der Standardwert für grid-auto-flow auf row eingestellt, da wir zuerst die Zeilen des Grids füllen. Aber wenn wir es auf column setzen, füllt jedes neue Element den gesamten Platz von Spalte 1, bevor es zu Spalte 2 usw. übergeht.
.parent {
display: grid;
grid-auto-flow: column;
grid-template-columns: repeat(6, 1fr);
grid-template-rows: repeat(2, 150px);
}
Das ist es, was der Flow-Teil von grid-auto-flow bedeutet, und ich habe die Eigenschaft lange ignoriert, weil sie (lachen Sie nicht) beängstigend schien. Allein das Lesen des Wortes grid-auto-flow reicht aus, um meinen Laptop ausschalten und ins Meer laufen zu wollen.
Aber! Es ist eine ziemlich nützliche Eigenschaft und ergibt viel Sinn, besonders wenn man sie als die CSS Grid-Version von flex-direction betrachtet.
Ihr Artikel war wirklich großartig und super hilfreich, danke
Das fühlt sich sehr nah daran an, einem Layout-Modell, Grid, zu ermöglichen, tabellarische (im Allgemeinen sehr horizontale) Inhalte auf normalen, größeren als Telefon-Bildschirmen im Querformat darzustellen, und dann die Richtung zu wechseln, sodass jede Zelle in einer Zeile für schmale Hochformat-Telefone vertikal gestapelt erscheint.
Hmmm.
Übrigens, große Punkte für die Ehrlichkeit bezüglich der Angst vor neuen Konzepten in der IT. Die Belastung für IT-Arbeiter, die ständig das Rad neu erfinden müssen, ist schrecklich. Danke für Ihre Ehrlichkeit.
Super cool, danke!!
Ich vermisse noch etwas… Gibt es eine Möglichkeit, es zu verwenden, ohne die Anzahl der Zeilen zu kennen?
Diese Zeile impliziert, dass Sie 2 Zeilen haben werden
grid-template-rows: repeat(2, 150px);Und diese 6 Spalten
grid-template-columns: repeat(6, 1fr);Was ist, wenn Sie 30 Elemente hätten…
Gibt es eine Möglichkeit, einfach zu sagen: Aufteilen gleichmäßig auf 2 Spalten und die Anzahl der Zeilen anpassen?
Danke
Wahrscheinlich nicht mit Grid, aber Sie können Multicol verwenden. Setzen Sie
columns: 4anstelle vondisplay: grid, und Sie sollten vier ausgewogene Spalten erhalten.Gibt es eine Möglichkeit, ganze Spalten in Zeilenrichtung umzubrechen, wenn sich die Ansichtsfenstergröße ändert?
Ich meine damit, von
1 4
2 5
3 6
zu
1
2
3
4
5
6
zu wechseln, wenn das Ansichtsfenster zu schmal ist, um zwei Spalten aufzunehmen.
Ich verstehe, dass dies irgendwie widersprüchlich wäre – die automatische Flussrichtung von Zeile zu Spalte und wieder zu Zeile zu ändern – aber vielleicht gibt es einen Weg?