Jeden Tag spreche ich bei Shopify mit Partnern, die ständig die Grenzen des Möglichen im E-Commerce-Design erweitern. In letzter Zeit habe ich eine Reihe von Designern beobachtet, die mit Flexbox in ihren Shops experimentieren. Als Webdesigner und Entwickler ist eines unserer Hauptziele, den Fokus auf den Inhalt zu lenken und es unseren Besuchern zu erleichtern, diesen Inhalt zu navigieren. Um dieses Ziel zu erreichen, benötigen wir ein funktionierendes Layout, bei dem die Technologie in den Hintergrund tritt und der Inhalt zum Helden wird.
Flexbox kann uns helfen, flexible Layouts zu erstellen, die für das Web und mobile Geräte optimiert sind. Aber nutzen wir es? Viele von uns verwenden immer noch Floats und inline-block für das Layout. Natürlich kennen Sie Ihr Publikum am besten. Wenn Sie beispielsweise viele Benutzer unter IE 9 und darunter haben und nicht bereit sind, eine akzeptable Fallback-Erfahrung zu schaffen, sind Sie vielleicht im Float-Land gefangen. Aber es gibt heutzutage eine Menge Grün (Unterstützung) im Flexbox-Land.
Ich glaube an die Kraft des Lernens durch Tun. Dieser Artikel führt Sie durch die kürzliche Veröffentlichung eines kostenlosen Shopify-Themes namens Venture und die Schritte zur Nachbildung des folgenden Produktlayouts mit Flexbox.

Wenn Sie dem Beispiel in diesem Beitrag folgen möchten, schauen Sie sich den vollständigen Pen an.
In diesem Tutorial-Artikel zeige ich Ihnen, wie Sie ein flexibles und responsives Produktlayout mit Flexbox erstellen, das je nach Viewport-Breite auf einzigartige Weise den Fokus auf Produkte legt. Außerdem machen wir das alles in weniger als 100 Zeilen CSS.
Dies basiert auf dem "Venture"-Theme
Das Theme-Design-Team von Shopify hat kürzlich eine ziemlich coole Vorlage für Shopify-Händler namens Venture veröffentlicht. Das Layout ist für das beste Einkaufserlebnis optimiert und legt klaren Fokus auf die Produkte. Während das Layout entwickelt wurde, um verschiedene Geschäftsanforderungen zu erfüllen, konzentrieren wir uns für dieses Tutorial-Beispiel auf den Kern des Layouts und erstellen es mit Flexbox nach. In den folgenden Schritten lernen wir, wie man Elemente horizontal ausrichtet, perfekte Sticky-Footer erstellt, bestimmten Produkten Priorität je nach Viewport und Gerät einräumt, Flexbox-Elemente mit Media Queries anspricht und die Grundlagen von Flexbox lernt, damit Sie mit der Implementierung von Flexbox-Layouts in Ihrem nächsten Webprojekt beginnen können.

Wenn Sie den Codeausschnitt aus diesem Beitrag in einem Shopify-Store mit echten Produkten verwenden möchten, melden Sie sich als Shopify-Partner an und richten Sie einen kostenlosen Entwicklungsspeicher ein. Ein Entwicklungsspeicher bietet Ihnen Zugriff auf alle kostenpflichtigen Funktionen eines Shopify-Stores, sodass Sie ihn als Sandbox-Umgebung zum Experimentieren oder zur Arbeit an einem Theme für einen Kunden nutzen können.
Das Header-Layout
Zuerst richten wir unsere Filter-Navigation ein, die unsere Überschrift und zwei Filterelemente (Dropdowns) mit Labels enthält.

Beginnen wir mit der Einrichtung eines Flexbox-Containers mit seinem Inhalt
<nav class="product-filter">
<h1>Jackets</h1>
<div class="sort">
<div class="collection-sort">
<label>Filter by:</label>
<select>
<option value="/">All Jackets</option>
</select>
</div>
<div class="collection-sort">
<label>Sort by:</label>
<select>
<option value="/">Featured</option>
</select>
</div>
</div>
</nav>
Unsere .product-filter wird unser Flex-Container sein, damit wir die untergeordneten Flex-Elemente entsprechend ausrichten können. Wir deklarieren den Flex-Container wie folgt:
.product-filter {
display: flex;
}
Unser <h1>-Element erhält den Wert flex-grow: 1, sodass es den Flex-Container auf volle Breite erweitert und sich selbst auf die verbleibende Fläche ausdehnt (was die Sortier-Dropdowns rechtsbündig ausrichtet).
.product-filter h1 {
flex-grow: 1;
}
Um die Kindelemente unseres .sort-container horizontal auszurichten, machen wir ihn ebenfalls zu einem Flex-Container. Sie können Flex-Container verschachteln!
.sort {
display: flex;
}
Die Sortiercontainer, die <div>s sind, werden standardmäßig übereinander gestapelt.

Standardmäßig richtet display: flex; Kindelemente horizontal aus. Wir verwenden dies im Sortiercontainer, um sie nebeneinander auszurichten. Wir machen jeden einzelnen Sortiercontainer ebenfalls zu einem Flex-Container (ein dritter verschachtelter Flex-Container!) und verwenden *auch* flex-direction: column; für die Filter, damit sie vertikal ausgerichtet werden.
.collection-sort {
display: flex;
flex-direction: column;
}

Mit wenigen CSS-Zeilen sind unsere Überschrift und die Filter so gestaltet, wie wir es wollen. Nun werden wir mit unserem aktuellen Wissen über Flexbox an unserem Gitterlayout für unsere Produkte arbeiten.
Das Produktlayout
Wir verwenden den folgenden HTML-Code für unser Flexbox-Layout.
<section class="products">
<!-- It's likely you'll need to link the card somewhere. You could add a button in the info, link the titles, or even wrap the entire card in an <a href="..."> -->
<div class="product-card">
<div class="product-image">
<img src="assets/img/coat-01.jpeg">
</div>
<div class="product-info">
<h5>Winter Jacket</h5>
<h6>$99.99</h6>
</div>
</div>
<!-- more products -->
</section>

Wie zuvor benötigen wir einen Flex-Container. In diesem Szenario verwenden wir .products als unseren Flex-Container. Wir fügen zwei neue Eigenschaften hinzu, die es den Flex-Kindern ermöglichen, sich horizontal auszurichten *und* in neue Zeilen umzubrechen, wenn sich die Viewport-Breite erweitert und verkleinert.
.products {
display: flex;
flex-wrap: wrap;
}
Standardmäßig ordnet display: flex; die Kindelemente horizontal von links an, aber wir haben flex-wrap: wrap; hinzugefügt, um die Kindelemente in eine neue Zeile umzubrechen, sobald nicht genügend Platz vorhanden ist, um die Elemente in derselben Zeile unterzubringen, abhängig von der Viewport-Breite.
Um die Breite unserer Flex-Elemente zu steuern, fügen wir flex: 1; hinzu, damit alle unsere Flex-Elemente gleichen Platz in der Zeile einnehmen. In unserem Beispiel haben wir 10 Jackenprodukte, und mit flex: 1; werden alle Produkte in einer Zeile platziert.

Für unser Design möchten wir 5 Artikel pro Zeile haben und den Rest bei Bedarf in neue Zeilen umbrechen. Um fünf pro Zeile zu erhalten, müssen sie eine Breite von 20% haben (5 * 20 = 100). Die Einstellung von flex-basis: 20% würde funktionieren, aber wenn wir die Polsterung berücksichtigen, überschreitet sie 100% und wir erhalten nur 4 pro Zeile. Mit 2% Polsterung auf beiden Seiten und 16% flex-basis passt es genau.
.products {
display: flex;
flex-wrap: wrap;
}
.product-card {
padding: 2%;
flex-grow: 1;
flex-basis: 16%;
display: flex; /* so child elements can use flexbox stuff too! */
}
Wir können dies auch in Kurzschreibweise wie folgt tun:
.product-card {
flex: 1 16%;
}
Wenn flex-grow für die Produkte auf 1 gesetzt ist, wird sichergestellt, dass die Produktzeile immer den gesamten Platz ausfüllt.
Damit die Bilder darin gut passen:
.product-image img {
max-width: 100%;
}
Produktdaten unten ausrichten
Es kann manchmal schwierig sein, einen festen Footer einzustellen oder Inhalte am unteren Rand eines Containers zu platzieren. Flexbox kann uns auch dabei helfen. Wenn Sie dem Code Schritt für Schritt gefolgt sind, werden Sie sehen, dass das Label für unsere Jacken nicht perfekt unter den Jackenbildern ausgerichtet ist.

Dieses Szenario ist üblich: Wir können die Höhe oder Länge des Inhalts nicht steuern, möchten aber ein anderes Element perfekt am unteren Rand des Containers ausrichten. Flexbox hilft uns bereits dabei, die Container selbst mit gleicher Höhe pro Zeile zu halten, aber die Bilder sind immer noch von variabler Höhe.
Beliebte Methoden zur Ausrichtung der Unterseiten erfordern möglicherweise die Verwendung von absoluter Positionierung oder sogar JavaScript. Glücklicherweise kann mit Flexbox diese komplexe Aufgabe durch einfaches Hinzufügen des folgenden CSS zu unserem .product-info-Container gelöst werden:
.product-info {
margin-top: auto;
}
Das ist alles! Flexbox ist intelligent genug, um das Element dann am unteren Rand des Flex-Containers zu platzieren. Mit ein paar Zeilen Stil erhalten wir das folgende Ergebnis:

Responsives Flexboxing
Da wir weniger horizontalen Platz zur Verfügung haben, möchten wir die Anzahl der Produkte pro Zeile reduzieren. Wenn beispielsweise der maximale Viewport 920px beträgt, möchten wir, dass die Anzahl der Artikel pro Zeile auf vier begrenzt ist, was wir mit Folgendem erreichen können:
@media (max-width: 920px) {
.product-card {
flex: 1 21%;
}
}
(Denken Sie daran, dass es nicht 25% (100% / 4) sind, weil wir die Polsterung, die ich zuvor hinzugefügt habe, kompensieren müssen. Das könnten wir mit box-sizing: border-box vermeiden, aber das ist Ihre Entscheidung.)
Die vorherigen CSS-Zeilen ergeben fast das gewünschte Ergebnis, da wir vier Artikel pro Zeile erhalten. Aber die *letzte* Zeile hat zwei große Artikel.

Flexbox ist intelligent genug, um jeden verfügbaren Platz auszufüllen, worüber wir uns bei anderen Layout-Methoden keine Gedanken machen müssen. Um das Layout für diesen Viewport zu verbessern, würden wir es vorziehen, größere Bilder der Jacken oben anstatt unten zu haben, um die Produkte besser hervorzuheben.
Eine Möglichkeit, die ersten zu vergrößern und nicht die letzten beiden, besteht darin, sie auszuwählen und ihre Größe direkt zu ändern:
/* Select the first two */
.products .product-card:first-child,
.products .product-card:nth-child(2) {
flex: 2 46%;
}
Jetzt, mit unserem angewendeten CSS, erhalten wir ein wirklich großartiges Layout, das für kleinere Viewports wie iPads im Hochformat optimiert ist.

Für noch kleinere Viewports bevorzugen wir ein zweispaltiges Layout für die Jacken. Wir können dieses Layout mit der folgenden Media Query erreichen:
@media (max-width: 600px) {
.product-card {
flex: 1 46%;
}
}

Wenn wir unsere Seite nun auf einem kleineren Viewport wie einem iPad im Hochformat betrachten, stellen wir fest, dass unsere Filter-Navigationsleiste unsere Überschrift überlappt.

Das passiert, weil unser .product-filter so eingestellt ist, dass alle unsere Flex-Elemente in einer horizontalen Linie enthalten sind, unabhängig davon, wie viele Elemente er enthält (kein Umbruch). Mit dem folgenden Code können wir dies mit einer Media Query leicht ändern, sodass unser Inhalt vertikal ausgerichtet wird:
@media (max-width: 480px) {
.product-filter {
flex-direction: column;
}
}

Unsere Kopfzeile und Filter überlappen sich nicht mehr, aber wir können das Layout immer noch verbessern, indem wir die Filter nach links verschieben. Zuvor haben wir die Elemente mit der Eigenschaft align-self: flex-end; nach rechts verschoben. Nun wollen wir align-self: flex-start; hinzufügen:
@media (max-width: 480px) {
.product-filter {
flex-direction: column;
}
.sort {
align-self: flex-start;
}
}

Und schon haben wir ein flexibles und responsives Layout für unsere Produkte.
Kompatibilität
Der größte Einwand gegen Flexbox ist immer die Browserunterstützung. Aber wie wir bereits in diesem Artikel erwähnt haben, ist die Unterstützung heutzutage ziemlich gut. Ältere IE-Versionen, die Flexbox nicht unterstützen, werden nicht einmal mehr von Microsoft unterstützt.
Wie bei jedem Webprojekt, an dem Sie arbeiten, sollten Sie immer gründliche Tests durchführen, um sicherzustellen, dass das Erlebnis Ihrer Besucher optimiert ist und Ihr Layout den Anforderungen Ihres Projekts entspricht.
Fazit
Im obigen Tutorial haben wir ein leistungsstarkes responsives Layout zur Anzeige einer Produktmenge mit Flexbox erstellt. Im Gegensatz zu anderen CSS-Methoden, die nicht für die Erstellung von Layouts gedacht sind, ist Flexbox ein leistungsstarkes Werkzeug, das auf dieses Ziel ausgerichtet ist, und Sie sollten es nutzen. Flexbox-Layouts können unsere Websites und Apps flexibler und widerstandsfähiger machen.
Es gibt viel über Flexbox zu wissen, also stellen Sie sicher, dass Sie The Complete Guide to Flexbox als Referenz verwenden.
Guter Artikel, danke, aber ich ziehe es vor, box-sizing: border-box zu verwenden, anstatt die Polsterung in meine Berechnungen einzubeziehen.
Danke für dieses Feedback, Ado, ein wirklich guter Punkt!
Ich habe versucht, das zu tun, aber es gibt einen grellen IE-Bug, der meiner Meinung nach auch in den neueren, unterstützten Browsern existiert, bei dem box-sizing nicht in die Layoutberechnung einbezogen wird. Das Endergebnis ist Inhalt, der über den Flex-Container hinausfließt. Bäh :(
Angesichts der Tatsache, dass Flexbox in IE9 nicht unterstützt wird, halten Sie es dann immer noch für eine gute Praxis, einen Fallback für IE9 bereitzustellen, angesichts der globalen Nutzung, die weniger als 1% beträgt?
http://caniuse.com/#search=flexbox.
Ich denke, es ist immer eine gute Praxis, einen Fallback für ältere Browser zu haben, aber ich persönlich würde nicht zu viel Zeit für die Unterstützung von IE9 aufwenden. Microsoft hat die Unterstützung für IE8, IE9 und IE10 offiziell eingestellt: http://thenextweb.com/microsoft/2016/01/05/web-developers-rejoice-internet-explorer-8-9-and-10-die-on-tuesday/
Haben Sie Flexibility ausprobiert, um die IE-Kompatibilität zu behandeln?
Levin, wäre es wertvoll oder überhaupt möglich, den Kompatibilitätsabschnitt für Leute zu aktualisieren, die diese älteren IE noch unterstützen?
https://github.com/10up/flexibility
Hallo Jonathan, ich habe Flexibility noch nicht ausprobiert, aber es sieht nach einer guten Alternative aus. Details zur Flexbox-Kompatibilitätsunterstützung finden Sie unter: http://caniuse.com/#feat=flexbox
Danke fürs Lesen :)
Es gibt auch das hier von unserem Kumpel Jon Neal! https://github.com/10up/flexibility
Sehr cool, danke für das Teilen dieser Ressource!
Die obere und untere Polsterung der
.product-card-Elemente funktioniert in Firefox nicht. Je nachdem, wem Sie glauben, ist das entweder ein Bug in Firefox oder ein Bug in allen anderen Browsern. :)Technisch gesehen wird bei einer prozentualen Einstellung der oberen und unteren Polsterung die Berechnung auf der Höhe des Containers basiert und nicht auf seiner Breite. Da der Container keine feste Höhe hat, werden die Werte auf 0 gesetzt.
Als Workaround können Sie die obere und untere Polsterung mit jeder anderen Einheit einstellen.
Danke für diese Einsicht, Richard, das wird bei der Fehlersuche in Firefox sicher nützlich sein :)
Sie haben vergessen,
<label>mit<select>in Ihrer Code-Demo zu verknüpfen.Danke für das Feedback!
Der Teil, bei dem Sie die ersten beiden vergrößern, funktioniert nur wegen der besonderen Anzahl von Elementen in diesem Beispiel, richtig? Gibt es also eine Möglichkeit, das zu verallgemeinern, außerhalb von JS?
Hallo Mark, Sie können die ersten beiden Elemente vergrößern, egal wie viele Elemente Sie in Ihrem Flexbox-Container haben. Um mehr darüber zu erfahren, wie das funktioniert, empfehle ich, sich mit der `flex-grow`-Eigenschaft zu beschäftigen. Mehr Informationen hier: https://css-tricks.de/snippets/css/a-guide-to-flexbox/ :)
Guter Artikel.
Aber ich widerspreche der Browserunterstützung. Flexbox selbst wird heutzutage sehr gut unterstützt. Aber sobald Sie `wrap` benötigen, sieht das Bild ganz anders aus. Zum Beispiel Safari 6 und darunter (auf OS und iOS) unterstützt kein Umbrechen, ebenso wie der Standard-Android-Browser auf 4.3 und darunter nicht. Ältere Mac OS-Versionen können ihr Safari einfach nicht aktualisieren. Und leider sehen die Ergebnisse ohne Umbruch, wenn man mit Umbruch im Hinterkopf programmiert, meist noch schlechter aus als gar keine funktionierende Flexbox.
Ich denke, das ist erwähnenswert.
Das ist ein guter Punkt, René. Wir sollten immer sicherstellen, dass wir gute Fallbacks für ältere Browser haben. Es ist auch wichtig, den Marktanteil zu prüfen, bevor wir Ressourcen für die Unterstützung bestimmter Browser aufwenden.
Danke fürs Lesen und für Ihr Feedback!
Es lohnt sich zu erwähnen, dass die Flexbox-Unterstützung nuancierter ist als ein einfaches Ja oder Nein.
Insbesondere
flex-wraphat eine weitaus problematischere Kompatibilitätsmatrix und fehlt in den Android-Browsern vor4.4.Ich bin mir nicht sicher, aber da Flexability Microsofts proprietäres
currentStyleverwendet, um Flexbox-CSS zu analysieren, gehe ich davon aus, dass dies bei Android-Problemen nicht hilft.Danke für dieses Feedback, ich bin mir nicht sicher, ob Flexability Android-Browser vor 4.4 unterstützt. Etwas, das man sich genauer ansehen sollte. Haben wir solide Zahlen zum Marktanteil von Android-Browsern? Jede Ressource wäre großartig.
Danke!
Laut caniuse liegt Android unter 4.3 bei einer globalen Nutzung von 1,66%.
Super, danke für die Info. Ich war mir bei den Zahlen nicht ganz sicher.
TxHawks: bezüglich der Nutzung von Android-Versionen unter 4.4 denke ich, es ist viel wichtiger, die Google-Statistiken zu prüfen, nicht "Can I use". Und laut diesen Statistiken haben alle Android-Versionen von 4.0 bis 4.3 (einschließlich) mehr als 25% Nutzung aller Android-Versionen.
Modernizr v3 enthält jetzt einen optionalen Test für `flexboxtweener` & speziell für das Umbrechen von Flex-Zeilen – was alle (glaube ich) Probleme mit `flex-wrap` lösen würde. Es gibt auch einige Workarounds: https://github.com/philipwalton/flexbugs
Persönlich würde ich versuchen, progressiv zu verbessern, anstatt Fallbacks an alle Browser auszuliefern. Leute mit modernen Browsern sollten für ihre Konformität belohnt werden :)
Ich habe zwei Dinge zu sagen:
Toller Artikel, ich würde mir auf jeden Fall mehr Beiträge von Ihnen wünschen
Scheiß auf IE
Danke, Julio! :)
Erster toller Artikel, ich werde das verwenden, um meinen eigenen Shop zu erstellen, aber mit WooCommerce.
@Julio: Genau. Wenn ich für einen Kunden arbeite, stelle ich sicher, dass ich Fallbacks bereitstelle, aber da dies mein eigenes Projekt ist und ich eine bestimmte Gruppe von Leuten anspreche, die verstehen, dass IE nur zum Herunterladen anderer Browser (mit mehr Webfunktionen) verwendet werden sollte, bin ich sicher.
Nochmals vielen Dank für diesen tollen Artikel, ich habe schon seit einiger Zeit nach etwas wie diesem gesucht.
Mit freundlichen Grüßen.
Freut mich zu hören, dass Sie den Artikel nützlich fanden! Wenn Sie sich eines Tages entscheiden, Shopify auszuprobieren, melden Sie sich bei mir! :)
Ich verwende ein Flexbox-Layout für viele Abschnitte der E-Commerce-Website, die ich erstellt habe, einschließlich Produkte. Wir müssen IE9 unterstützen, also habe ich einen Fallback für
.no-flexboxmit einem Inline-Block-Layout.Danke für diese Einsicht, Alex, es ist ein gutes Beispiel für progressive Verbesserung in der Praxis.
Ich weiß nicht, ob ihr getestet habt, aber ich hatte einige seltsame Erfahrungen mit
flex-direction: columnauf Mobilgeräten. Das ist auf zwei Projekten passiert, an denen ich gearbeitet habe.Als ich sie in meinem Browser getestet habe, war alles in Ordnung. Aber als ich die Projekte auf Mobilgeräten geöffnet habe, waren sie kaputt.
Um nicht die ganze Arbeit zu verlieren, musste ich ein paar knifflige Dinge tun: Ich habe
flex-wrap: wrapundflex-basis: 100%für die Elemente verwendet, die ich in Spalten anzeigen wollte.Ich hoffe, niemand muss diesen Trick anwenden, aber es war der Weg, den ich fand, um mein Problem zu lösen :)
Hallo Guilherme,
Haben Sie einen Codepen für Ihren Code eingerichtet? Es wäre interessant, Live-Code zu sehen. Danke fürs Teilen!
Das ist ja lustig... Ich habe einen Pen erstellt, nur um Ihnen zu zeigen, was ich sagte, und als ich ihn getestet habe, hat es funktioniert! haha
Also... vergessen Sie es. Wahrscheinlich war es an diesem Tag ein Problem in meinem Code.
Trotzdem danke! :D
Das ist schön zu hören! :)
Toller Artikel, nur eine Frage. Warum `flex-grow` oder `flex-shrink` verwenden, wenn die Summe der Flex-Elemente in einer Zeile 100% "fest" ist und kein weiterer Platz vorhanden ist. Reicht hier nicht `flex-basis` aus?
Es gibt keinen Platz mehr für "Flexibilität", und wir verwenden die @media-Elemente, um das 4-Spalten-Layout an ein 3-Spalten- und später ein 2-Spalten-Layout anzupassen, ohne dabei `flex-grow` oder `flex-shrink` zu verwenden, da wir immer die vollen 100% der Zeilen nutzen.
Hallo Oliver, danke fürs Lesen und Ihre Frage. Ich empfehle Ihnen, das `flex-grow`-Element zu verwenden, um die Breite Ihres Flex-Containers zu bestimmen, da dies Ihnen mehr Flexibilität mit Ihren @media-Abfragen bietet. Haben Sie einen Codepen eingerichtet, auf dem wir ein Beispiel Ihres Codes sehen können?
Ich empfehle auch, sich diese Ressource anzusehen, um mit der Größenanpassung mit Flexbox zu experimentieren: http://the-echoplex.net/flexyboxes/
Oh, wie gerne würde ich für ein Unternehmen arbeiten, das es mir erlaubt zu sagen: „IE bis Version 10 wurde von Microsoft ausgemustert, wir müssen es nicht mehr unterstützen.“ Bei jedem einzelnen Projekt, an dem ich gearbeitet habe, war die Unterstützung von IE 9 und 10 eine zwingende Anforderung.
Vielleicht kann ich Flexbox (mit Umbruch) in etwa 2 Jahren endlich richtig nutzen.
Hallo Ed, das kann besonders bei Unternehmensprojekten zutreffen, bei denen Computer-Upgrades langsamer erfolgen. Viele Organisationen im Unternehmensbereich stellen inzwischen von Desktop-Computern auf Tablets um, damit die Teams mobiler sein können. Viel Glück, und vielleicht hilft Ihnen Flexibility bei der Unterstützung von IE 9 und 10: https://github.com/10up/flexibility
Wenn die Produktinformationen am Ende des Containers platziert werden, gibt es einen Unterschied zwischen Ihrer Methode und der Verwendung von flex-end?
Hallo Dan, es gibt keinen Unterschied, ob Sie meine oben genannte Methode oder flex-end verwenden. Es gibt mehrere Möglichkeiten, dasselbe mit Flexbox zu tun. Danke, dass Sie diesen sehr wichtigen Punkt angesprochen haben!
Ich habe versucht, Flexbox für die Produktanzeige zu verwenden, aber was mir nicht gefallen hat, war, wie es mit der letzten Zeile umging, wenn man nicht weiß, wie viele Produkte angezeigt werden. Wenn Sie ein Raster mit 4 Elementen pro Zeile und insgesamt 10 Elementen haben, hat die letzte Zeile zwei Elemente. Idealerweise haben die letzten beiden Elemente die gleiche Breite wie die Elemente in den darüber liegenden Zeilen, werden aber linksbündig ausgerichtet.
Es gibt keine einfache Möglichkeit, dies mit Flexbox zu tun. Eine Lösung, die ich gefunden habe, ist, die verbleibenden zwei „Plätze“ mit leeren Elementen zu füllen, wenn die Zeile nicht voll ist, aber das fühlt sich umständlich an und erfordert, dass Sie HTML ausgeben, je nachdem, ob die letzte Zeile voll ist oder nicht.
Wir hoffen, dass die Grid CSS Layout-Spezifikation bald finalisiert und von Browsern verwendet wird.
flex-basisFTW!!Ich habe gerade eine Lösung für mein Problem gefunden! http://stackoverflow.com/questions/18744164/flex-box-align-last-row-to-grid/34816625#34816625
Schön!
Ich wusste nicht, dass das funktionieren könnte.
@Derek
Ich habe mir Ihr Codebeispiel angesehen, das Sie auf jsfiddle (über Ihren Stackoverflow-Link) zur Verfügung gestellt haben, und bin auf diese Lösung (basierend auf Ihrem Code) gekommen.
Weit davon entfernt, perfekt zu sein, sicherlich mit der Code-Redundanz, aber alles in reinem Vanilla CSS.
Es gibt immer noch ein paar magische Zahlen
20% und 5n wegen 5 Spalten
20/40/60/80% im margin-right, um die flex-items je nachdem, ob die letzte Zeile 4/3/2 oder nur 1 enthält, in Position zu bringen.
Aber es lässt sich gut skalieren.
Diese Zahlen müssen entsprechend der gewünschten Spaltenanzahl geändert werden (und etwas Code muss hinzugefügt oder entfernt werden, je nach Anzahl der Fälle).
.exposegrid {
display: flex;
flex-flow: row wrap;
justify-content: space-between;
}
.exposetab {
border: 1px solid black; /* zum Sichtbarmachen der Box/
height: 2rem; / zum Sichtbarmachen der Box*/
box-sizing: border-box;
flex: 0 0 20%;
}
.exposetab:last-child:nth-child(5n-1) {
margin-right: 20%;
}
.exposetab:last-child:nth-child(5n-2) {
margin-right: 40%;
}
.exposetab:last-child:nth-child(5n-3) {
margin-right: 60%;
}
.exposetab:last-child:nth-child(5n-4) {
margin-right: 80%;
}
Tolle Diskussion hier!
Der Link, der in einer der Antworten gegeben wurde, verweist auf diesen interessanten folgenden Pen
http://codepen.io/DanAndreasson/pen/ZQXLXj?editors=1100
Der Hauptunterschied, den ich zwischen dem Artikel und dem Pen gefunden habe, waren diese beiden Eigenschaften
Sie spielen nicht gut zusammen, daher müssen Sie sich für das eine oder das andere entscheiden.
Aber gilt dieser Pen noch als Flexbox-Lösung?
Ja, beides sind Flexbox-Lösungen. Jede Methode bietet Ihnen unterschiedliche Möglichkeiten, Flex-Items zu manipulieren, z. B. für Responsive Design, wie ich es in diesem Beitrag getan habe. Ich empfehle die Methode, die Ihrer Meinung nach für Ihr Projekt am besten geeignet ist.
Danke!
Toller Artikel, auf jeden Fall als Lesezeichen gespeichert.
Danke :)
*Tippfehler
„Eine Möglichkeit, die erste zu vergrößern, anstatt die letzten beiden“
s/b
„Eine Möglichkeit, die ersten beiden anstatt der letzten beiden zu vergrößern“
*/Tippfehler
Danke für das Lesen und das Feedback zu den Tippfehlern! :)
Wirklich großartiger Artikel, der reale Layoutanforderungen demonstriert. Besonders gut gefallen haben mir die Tricks mit `:first-child, :nth-child(2)`.
Hier ist eine Angular Material-Version, die unsere ngMaterial UI-Komponenten der Layout-API verwendet: http://codepen.io/team/AngularMaterial/pen/YweVWZ
Oh wow, das ist fantastisch! Danke fürs Teilen!
Bedeutet das, dass Shopify keine Themen mehr im Theme-Store benötigt, die IE9 unterstützen?
Dies war ein schnelles Beispiel, um zu zeigen, wie Layouts mit neuen CSS-Methoden neu erstellt werden können. Themen erfordern weiterhin die Unterstützung für IE 9 :)
Ich persönlich liebe Flexbox, aber ich denke, es ist am besten, sich vorerst davon fernzuhalten. IE 10 & 11 Support ist fehlerhaft (prüfen Sie caniuse zur Bestätigung). Dies wird Ihnen Kopfzerbrechen bereiten, wenn Sie etwas auch nur minimal Fortgeschrittenes versuchen.
Danke für das Feedback Nikk. Es ist immer wichtig, die Zielgruppe zu kennen, wenn man neue Werkzeuge einsetzt. Nochmals vielen Dank.