Flexbox ist ziemlich genial und sicherlich Teil der Zukunft des Layouts. Die Syntax hat sich in den letzten Jahren ziemlich verändert, daher die „alte“ und „neue“ Syntax. Aber wenn wir die alten, neuen und dazwischen liegenden Syntaxen miteinander verweben, können wir eine gute Browserunterstützung erzielen. Besonders für einen einfachen und wahrscheinlich den häufigsten Anwendungsfall: gitterkontrollierte Grids
Das HTML
Ein semantisch bedeutungsloser Wrapper umgibt die drei Hauptbereiche und legt den Flexbox-Kontext fest. Jeder der Bereiche ist semantisch markiert und wird in Spalten umgewandelt.
<div class="page-wrap">
<section class="main-content" role="main">
Main content: first in source order
</section>
<nav class="main-nav" role="navigation">
Links
</nav>
<aside class="main-sidebar" role="complementary">
Sidebar
</aside>
</div>
Das Endergebnis sieht so aus

Flexbox-Kontext
Wir müssen den Container für unsere Spalten zu einem Flexbox-Display-Kontext machen. Alle direkten Kinder dieses Elements werden dadurch zu Flex-Items. Es spielt keine Rolle, was sie vorher waren, sie sind jetzt Flex-Items.
Sofort müssen wir die alten, neuen und dazwischen liegenden Syntaxen miteinander verweben. **Die Reihenfolge ist hier wichtig**. Da die `display`-Eigenschaft selbst nicht präfixiert ist, müssen wir sicherstellen, dass wir neuere Syntaxen nicht mit älteren überschreiben, für Browser, die beides noch (und wahrscheinlich immer) unterstützen.
.page-wrap {
display: -webkit-box; /* OLD - iOS 6-, Safari 3.1-6 */
display: -moz-box; /* OLD - Firefox 19- (buggy but mostly works) */
display: -ms-flexbox; /* TWEENER - IE 10 */
display: -webkit-flex; /* NEW - Chrome */
display: flex; /* NEW, Spec - Opera 12.1, Firefox 20+ */
}
Breitenkontrolle der Spalten
Unser Ziel hier ist ein 20% / 60% / 20% Gitter.
Schritt 1 ist, unseren Hauptinhalt auf 60% festzulegen.
Schritt 2 ist, die äußeren Seitenleisten so einzustellen, dass sie den verbleibenden Platz gleichmäßig ausfüllen.
Auch hier müssen wir alte, neue und dazwischen liegende Syntaxen miteinander verweben.
.main-content {
width: 60%;
}
.main-nav,
.main-sidebar {
-webkit-box-flex: 1; /* OLD - iOS 6-, Safari 3.1-6 */
-moz-box-flex: 1; /* OLD - Firefox 19- */
width: 20%; /* For old syntax, otherwise collapses. */
-webkit-flex: 1; /* Chrome */
-ms-flex: 1; /* IE 10 */
flex: 1; /* NEW, Spec - Opera 12.1, Firefox 20+ */
}
In der neuen Syntax ist das Festlegen der Breite für die Seitenleisten nicht notwendig, da sie die verbleibenden 40% gleichmäßig ausfüllen und somit beide 20% ergeben. Aber ich habe festgestellt, dass das Nicht-Festlegen zu einer gewissen Breitenkollision mit den alten Syntaxen führte.
Spalten-Neuanordnung
Wir möchten, dass der Hauptinhalt visuell in der Mitte erscheint, aber im Quellcode an erster Stelle steht. Einfach in Flexbox, aber natürlich müssen wir die neue, alte und dazwischen liegende Syntax verweben.
.main-content {
-webkit-box-ordinal-group: 2; /* OLD - iOS 6-, Safari 3.1-6 */
-moz-box-ordinal-group: 2; /* OLD - Firefox 19- */
-ms-flex-order: 2; /* TWEENER - IE 10 */
-webkit-order: 2; /* NEW - Chrome */
order: 2; /* NEW, Spec - Opera 12.1, Firefox 20+ */
}
.main-nav {
-webkit-box-ordinal-group: 1;
-moz-box-ordinal-group: 1;
-ms-flex-order: 1;
-webkit-order: 1;
order: 1;
}
.main-sidebar {
-webkit-box-ordinal-group: 3;
-moz-box-ordinal-group: 3;
-ms-flex-order: 3;
-webkit-order: 3;
order: 3;
}
Browser-Unterstützung
Wenn Sie all dieses Weben betreiben, können Sie
- Chrome jeder
- Firefox jeder
- Safari jeder
- Opera 12.1+
- IE 10+
- iOS jeder
- Android jeder
Der größte limitierende Faktor ist natürlich IE, aber ansonsten ist es ziemlich gut. Wenn Sie eine mobil-spezifische Version einer Website erstellen, sind Sie in noch besserer Verfassung. Wenn jemand es auf einem Windows Phone testen kann, lassen Sie es mich wissen.
Firefox 19- ist etwas fehlerhaft und Sie müssen aufpassen. Zum Beispiel konnte ich in dieser Demo keine Möglichkeit finden, die Seitenleisten tatsächlich auf 20% zu erzwingen. Sie werden einfach auf die Breite des darin enthaltenen Inhalts reduziert, was etwas willkürlich ist, da es sich um Text handelt. Ich brauchte auch -moz-box-flex: 1; für den Hauptinhalt (60%), sonst würde er so breit werden wie der breiteste Absatz, als hätte er white-space: nowrap, was mir einfach unerklärlich ist.
Demo
Check out this Pen!
Flexbox ist definitiv etwas, das es wert ist, gelernt zu werden. Danke für dieses saubere Tutorial, Chris. :)
Tolle Informationen, Chris, ich frage mich (abgesehen von der visuellen Neuanordnung von Inhalten), was die Vorteile der Verwendung von Flex gegenüber traditionellem Code wie einfachen Breiten mit Floats sind?
Dieser Vortragsbericht könnte helfen, den Hintergrund zu erklären: http://adactio.com/journal/6049/
Schöner Artikel. Fans davon möchten sich vielleicht die Flexy Boxes Flexbox-Spielwiese ansehen, die Legacy- und moderne Flexbox-Syntax ähnlich wie hier generiert.
Vielen Dank an den Autor, Chris Coyier. Die Verwendung von Flexbox macht Sinn, besonders wenn wir mit modernen Browsern arbeiten (irgendwann in naher Zukunft, hoffe ich).
Pete B: Sie haben den Link zu Flexy Boxes hinzugefügt, was sehr sinnvoll ist: eine Web-App, die uns hilft, mit Flexbox zu beginnen – danke.
Schade, dass es keine Unterstützung unter IE 10 gibt. Dann wäre es perfekt.
html5please.com rät derzeit davon ab, es zu verwenden http://html5please.com/#flexbox
Hier ist ein Polyfill für Flexbox, ich habe es aber noch nicht getestet https://github.com/doctyper/flexie
Aber da es sogar IE9 unterstützt, würde ich es nicht für Desktop-Websites verwenden
Wenn Sie die Verwendung eines Polyfills in Betracht ziehen, könnten Sie genauso gut .flexbox und .flexboxlegacy in Ihrem CSS mit Modernizr ansprechen. Ich meine, es sei denn, Sie haben sich fest vorgenommen, dass Ihr Flexbox-Layout in IE9 angezeigt wird. Ich neige dazu, ältere Browser bei so etwas im Stich zu lassen. Wenn sie keine Flexbox haben, bekommen sie einfach das Nicht-Flexbox-Layout. Andererseits verwende ich Flexbox nur für größere Bildschirme, die mit Media Queries angesprochen werden, daher würde ich Flexbox nicht für ein Standardlayout empfehlen.
Weiß jemand von einem guten Polyfill, der die Unterstützung für IE8 oder zumindest IE9 mit dieser Syntax ergänzen kann? Hat jemand Flexie ausprobiert?
Kein vollständiger Polyfill, aber hier ist, wie Sie etwas Ähnliches in IE8 und IE9 tun können: http://codepen.io/CalebKester/pen/eLDzm
Beachten Sie, dass dies recht schnell gemacht wurde, aber es zeigt Ihnen, dass es immer noch möglich ist, das Kernlayout zu erstellen. Sie müssen Ihre HTML neu organisieren, aber es ist immer noch nicht so schlimm.
Die Vorteile von FlexBox (als Antwort auf Andy Howells' Frage) sind nicht nur die Reihenfolge, sondern hauptsächlich das automatische Ausfüllen von Abständen und die sehr clevere Positionierung
• Sie können ein Element auf einem übergeordneten Element auf viel bessere Weise positionieren (zentriert, unten zentriert, rechts oben usw.), ohne
position: absolute;verwenden zu müssen.• Sie können gleich hohe Spalten und Spalten haben, die horizontalen Raum automatisch ausfüllen (wie hier gezeigt), und diese können auch Räume nach Verhältnissen ausfüllen.
• Alle Positionierungen werden vereinfacht (obwohl es sich um eine fast neue zu lernende Syntax handelt).
Ich habe die Leistung von Flexbox nie wirklich voll erkannt, bis ich einfach nach einem Flexbox-Polyfill gegoogelt habe und auf diese fantastische Bibliothek namens Flexie gestoßen bin.
http://flexiejs.com/playground/?random
Leider unterstützt sie nur das alte Modell, aber sie scheint es recht gut zu tun. Wenn nichts anderes, gibt Ihnen die fantastische Spielwiese, auf die ich verlinkt habe, ein großartiges Verständnis der Fähigkeiten von Flexbox. Ich hatte wirklich keine Ahnung!
Die Demo funktioniert auf Windows Phone 8 hervorragend.
Ja, es funktioniert hervorragend – keine große Überraschung, da Mobile IE10 im Grunde auf derselben Rendering-Engine läuft wie die Desktop-Version.
Nur zur Info, flexie.js verwendet die alte Syntax, daher sollten Sie es vermeiden, bis es aktualisiert wurde. Der Entwickler hat gepostet, dass es derzeit etwa 35% abgeschlossen ist.
https://github.com/h5bp/html5please/pull/221
Nokia Lumia Windows Phone IE. Wenn Sie sich im Detailmodus von Codepen befinden und ins Querformat drehen, nimmt der Container die halbe Breite ein. Hochformat sieht im Bearbeitungsmodus gut aus, aber nicht im Detailmodus.
Codepen im Hochformat nimmt zwar nicht die volle Breite ein. Ich kann Ihnen Screenshots schicken, wenn Sie möchten.
Meiner Meinung nach ist der ideale Weg, wenn Sie Flexbox verwenden möchten, *nur* die neueste Syntax zu verwenden und für Browser, die sie nicht unterstützen, einfach ein alternatives Layout bereitzustellen.
Beispiel (für ein Element, das sich innerhalb eines Flexbox-Containers befindet
Sicher, machen Sie zwei völlig unterschiedliche Layouts für dieselbe Website. Als ob wir nicht schon genug zu tun hätten.
Ziemlich coole Sache, Chris. Ich habe mich gefragt, ob jemand eine Idee zur Unterstützung auf BlackBerrys hat. Über 70% des mobilen Traffics, den wir von dem Unternehmen erhalten, in dem ich arbeite, stammt von BlackBerry-Geräten und kann wirklich frustrierend sein. Leider unterstützt BrowserStack derzeit keine BlackBerry-Geräte (._.).
Hey Chris!
Auf IE9 Mobile (Nokia Lumia 800) getestet und die divs blieben statisch, als ob Sie nichts getan hätten.
Ich wusste vorher nichts über Flexbox. Danke, dass Sie einen detaillierten Artikel über die Verwendung von Flexbox geschrieben haben. Ich mag die Reihenfolge der Elemente nach Priorität, ziemlich cool. Ich denke, es gibt viel Raum für Verbesserungen Ihres Codes, aber er ist immer noch sehr nützlich. Ich habe ihn unter IE10 getestet und er funktioniert einwandfrei.
Cool! Hier ist alles aus diesem Beitrag im Sass-Mixin-Format: http://codepen.io/bensmithett/pen/neuyI
Danke für das Sass-Mixin, Ben! Ich habe mir die Freiheit genommen, es in SCSS zu konvertieren, für alle, die diese Syntax verwenden möchten.
http://codepen.io/adamjohnson/pen/savzI
Tatsächlich gibt es einige Dinge, die nicht direkt zwischen den Spezifikationen übersetzt werden können, sodass Sie Ihre Werte nicht einfach in die präfixierten Eigenschaften fallen lassen können. Es gibt subtile Unterschiede zwischen den Spezifikationen, wie z. B. „flex-start“ vs. „start“ oder „space-between“ vs. „justify“. Die „order“-Eigenschaft beginnt bei 0, während „box-ordinal-group“ bei 1 beginnt.
Compass-Benutzer können diese Mixins verwenden (ich plane, sie dem Compass-Projekt zur Verfügung zu stellen, sobald ich mir ihrer Zuverlässigkeit sicher bin): https://gist.github.com/cimmanon/4461470
Es sollte angemerkt werden, dass kein Browser, der der Spezifikation von 2009 folgte, jemals Wrapping implementierte. Obwohl Firefox die Unterstützung für die Standard-Spezifikation hinzufügte, schließt er die Unterstützung für Wrapping vorerst aus.
Ich habe gerade mit FF19 Beta getestet. Musste
layout.css.flexbox.enabled = truein about.config setzen, aber das hat es auch ohne-moz-box-flex: 1;zum Laufen gebracht.Oh, und der
-moz-Prefix wird bald wegfallen (siehe hier).Es scheint, dass Dominic Recht hat. Das Ändern von
layout.css.flexbox.enabledauftruescheint die Probleme zu beheben, die Sie in Firefox hatten. Großartiger Artikel trotzdem und nochmals vielen Dank, Chris. Ich freue mich darauf, Flexbox in naher Zukunft zuverlässig über Browser hinweg nutzen zu können.Schön zu sehen, dass auch ARIA-Landmarken verwendet werden ;)
Ich habe ein kleines Experiment gemacht, um mit Flexbox zu spielen und eine Art flexibles Schriftart erstellt.
http://etienne.pouvreau.free.fr/#fantome
Nur zum Spaß & Testen natürlich :-)
Ihr Beitrag wird mir helfen, ihn zu verbessern... Danke.
Ziemlich gute Methode, sie wird in Zukunft weit verbreitet sein.
Wenn Compass nur ein Mixin hätte, das all diese Dinge für mich tun würde…
Eine große Einschränkung, die ich bei Flexbox gefunden habe, ist, dass es nur auf direkte Kinder wirkt. Dies ist ein großes Problem, wenn Ihre Inhaltselemente Teil eines Spaltenplatzhalters sind und nicht eines einzelnen Hauptelternteils, wie dieser Artikel zeigt. Eine vollständige Erklärung dieses Problems
http://stackoverflow.com/questions/14148162/does-the-css-flexbox-module-work-on-direct-child-elements-only
Mein einziges Hauptanliegen ist der Mangel an IE-Unterstützung (ich denke für < IE10). Zu diesem Zeitpunkt kann ich die Verwendung von Flexbox für kommerzielle Zwecke einfach nicht rechtfertigen.
Es ist gut, eine so gute Unterstützung für Flexbox zu haben, aber was ist sie wert, wenn man für fast jeden IE eine alternative Lösung finden muss?
Ich bin ein großer Befürworter der graceful degradation und kümmere mich normalerweise nicht viel um oldIE, aber im Fall von Flexbox ist es noch nicht bereit für produktive Arbeit, bis oldIE ausstirbt (was nicht passieren wird) oder es einen Polyfill gibt. Wenn Sie sich nur um Webkit kümmern müssen, d.h. Apps, dann ist Flexbox definitiv der richtige Weg, aber für eine normale Website ist es meiner Meinung nach viel zu viel Aufwand.
Übrigens, hier ist eine gute Übersicht von mir über die neue Flexbox-Syntax: http://www.sitepoint.com/flexbox-css-flexible-box-layout/
Firefox hat einen Fehler beim (Festlegen von Breiten in Prozent)[https://bugzilla.mozilla.org/show_bug.cgi?id=529761]
Leute haben erfunden
<
Tabelle> wieder
Außer dass Flexbox semantisch und responsiv ist.
Richtig…
Toller Artikel :)
Es ist sehr einfach zu verwenden und zu implementieren
Flexbox macht mich wieder für CSS begeistert. Wenn es nur einen soliden Polyfill gäbe, zumindest für IE9.
Vielen Dank, Chris… getestet auf IE10, funktioniert hervorragend!
Tolle Informationen. Dieser Beitrag zeigt den aktuellen Stand (22.02.13) von Flexbox: Was für eine Katastrophe.
Sieht interessant aus und ich kann definitiv den Nutzen erkennen, aber die IE10+-Unterstützung macht es für mich unbrauchbar.
Erfordert diese Methode „skip to nav“-Links, oder ist sie schnell genug, um per Tab durch den Inhalt zu springen?
@Peter, Ich bin mir nicht sicher, ob ich Ihren Kommentar falsch verstanden habe, aber anstatt die „skip to nav“-Links zu verwenden (was meiner Meinung nach eher „skip to main content“ oder „skip navigation“ sein sollte), könnten Sie WAI-ARIA Landmark Roles verwenden.
Laut WAI-ARIA Best Practices Editors’ Draft:
Landmarks sind eine massive Verbesserung gegenüber der rudimentären Technik „skip to main content“, die vor WAI-ARIA verwendet wurde. Wenn möglich, ist es am besten, diese als Landmarks zu verwenden.
Prost.
Sollten Quellcode- und visuelle Reihenfolge übereinstimmen?
110% einverstanden.
Es verursacht nicht nur Usability-Probleme, sondern hat auch ernsthafte SEO-Auswirkungen.
Ihre Quellcode-Reihenfolge sollte Ihre Inhaltsstruktur widerspiegeln.
Normalerweise haben Mobile IEs dieselben Funktionen wie ihre Desktop-Gegenstücke. Windows Phone 7 mit IE9 würde Flexbox also nicht unterstützen, aber auf Windows Phone 8 mit IE10 sollte es mit Ihrer „Tweener“-Lösung funktionieren.
Ich habe tatsächlich ein LESS Mixin Projekt zusammengestellt, um dies zu erleichtern. Schauen Sie sich die Demo-Seite an!
Wie stylt man ein Element basierend auf seiner Reihenfolge in Flexbox? nth-child(n), first-child etc. funktionieren auf der Position im Markup
aber was ist mit dem Styling für das Element mit order:1.
Ist das möglich, da dies eine CSS-Übereinstimmung mit der Anwesenheit eines anderen Stils erfordert???
Es ist ein bisschen ein Hack, aber um den FF-Prozentfehler zu umgehen, können Sie -moz-calc und die vw-Einheit verwenden. Ziehen Sie den Body-Rand (8px zweimal) und den Innenabstand (2em zweimal) von der gesamten Ansichtsfensterbreite ab und multiplizieren Sie dann mit einer Dezimalzahl anstelle eines Prozentsatzes (.2):
-moz-calc((100vw - 4em - 16px) * 0.2). Offensichtlich keine gute Lösung für mehr als die einfachsten Formeln.Ich frage mich, warum die Seite beim Absenden neu geladen wird und nicht mit einer Art jQuery aktualisiert wird!
Entschuldigen Sie all diesen Müll! Ich teste nur.
Sie können meine Beiträge gerne entfernen.
Das ist wirklich großartig! Endlich hat CSS etwas, das es uns ermöglicht, Seitenleisten mit fester Breite und flexibel breiten Inhaltsspalten zu haben! Bis jetzt konnte nur die verdammte alte Tabelle das erreichen!
Ich habe einen kleinen Test gemacht, indem ich min-width und max-width zusammen mit %-basierter Breite für die Seitenleisten gesetzt habe und den Inhalt ohne Breitenangabe belassen habe. Es hat hervorragend funktioniert. Wenn ich die Browserbreite reduziere, wird der Inhalt sehr schmal und die Seitenleisten bleiben bei min-width. Und wenn ich den Browser auf meinen 3 Monitoren öffne, wird der Inhalt sehr groß, während die Seitenleisten bei ihrer max-width bleiben! Wenn ich Spalten-CSS-Attribute im Inhalt verwende, kann ich eine wirklich schön lesbare Website erhalten, die für große Monitore optimiert ist!
Jetzt muss ich einen Weg finden, beide Seitenleisten auf wackligen, hässlichen, von Teufeln geborenen Handys auszublenden/nach unten zu verschieben.
Ich schreibe einen Testfall. Er sieht in Chrome gut aus, scheint aber unter iOS nicht zu funktionieren.
IOS 6.1 verwendet die alte Syntax.
http://jsbin.com/aqunam/1372/edit/
Das Konzept ist einfach, ich habe eine Container-Box mit drei Elementen darin. Allerdings werden die Breiten nicht gleichmäßig im Container verteilt.
Was mache ich falsch?
mit Tabelle und 3D-Transformation
http://codepen.io/yukulele/pen/KLsnv
jQuery-Code, viel kürzer….
$(document).ready(function(){
$( “.main-content” ).insertAfter( $( “.main-nav” ) );
});
Ist es möglich, eine feste Breite für die Seitenleisten zu verwenden?