Es ist schwer, all das Tolle, was Flexbox bietet, in einem kleinen Blogbeitrag zusammenzufassen. Obwohl wir es hier versucht haben. Hier konzentrieren wir uns einfach auf eine Sache, die Flexbox sehr gut löst: die Fähigkeit, eine beliebige Anzahl von Boxen die gesamte verfügbare Höhe einer übergeordneten Box füllen zu lassen. Und nicht nur das, sondern bei Bedarf auch darüber hinaus zu expandieren (ohne sie zu quetschen, um sie anzupassen).
Mit „Box“ meine ich einfach ein Block-Element. Div, Section, Article, was auch immer.
Standardmäßig wird die Höhe dieser Boxen durch den darin enthaltenen Inhalt bestimmt. Sie werden übereinander gestapelt. Die Höhe ihrer übergeordneten Boxen kann auch durch ihre kombinierte Höhe bestimmt werden, aber es kann auch anders sein (z. B. ist sie explizit festgelegt oder etwas Variables wie das Browserfenster). Wenn die übergeordnete Box eine größere Höhe hat, bleibt darunter einfach leerer Platz.
Können wir die Boxen zwingen, den Platz gleichmäßig aufzuteilen? Mit Flexbox können wir das.
Sagen wir, das HTML ist so:
<section class="fill-height-or-more">
<div>
<!-- stuff -->
</div>
<div>
<!-- stuff -->
</div>
<div>
<!-- stuff -->
</div>
</section>
Dann starten wir Flexbox mit der übergeordneten Box:
.fill-height-or-more {
display: flex;
}
und machen die Boxen von oben nach unten (Spalte) statt von links nach rechts (Zeile), wie es der Standard ist.
.fill-height-or-more {
display: flex;
flex-direction: column;
}
Damit allein wird es keinen Unterschied zu dem machen, was wir vorher hatten. Aber jetzt wenden wir die Flex-Eigenschaft auf die Kindelemente an und sie werden den Platz ausfüllen.
.fill-height-or-more > div {
/* these are the flex items */
flex: 1;
}
Und fertig =).
Als Detail ist `flex: 1;` dasselbe wie `flex: 1 1 auto;`. Es ist eine Kurzform für drei verschiedene Eigenschaften.
flex-grow: 1;
flex-shrink: 1;
flex-basis: auto;
Es ergibt sich gerade so, dass ihnen die Fähigkeit, auf gleicher Basis zu wachsen, die häufigste Anforderung ist, daher ist `flex: 1;` eine schöne Art, dies zu schreiben.
Eines der schönen Dinge an Flexbox ist, dass dies mit einer beliebigen Anzahl von Boxen funktioniert. Es kann eine einzige Box sein! Es können 100 Boxen sein! Egal. Wenn zusätzlicher Platz vorhanden ist, wird der Platz geteilt und gefüllt. Wenn nicht, kein Problem.
In der Zeit vor Flexbox hätten wir versucht, die Anzahl der Boxen zu kennen/herauszufinden und dann ihre Höhen mit Prozentsätzen festzulegen. Das funktioniert, um zusätzlichen Platz zu füllen, aber wenn es zu viele Boxen gäbe, würden sie gequetscht werden. Das ist eine weitere schöne Sache an Flexbox: Sie quetscht diese Boxen nicht so stark, dass sie ihren Inhalt nicht mehr darstellen können. Also...
Wenn wir das noch einen Schritt weiter gehen wollten, könnten wir Flexbox verwenden, um den Inhalt auch innerhalb dieser Boxen zu zentrieren (!). Hier werden die Leute wütend auf CSS. Vertikales Zentrieren ist ziemlich schwierig. Selbst mit Flexbox hier müssen wir jedes dieser Flex-Element-Kinder zu Flex-Containern machen. Dann verwenden wir einen internen Wrapper, der zum Flex-Element wird, das wir zentrieren. Also ja, immer noch ein zusätzliches Element. Update: Tedmotu hat es geschafft ohne das zusätzliche Element, was wirklich einfach ist.
Um es zu zentrieren, machen wir die Ausrichtung wieder von oben nach unten (Spalte) und verwenden eine weitere Flexbox-Eigenschaft, `justify-content`, um es zu zentrieren.
.fill-height-or-more > div {
flex: 1;
display: flex;
justify-content: center;
flex-direction: column;
}
Hier ist, wo die Referenzanleitung nützlich ist… um schnell herauszufinden, welche Eigenschaft was tut.
Dann bekommen wir das:
Siehe den Stift Boxen, die Höhe füllen (oder mehr) von Chris Coyier (@chriscoyier) auf CodePen.
Browser-Unterstützung
Ich habe hier in diesem Beitrag nur die neueste Syntax verwendet. Aktuelle Versionen von Chrome, Opera unterstützen sie genau so. Zukünftige Versionen von Firefox und Android werden sie ebenfalls genau so unterstützen. Safari und iOS unterstützen die neue Syntax, aber mit -webkit-Präfixen. Can I Use hat die ganze Geschichte.
IE ist seltsam. IE 10 unterstützt die Zwischenversion von Flexbox (z. B. display: -ms-flexbox;). IE 11 unterstützt die neueste Flexbox. **Bei dieser speziellen Demo jedoch** ist etwas kaputt. Während die Höhe von .fill-height-or-more durch die Verwendung von `min-height` die volle Höhe erreicht, werden die Boxen gequetscht.

Wenn Sie Höhe statt des Flex-Containers verwenden, "funktioniert" es – aber der Punkt hier war die Verwendung von min-height, um Quetschungen zu vermeiden. Scheint mir ein Implementierungsfehler zu sein.
UPDATE: Nirav Zaveri schrieb mir, dass in IE (ich habe v11 getestet) `flex: 1` nicht dasselbe ist wie `flex: 1 1 auto`, auch wenn es das sein sollte (?). Wenn Sie letzteres einstellen, funktioniert es.
Es ist verständlich, dass Sie möglicherweise etwas weiter zurückgehen müssen, was die Browserunterstützung angeht. Firefox 27, iOS 6 und Safari 6 sind ziemlich legitime Browser-Support-Ziele und all diese verwenden eine Variation der älteren Syntax, manchmal mit Präfix und manchmal nicht.
Unser kleines Beispiel sieht nur so aus, wenn es für die Unterstützung so weit wie möglich ausgearbeitet ist.
.fill-height-or-more {
display: -webkit-box;
display: -webkit-flex;
display: -moz-box;
display: -ms-flexbox;
display: flex;
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
-webkit-flex-direction: column;
-moz-box-orient: vertical;
-moz-box-direction: normal;
-ms-flex-direction: column;
flex-direction: column;
}
.fill-height-or-more > div {
-webkit-box-flex: 1;
-webkit-flex: 1;
-moz-box-flex: 1;
-ms-flex: 1;
flex: 1;
display: -webkit-box;
display: -webkit-flex;
display: -moz-box;
display: -ms-flexbox;
display: flex;
-webkit-box-pack: center;
-webkit-justify-content: center;
-moz-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
-webkit-flex-direction: column;
-moz-box-orient: vertical;
-moz-box-direction: normal;
-ms-flex-direction: column;
flex-direction: column;
}
Autsch. Meine Empfehlung? Schreiben Sie es in der modernen Syntax, wie ich es oben getan habe, und lassen Sie Autoprefixer sich darum kümmern, das nicht nur die Präfixe, sondern auch die ältere Syntax behandelt.
Video-Screencast
Warum nicht gleich? Ich habe es hier veröffentlicht und werde es auch einbetten.
Ach ja, nur für den Fall, dass es interessiert: Das reale Szenario, das mich dazu gebracht hat, war diese Seite.
Tolle Zusammenfassung! Ich liebe Flexbox. Ich habe sogar meine persönliche Website nur mit Flexbox erstellt.
Ich kann es kaum erwarten, es 2020 in Produktionsseiten verwenden zu können. :(
Ah, ein Optimist.
Ich bin neugierig, ob Flexbox die Lösung sein könnte, nach der ich gesucht habe. Szenario: Sie haben zwei Spalten mit Inhalt. Spalte A ist das Feature-Bild eines Blogs und Spalte B ist der Vorschautext. Es gibt Zeiten, in denen Spalte A leer ist, sodass Spalte B den gesamten Platz ausfüllt.
Wenn Spalte A ein optionales `img` verwendet, möchten Sie vielleicht die `:empty`-Pseudoklasse betrachten.
.col-a:empty { display: none; }MDN Docs
Wow. Das ist der zeitlich passendste Blogbeitrag, den ich je gelesen habe. Heute Morgen habe ich genau dieses Problem versucht zu lösen. Danke Chris!
Anstatt die überschüssigen Flex-Elemente zur vertikalen Zentrierung in einem meiner Projekte zu verwenden, haben wir die folgende Methode verwendet. Sie funktioniert gut :) http://zerosixthree.se/vertical-align-anything-with-just-3-lines-of-css/
Ich bin auch ein Fan der Translate-Zentrierung, aber Sie benötigen ein einzelnes Element, um diesen Transform auszuführen, also eher ein Pferd und Reiter.
Ich bin jetzt seit etwa sechs bis acht Monaten auf dem Flex-Zug und kann es kaum erwarten, bis es für den Prime-Time bereit ist. Zum Zeitpunkt des Schreibens haben wir immer noch Probleme mit Safari (align-self wurde erst Ende letzten Jahres unterstützt), Firefox (flex-wrap wird in der öffentlichen Version erst im April unterstützt) und natürlich IE8 und 9.
Ich freue mich wirklich sehr auf den Tag, an dem wir Flex ohne Fallbacks verwenden können. Ich habe neulich einen Tweet gelesen, in dem stand, dass Sie sich nie wieder richtig fühlen werden, wenn Sie Flex einmal für das Layout von Seiten verwendet haben, und ich stimme voll und ganz zu!
Das ist so süß.
Aber Sie kennen den Nachteil: IE.
Selbst IE9 kann Ihnen hier nicht helfen.
Wie immer großartig, danke für den Tipp Chris.
Flexbox könnte durchaus großartig sein, **wenn wir sie verwenden könnten**. In der realen Welt ist IE8 immer noch zu stark verbreitet, um sich auf Flexbox für eine öffentlich zugängliche Website zu verlassen. Net Applications (die Leute, denen Microsoft für ie6countdown vertraut) geben für IE8 im Dezember 2013 >20% weltweit an; StatCounter hat immer einen viel niedrigeren Wert, sagt aber immer noch 6,6% (und weitere 3,9% für IE9, seltsamerweise; ich hätte erwartet, dass diese Leute zumindest bis dahin auf IE10 sind). Z. B. mehr als 10% ohne Flexbox auch nach der Schätzung nach unten, viel zu viel Verkehr, um ihn zu ignorieren.
(Und IE8 wird noch eine Weile hier sein, dank Microsofts umwerfender Weigerung, einen modernen Browser für XP herauszubringen, während XP für Volumenlizenzkunden – sprich große Unternehmen und Regierungen – während des gesamten Lebenszyklus von Windows 7 unterstützt wird.)
Es ist fantastisch, dass MS endlich auf den "Browser aktuell halten"-Zug aufgesprungen ist. Jetzt müssten sie nur noch tun, was alle anderen Anbieter tun, und ihren Browser unter XP unterstützen (da sie ihre Meinung zu den Volumenvereinbarungen nicht ändern können)…
Denken Sie daran, welche Statistiken wichtig sind: DIE Statistiken IHRER Website.
Wenn ich eine E-Commerce-Website für Gartengeräte bauen würde, würde ich das Ding wahrscheinlich bis IE 6 funktionsfähig machen.
Wenn ich meine nächste Design-Überarbeitung hier auf CSS-Tricks mache, werde ich wahrscheinlich Flexbox verwenden und einen Mindeststandard von IE 10 haben.
(Antworte mir selbst, da es keinen 'Antwort'-Link zu Chris' Kommentar gibt)
Und welche Statistiken verwenden Sie, wenn Sie etwas Neues erstellen? Durchschnittsstatistiken sind wichtig.
Warum ein zusätzliches Div-Element?
Dafür gibt es keinen Bedarf. `justify-content: center` sollte ausreichen, und wenn Sie auch die Querachse ausrichten möchten, verwenden Sie `align-items: center`.
Jede Box mit diesen beiden Stilen hat perfekt zentrierte Kindelemente. Sie benötigen keinen Dummy-Elternteil.
Ich konnte das nicht zum Laufen bringen. Fühlen Sie sich frei, es zu forken und das Element zu entfernen und es zentrieren zu lassen. Ich würde den Artikel gerne noch sauberer aktualisieren.
Fork (keine zusätzlichen Divs)
Ich benutze Chrome 32, und der obige Stift sieht für mich genauso aus wie Ihr Stift. Vielleicht übersehe ich etwas?
Ich bevorzuge normalerweise Flexbox für die Ausrichtung speziell für diese Funktion – sie ermöglicht es mir, Geschwisterelemente ohne Dummy-Wrapper auszurichten.
Das funktioniert tatsächlich! Verdammt, warum hatte ich so viel Mühe? Jedenfalls habe ich die Demo aktualisiert und werde eine Notiz im Artikel machen.
Flexbox, rockt.
Flexbox ist in der Tat großartig :)
Für mein aktuelles Projekt arbeite ich ebenfalls mit Flexbox. Es löst viele CSS-Layout-Probleme und ermöglicht uns die Gestaltung von "Webanwendungs"-Stil. Ich muss zugeben, dass ich mich immer noch nicht wirklich daran gewöhnt habe und immer wieder auf die üblichen Demos schaue.
Ich habe kürzlich versucht, Webkarten-Objekte in einem Grid mit Flexbox auszurichten. Meine Idee war: Wenn es nur ein Element gibt, ist es in der Mitte (vertikal UND horizontal // alias heiliger Gral). Dann füllt es sich auf. Jede Zeile kann drei Elemente haben, es kann mehrere Zeilen geben.
Meine Probleme begannen mit der zweiten Zeile (mit `flex-wrap: wrap`): Ich hatte Probleme, ein Drei-mal-Drei-Grid gleichmäßig auszurichten (horizontal und vertikal mit "space-around"). Auch für die zweite Zeile sah die `center`-Eigenschaft seltsam aus. Erste Zeile mit drei Elementen, zweite Zeile mit zwei horizontal zentrierten Elementen, hm. Ich habe alle möglichen obskuren Hacks (wie `nth-child`) ausprobiert und schließlich aufgegeben.
@Chris: Dein Beispiel ist wie üblich schön und einfach. Vielleicht nehme ich das stattdessen. Auf Mobilgeräten gibt es sowieso keine Spalten.
Aber ich wäre neugierig zu wissen, ob es ein CodePen-Beispiel gibt, das etwas wie das Obige in beiden Achsen (x & y) zeigt.
Ihr Beispiel funktioniert in Firefox 22+ auch so, wie es ist. Was Firefox noch nicht unterstützt, bis Version 28, ist `flex-wrap` und `flex-flow`. Wenn Sie diese also nicht benötigen und eine Entscheidung treffen müssen, ob Sie Flexbox implementieren möchten, zählen Sie Firefox-Benutzer zu der Gruppe "Pro Flexbox verwenden".
Die Probleme damit und mit IE10/11 haben mich heute erwischt, und Sie haben ganz recht, Chris, das sieht nach einem Implementierungsfehler von M$ aus.
https://connect.microsoft.com/IE/feedback/details/802625/min-height-and-flexbox-flex-direction-column-dont-work-together-in-ie-10-11-preview
Jeder, der bereit ist, sich mit der Bürokratie der Registrierung bei der MS Connect-Seite auseinanderzusetzen und diesen Fehler mit "+1" zu markieren, wäre sehr dankbar.
Hm, das ist frustrierend. Hat jemand eine gute Umgehungslösung, um in IE10 einen Container zu füllen?
Chris,
Das scheint nicht innerhalb eines `table-cell`-Elements zu funktionieren. Sehen Sie dieses Beispiel: http://jsbin.com/xexojefu/2/