Flexbox: 4 Artikel pro Zeile
Ich bin mit einem flex-Feld zur Anzeige von 8 Gegenständen, die Größe dynamisch mit meiner Seite. Wie kann ich erzwingen, dass es zur Aufteilung der Elemente in zwei Zeilen? (4 pro Reihe)?
Ist hier ein relevanter Ausschnitt:
(Oder wenn Sie es bevorzugen jsfiddle - http://jsfiddle.net/vivmaha/oq6prk1p/2/)
CSS:
.parent-wrapper {
height: 100%;
width: 100%;
border: 1px solid black;
}
.parent {
display: flex;
font-size: 0;
flex-wrap: wrap;
margin: -10px 0 0 -10px;
}
.child {
display: inline-block;
background: blue;
margin: 10px 0 0 10px;
flex-grow: 1;
height: 100px;
}
HTML:
<body>
<div class="parent-wrapper">
<div class="parent">
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
</div>
</div>
</body>
- [Update] Diese Frage wurde, basierend auf einer schlechten reagiert design. Wenn Sie sich über eine der nachfolgenden Antworten, seien Sie vorsichtig. In einem guten design, Sie haben mehr Gegenstände, größere Bildschirme und weniger auf kleinere Bildschirme. Zwingt die 4 Elemente für alle Bildschirm-Größen wird nur Ansprechend aus auf einer schmalen Bandbreite von Rasterweiten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du hast
flex-wrap: wrap
auf dem Behälter. Das ist gut, denn es überschreibt den Standardwert, dienowrap
(Quelle). Dies ist der Grund Elemente nicht umbrechen, um ein Gitternetz in einige Fälle.In diesem Fall, das Hauptproblem ist
flex-grow: 1
auf der flex-Elemente.Den
flex-grow
Eigenschaft nicht eigentlich Größe flex-Elemente. Seine Aufgabe ist das verteilen von gratis-Speicherplatz im container (Quelle). Also, egal wie klein der Bildschirm-Größe, wird jedes Element erhalten Sie einen proportionalen Teil des freien Speicherplatzes auf der Linie.Konkret gibt es acht flex-Elementen in Ihrem container. Mit
flex-grow: 1
, jeder erhält 1/8 des freien Speicherplatzes auf der Linie. Da es keine Inhalte in Ihrem Elemente, Sie können schrumpfen auf null Breite und wickeln.Die Lösung ist die Definition einer Breite, die auf die Elemente. Versuchen Sie dies:
CSS:
HTML:
Mit
flex-grow: 1
definiert in derflex
Kurzform, es gibt keine Notwendigkeit fürflex-basis
zu 25%, das würde tatsächlich dazu führen, die drei Elemente pro Zeile aufgrund der Ränder.Seit
flex-grow
verbrauchen Speicherplatz auf der Zeileflex-basis
muss nur groß genug sein, um durchzusetzen, ein wrap. In diesem Fall, mitflex-basis: 21%
, es gibt viel Platz für die Ränder, aber nie genug Platz für eine fünfte Element.flex: 1 0 calc(25% - 10px);
flex-basis
. Dies war das gestern Umsetzung in den meisten grid-Bibliotheken.margin: 2%;
anstelle einer festen pixel-Anzahl, um zu verhindern, dass die Boxen aus und springt in eine neue Zeile auf kleinen Geräten/Auflösungen. die Allgemeine Formel ist(100 - (4 * box-width-percent)) / 8
% für verschiedene breiten FeldGeben Sie eine Breite für die
.child
Elemente. Ich persönlich würde Prozentsätze auf diemargin-left
wenn Sie möchten haben es immer 4 pro Zeile.DEMO
Hier ist ein weiterer apporach.
Können Sie erreichen es auf diese Weise zu:
Beispiel:
https://codepen.io/capynet/pen/WOPBBm
Und eine komplette Beispiel:
https://codepen.io/capynet/pen/JyYaba
Hoffe, es hilft. für weitere Details können Sie dieses link
Ich würde es so machen mit negativen Margen und calc für die Dachrinnen:
Demo: https://jsfiddle.net/9j2rvom4/
Alternative CSS-Grid-Methode:
Demo: https://jsfiddle.net/jc2utfs3/
CSS:
HTML:
😉
justify-content: space-evenly;
dem prent, dann werden Sie schön ausrichten und Sie nicht zu tun haben, diecalc
auf das Kind. Vielen Dank für das Beispiel, aber!Ich glaube, dieses Beispiel ist mehr barebones und einfacher zu verstehen dann @dowomenfart.
Dieser führt die gleiche Breite Berechnungen beim schneiden direkt auf das Fleisch. Die Mathematik ist einfacher und
em
ist die der neue standard aufgrund seiner Skalierbarkeit und mobile-Freundlichkeit.Flex-wrap + negative Marge
Warum flex vs.
display: inline-block
?Warum negative Marge?
Entweder verwenden Sie die SCSS-oder CSS-in-JS für die Grenzfälle (d.h. erste element in der Spalte), oder Sie legen eine Standard-Marge und loszuwerden der äußere Rand höher.
Umsetzung
https://codepen.io/zurfyx/pen/BaBWpja
Hier ist ein weiterer Weg, ohne mit
calc()
.Das ist alles dort ist zu ihm. Sie bekommen Lust mit den Dimensionen zu bekommen, eine ästhetische Größen, aber das ist die Idee.