Ich verwende eine Flexbox, um 8 Elemente anzuzeigen, deren Größe sich dynamisch mit meiner Seite ändert. Wie erzwinge ich, dass die Elemente in zwei Zeilen aufgeteilt werden? (4 pro Reihe)?
Hier ist ein relevanter Ausschnitt:
(Oder wenn Sie jsfiddle bevorzugen - http://jsfiddle.net/vivmaha/oq6prk1p/2/ )
.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;
}
<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>
Antworten:
Du bist
flex-wrap: wrap
auf dem Container. Das ist gut, weil es den Standardwertnowrap
( Quelle ) überschreibt . Dies ist der Grund, warum Elemente in einigen Fällen nicht zu einem Raster umgebrochen werden .In diesem Fall liegt das Hauptproblem
flex-grow: 1
bei den flexiblen Elementen.Die
flex-grow
Eigenschaft hat keine Größe für Flex-Elemente. Seine Aufgabe ist es, freien Speicherplatz im Container ( Quelle ) zu verteilen . Unabhängig von der Größe des Bildschirms erhält jedes Element einen proportionalen Teil des freien Speicherplatzes in der Zeile.Insbesondere enthält Ihr Container acht Flex-Artikel. Mit
flex-grow: 1
erhält jeder 1/8 des freien Speicherplatzes auf der Leitung. Da Ihre Artikel keinen Inhalt enthalten, können sie auf die Breite Null schrumpfen und werden niemals verpackt.Die Lösung besteht darin, eine Breite für die Elemente zu definieren. Versuche dies:
Bei der
flex-grow: 1
Definition in derflex
Kurzform müssen keineflex-basis
25% angegeben werden, was aufgrund der Ränder tatsächlich zu drei Elementen pro Zeile führen würde.Da
flex-grow
der freie Speicherplatz in der Zeile belegt wird,flex-basis
muss er nur groß genug sein, um einen Wrap zu erzwingen. In diesem Fallflex-basis: 21%
gibt es mit viel Platz für die Ränder, aber nie genug Platz für ein fünftes Element.quelle
flex: 1 0 calc(25% - 10px);
margin: 2%;
anstelle einer festen Pixelanzahl, um zu verhindern, dass die Boxen bei kleinen Geräten / Auflösungen zu einer neuen Zeile springen. Die allgemeine Formel lautet(100 - (4 * box-width-percent)) / 8
% für verschiedene KastenbreitenFügen Sie den
.child
Elementen eine Breite hinzu . Ich persönlich würde Prozentsätze für die verwenden,margin-left
wenn Sie es immer 4 pro Zeile haben möchten.DEMO
quelle
Hier ist ein weiterer Ansatz.
Sie können dies auch auf folgende Weise erreichen:
Beispiel: https://codepen.io/capynet/pen/WOPBBm
Und ein vollständigeres Beispiel: https://codepen.io/capynet/pen/JyYaba
quelle
Ich würde es so machen, indem ich negative Ränder benutze und für die Dachrinnen kalkuliere:
Demo: https://jsfiddle.net/9j2rvom4/
Alternative CSS-Grid-Methode:
Demo: https://jsfiddle.net/jc2utfs3/
quelle
Ich hoffe es hilft. Für weitere Informationen können Sie diesem Link folgen
quelle
Ich glaube, dieses Beispiel ist mehr Barebones und leichter zu verstehen als @dowomenfart.
Dies führt die gleichen Breitenberechnungen durch, während direkt zum Fleisch geschnitten wird. Die Mathematik ist viel einfacher und aufgrund ihrer Skalierbarkeit und Benutzerfreundlichkeit
em
der neue Standard .quelle
;)
quelle
justify-content: space-evenly;
dem Prent etwas hinzufügen , sind sie gut ausgerichtet und Sie müssen das nichtcalc
für das Kind tun . Vielen Dank für das Beispiel!Flex Wrap + negativer Rand
Warum flex vs.
display: inline-block
?Warum negative Marge?
Entweder verwenden Sie SCSS oder CSS-in-JS für die Randfälle (dh das erste Element in der Spalte), oder Sie legen einen Standardrand fest und entfernen den äußeren Rand später.
Implementierung
https://codepen.io/zurfyx/pen/BaBWpja
quelle
Hier ist ein anderer Weg ohne zu verwenden
calc()
.Das ist alles dazu. Sie können sich mit den Abmessungen ein Bild machen, um ästhetischere Größen zu erhalten, aber das ist die Idee.
quelle