Chris Albrecht postete eine Frage auf StackOverflow über Grids. Im Wesentlichen: Stellen Sie sich vor, Sie haben ein Element mit einer unbekannten Anzahl von Kindern. Jedes dieser Kinder nimmt einen bestimmten Prozentsatz der Breite des Elternelements ein, sodass sie gleiche Zeilen bilden, z. B. jeweils 25 % für vier Spalten, jeweils 33,33 % für drei Spalten usw. Das Ziel ist es, den Raum dieses "Grids" gleichmäßig zu füllen. Es gibt eine unbekannte Anzahl von Kindern, also nehmen wir an, Sie würden 25 % verwenden und es gäbe 7 Kinder, dann wären das 4 in der ersten Zeile und 3 in der zweiten. Chris benötigte, dass die letzten 3 Kinder ihre Breite anpassen, um den Raum zu füllen, anstatt die Lücke zu lassen.
Flexbox hat genau die richtige Antwort dafür, was sonst wahrscheinlich eine JavaScript-Intervention erfordern würde.
Die Lösung besteht im Wesentlichen darin, dass die Kinder mit flex-wrap umbrechen können und der Raum dann mit flex-grow gefüllt wird.
.grid {
display: flex;
flex-wrap: wrap;
}
.grid-item {
flex-grow: 1;
min-width: 25%;
}
Hier ist ein visuelles Beispiel dafür, wenn jedes Grid-Element rot ist und mit einem Rahmen getrennt ist

Durch Anpassen der min-width bei verschiedenen @media query Breakpoints können Sie es ziemlich einfach responsiv gestalten
.grid-item {
flex-grow: 1;
min-width: 25%;
}
@media (max-width: 1200px) {
.grid-item {
min-width: 33.33%;
}
}

Hier ist diese Demo
Siehe den Pen Wrapping Flexbox with Media Query Widths von Chris Coyier (@chriscoyier) auf CodePen.
Wenn Sie Flexbox ablehnen, weil es noch nicht einsatzbereit ist, ist dieses Beispiel für Sie. flex-wrap war in Firefox überhaupt nicht vorhanden, bis ziemlich kürzlich, und ist noch nicht einmal stabil, also wahrscheinlich noch keine superpraktische Lösung für Chris. Aber denken Sie daran, dass Firefox automatisch aktualisiert, so dass, wenn 28 veröffentlicht wird, alle es ziemlich schnell haben werden. Ich bin immer noch optimistisch, dass Flexbox innerhalb eines Jahres oder so ein ziemlich Standard-Layout-Mechanismus für neue Websites sein wird.
Wenn Sie Flexbox nur für unidirektionale Dinge benötigen, ist die Rückfallebene auf display: table manchmal eine Option, wenn Sie mit Rückfallebene die Genauigkeit des Layouts wiedergeben meinen. Wenn Sie das Umbrechen benötigen, könnte inline-block funktionieren. Sie können die Unterstützung für Flexbox-Umbrüche mit
@supports not (flex-wrap: wrap) {
}
Und möglicherweise eine Rückfallebene auf inline-block (mit keinem Abstand dazwischen). Wenn Sie das getan haben, hier ist, wie Sie die letzte Zeile bei Bedarf mit JavaScript anpassen könnten
var leftovers = $(".child").removeAttr("style").length % 4;
if (leftovers > 0) {
var newWidth = 100 / leftovers;
var fromHere = $(".child").length - leftovers + 1;
$(".child:nth-child(n+" + fromHere + ")").css("width", newWidth + "%");
}
Beachten Sie die hartcodierte 4 darin, die 25% Kinder annimmt. Sie könnten es ausgefeilter gestalten und das erkennen. Das überlasse ich Ihnen. Die Auswahl der letzten paar Nachzügler (bestimmt durch den Modulo-Operator (%)) habe ich mit ein paar :nth-child Rezepten gemacht. Hier ist aber eine Demo davon
Siehe den Pen Wrapping Flexbox with Media Query Widths von Chris Coyier (@chriscoyier) auf CodePen.
Denken Sie daran, dass es hier eine große Übersicht über alle Flexbox-Eigenschaften gibt: hier.
Lesezeichen retten den Tag bei jedem Projekt nach IE8 überhaupt *
IE9 hat laut caniuse keine Unterstützung: http://caniuse.com/#search=flex
Nicht zu schwer mit einigem nth-child Funkeln, aber es ist großartig, die Flexibilität mit so wenigen Codezeilen zu haben.
Du bist schlau
Das verdient wirklich, zum Artikel hinzugefügt zu werden!
Beeindruckend!
Clever
Genial
Oooooooh… Gibt es etwas, das Flexbox nicht kann?
Firefox 28 sollte am 18. März veröffentlicht werden https://wiki.mozilla.org/RapidRelease/Calendar
Schön! Ich habe kürzlich gesucht nach etwas Ähnlichem – einer Lösung für eine ausgewogene Flex-Wrap-Navigation mit Flex-Auto. Der Unterschied zum obigen Beispiel: Die Breite der Container ist nicht fest.
Seltsamerweise scheint dies in Safari 7.0.2 nicht zu funktionieren, was ärgerlich ist.
CM
Um meinen etwas knappen Kommentar zu verstärken, scheint es, dass Safari die min-width einfach falsch rendert – es dehnt die Eltern immer weiter aus.
Wenn Sie die min-width auf width setzen, dehnt sich die Eltern nicht aus – die Boxen werden auf einer Zeile gerendert und werden immer kleiner.
Ich kann es nur richtig zum Laufen bringen, indem ich min-width:25%; auf width:25%; setze *und* alle Attribute in Flex setze, z. B. flex:1 0 auto;
CM
Flexbox ist großartig. Ich habe es in meiner eigenen Grid-Lösung verwendet und es ist so nützlich.
http://grumpywizards.com/Grid/
Hilfe wäre willkommen, wenn jemand zu dem Open-Source-Projekt beitragen möchte! ;-)
Das löst mein Problem nicht.
Ich brauche eine Möglichkeit, justify-content: space-between auf jeder flex-gewrapten Zeile außer der letzten Zeile zu haben.
Ich brauche die letzte Zeile als eine Art Kombination aus space-between & flex-start.
Es gibt auch die intrinsischen und extrinsischen Werte-Eigenschaften, die hoffentlich eines Tages bei diesem Problem helfen werden.
http://caniuse.com/#feat=intrinsic-width
http://demosthenes.info/blog/662/Design-From-the-Inside-Out-With-CSS-MinContent
Ja, spät zur Party. Egal.
Flexbox hat das Äquivalent zu "min-width" eingebaut. Mit der Kurzschreibweise flex-Eigenschaft könnten Sie das alles in einer Deklaration erledigen
Bedeutung: Erlauben Sie ihm zu wachsen, erlauben Sie ihm nicht zu schrumpfen, machen Sie die Breite mindestens 25%
Es verhält sich exakt gleich. Die neuen Boxen, die unten hinzugefügt werden, dehnen sich aus, um den Raum zu füllen.