Gibt es eine Möglichkeit, einen Zeilenumbruch in einer Flexbox mit mehreren Zeilen zu machen?
Zum Beispiel, um nach jedem dritten Element in diesem CodePen zu brechen .
.container {
background: tomato;
display: flex;
flex-flow: row wrap;
align-content: space-between;
justify-content: space-between;
}
.item {
width: 100px;
height: 100px;
background: gold;
border: 1px solid black;
font-size: 30px;
line-height: 100px;
text-align: center;
margin: 10px;
}
.item:nth-child(3n) {
background: silver;
}
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
<div class="item">10</div>
</div>
Mögen
.item:nth-child(3n){
/* line-break: after; */
}
Antworten:
Die einfachste und zuverlässigste Lösung ist das Einsetzen von Flex-Elementen an den richtigen Stellen. Wenn sie breit genug sind (
width: 100%
), erzwingen sie einen Zeilenumbruch.Code-Snippet anzeigen
Aber das ist hässlich und nicht semantisch. Stattdessen könnten wir Pseudoelemente im Flex-Container erzeugen und verwenden
order
, um sie an die richtigen Stellen zu verschieben.Code-Snippet anzeigen
Es gibt jedoch eine Einschränkung: Der Flex-Container kann nur ein
::before
und ein::after
Pseudoelement haben. Das heißt, Sie können nur 2 Zeilenumbrüche erzwingen.Um dies zu lösen, können Sie die Pseudoelemente innerhalb der Flex-Elemente anstatt im Flex-Container generieren. Auf diese Weise sind Sie nicht auf 2 beschränkt. Diese Pseudoelemente sind jedoch keine flexiblen Elemente, sodass sie keine Zeilenumbrüche erzwingen können.
Glücklicherweise hat CSS Display L3 eingeführt
display: contents
(derzeit nur von Firefox 37 unterstützt):So können Sie sich
display: contents
an die Kinder des Flex-Containers wenden und den Inhalt jedes einzelnen in einen zusätzlichen Wrapper einwickeln. Dann sind die flexiblen Elemente diese zusätzlichen Wrapper und die Pseudoelemente der Kinder.Code-Snippet anzeigen
Alternativ kann gemäß Fragmenting Flex - Layout und CSS Fragmentation , ermöglicht Flexbox Brüche unter Verwendung gezwungen
break-before
,break-after
oder ihre CSS 2.1 Aliase:Code-Snippet anzeigen
Erzwungene Zeilenumbrüche in der Flexbox werden noch nicht allgemein unterstützt, funktionieren jedoch unter Firefox.
quelle
break-after
Lösung, bei der nur ein Selektor im Stylesheet geändert werden muss.display: block;
die Klassen.container
::before
und::after
pseudo hinzufügen , damit die Lösung Nummer zwei im IE funktioniert. YMMV!Aus meiner Sicht ist es semantischer,
<hr>
Elemente als Zeilenumbrüche zwischen flexiblen Elementen zu verwenden.Getestet in Chrome 66, Firefox 60 und Safari 11.
quelle
gap: 10px;
der Abstand zwischen den Zeilen tatsächlich20px
. Geben Sie zur Adressierung eine Zeilenlücke an, die halb so groß ist :gap: 5px 10px;
.border
sollte eingestellt werdennone
, anstatt0
border:0;
ist genauso gültig wieborder:none;
. Siehe: stackoverflow.com/questions/2922909/…@Oriol hat eine ausgezeichnete Antwort, leider seit Oktober 2017, weder
display:contents
, nochpage-break-after
wird weithin unterstützt, besser gesagt, es geht um Firefox, das dies unterstützt, aber nicht um die anderen Spieler. Ich habe mir den folgenden "Hack" ausgedacht, den ich für besser als hart halte Codierung in einer Pause nach jedem 3. Element, da dies es sehr schwierig macht, die Seite mobilfreundlich zu gestalten.Wie gesagt, es ist ein Hack und der Nachteil ist, dass Sie eine Menge zusätzlicher Elemente für nichts hinzufügen müssen, aber es macht den Trick und funktioniert browserübergreifend sogar auf dem datierten IE11.
Der "Hack" besteht darin, einfach nach jedem Div ein zusätzliches Element hinzuzufügen, das auf gesetzt ist,
display:none
und dann mithilfe des CSSnth-child
zu entscheiden, welches davon tatsächlich sichtbar gemacht werden soll, um eine Linienbremse wie diese zu erzwingen:quelle
.container>p
. Dann würden all diese<p></p>
Tags dasclass
Attribut nicht benötigen . Natürlich nicht wichtig . Nur mein fauler Kopf findet eine winzige, platzsparende Optimierung Ihrer cleveren Lösung. Natürlich hängt es auch davon ab, dass der Benutzer keine anderen<p>
Tags als direkte.container
untergeordnete Elemente des div hat. Technisch gesehen könnten Sie das Gleiche mit allen anderen<div>
Kindern tun , aber es ist viel wahrscheinlicher, dass Sie andere<div>
in der Schule haben.container
als Sie<p>
, also wahrscheinlich kein kluger Schachzug.Sie möchten einen semantischen Zeilenumbruch?
Dann erwägen Sie die Verwendung
<br>
. W3Schools schlägt Ihnen möglicherweise vor,BR
nur Gedichte zu schreiben (meins kommt bald), aber Sie können den Stil so ändern, dass er sich wie ein Blockelement mit 100% Breite verhält, das Ihren Inhalt in die nächste Zeile bringt. Wenn 'br' eine Pause vorschlägt, erscheint es mir angemessener als die Verwendung vonhr
oder 100%div
und macht das HTML lesbarer.Fügen Sie die Stelle ein,
<br>
an der Sie Zeilenumbrüche benötigen, und gestalten Sie sie so.Sie können Medienabfragen deaktivieren
<br>
, indem Sie siedisplay:
aufblock
odernone
nach Bedarf einstellen (ich habe ein Beispiel dafür beigefügt, es jedoch auskommentiert).Bei Bedarf können Sie auch
order:
die Reihenfolge festlegen.Und du kannst so viele setzen, wie du willst, mit verschiedenen Klassen oder Namen :-)
Sie müssen sich nicht auf das beschränken, was W3Schools sagt:
quelle
<br class="2col">
nach jedem zweiten Gegenstand<br class="3col">
nach jedem dritten zu setzen.cols-2
Wenden Sie dann eine Klasse auf den Container an und erstellen Sie CSS, um nur die entsprechenden Zeilenumbrüche für diese Anzahl von Spalten zu aktivieren. z.B.br { display: none; } .cols-2 br.2col { display: block; }
br
nicht für Zeilenumbrüche Elemente , ist es für Text : developer.mozilla.org/en-US/docs/Web/HTML/Element/br ... stackoverflow.com/questions/3937515/...break-*
in der akzeptierten Antwort gezeigt), obwohl sie leider noch keine Cross-Browser erreicht hat Das zweitbeste ist also, ein Element zu verwenden, das die Breite seiner Eltern nativ ausfüllt und alle nächsten Geschwister in eine Reihe von sich selbst schiebt, was wiederum in der akzeptierten Antwort angegeben ist. Wenn Sie also ein anderes Element als einen Block wie einen verwenden, wäre dies semantisch schlechter als derbr
.Ich denke, der traditionelle Weg ist flexibel und ziemlich leicht zu verstehen:
Markup
Erstellen Sie die Datei grid.css :
Ich habe ein Beispiel erstellt (jsfiddle)
Versuchen Sie, die Größe des Fensters unter 400px zu ändern, es reagiert!
quelle
Eine andere mögliche Lösung, bei der kein zusätzliches Markup hinzugefügt werden muss, besteht darin, einen dynamischen Rand hinzuzufügen, um die Elemente zu trennen.
Im Fall des Beispiels kann dies mit Hilfe des einfachen
calc()
Hinzufügensmargin-left
undmargin-right
zum 3n + 2-Element (2, 5, 8) erfolgen.Snippet-Beispiel
quelle
calc
wie in dieser Antwort beschrieben.margin-right: 1px
der Artikel, und der nächste Artikel beginnt in einer neuen Zeile.Bei zukünftigen Fragen ist es auch möglich, die
float
Eigenschaft zu verwenden und sie in jeweils drei Elementen zu löschen.Hier ist ein Beispiel, das ich gemacht habe.
quelle
display: flex;
nichtdisplay: inline-block;
.cell:nth-child(3n + 1)
stattdessenIch habe hier mehrere Antworten ausprobiert, und keine davon hat funktioniert. Ironischerweise ging es bei der Arbeit um die einfachste Alternative zu einem
<br/>
Versuch:<div style="flex-basis: 100%;"></div>
oder Sie könnten auch tun:
<div style="width: 100%;"></div>
Platzieren Sie das, wo immer Sie eine neue Linie wollen. Es scheint sogar mit Nachbarn zu funktionieren
<span>
, aber ich benutze es mit Nachbarn<div>
.quelle
flex-basis
.Sie können versuchen, die Elemente wie hier in ein dom-Element zu verpacken. mit diesem müssen Sie nicht viel CSS wissen, nur eine gute Struktur wird das Problem lösen.
quelle
display: block
und diese neuen Tier-2-Divs-Flexboxen erstellen. Dies funktioniert für Zeilen. Ersetzen Sie die Divs durch Spans, wenn Sie den Spaltenmodus verwenden.