Fügen Sie eine Trennlinie zwischen Flex-Elementen mit gleichmäßiger Raumverteilung hinzu
Lesezeit: 10 Minuten
Nikolaus
Ich habe eine Liste mit verschiedenen Artikeln, die automatische Breiten haben (in meinem Fall kann keine feste Breite angegeben werden). ich benutze justify-content: space-between weil mein erster Artikel am Anfang des Containers beginnen muss und mein letzter Artikel am Ende.
All dies funktioniert einwandfrei, aber immer wenn ich versuche, eine Zeile zwischen diesen Listenelementen hinzuzufügen, treten die Probleme auf. Ich habe keine Möglichkeit zu bestimmen, wie viele Pixel oder % ich diese Zeilen positionieren muss. Gibt es eine Möglichkeit, die Zeilen zwischen den verschiedenen Listenelementen “dynamisch” zu positionieren oder nicht?
Das von uns verwendete HTML kann nicht bearbeitet werden, da es von dem von uns verwendeten CMS gerendert wird.
Ich verwende diese Lösung für ein Projekt, an dem ich arbeite.
Es setzt justify-content: space-between; auf dem Flexbehälter und flex: 1 1 auto; bei den Kindern mit einem linken Rand bei allen Kindern außer dem ersten.
Ich habe Ihr Beispiel-CSS geändert, damit Sie es sich ansehen können. Ich war mir nicht sicher, ob Sie Hintergrundfarbe für die Kinder haben würden, also habe ich einfach die Zeilenhöhe verwendet, um größere Ränder zu erhalten.
Ein Unterschied, den ich zwischen diesem und dem gewünschten Layout des OP sehe, besteht darin, dass das erste und das letzte Element nicht bündig mit dem linken und rechten Rand sind.
– Showdev
19. Juni 2019 um 4:12 Uhr
Sicher. Ich kann mich nicht erinnern, ob ich mir dessen bewusst war, als ich den Ausschnitt gemacht habe, aber es kann durch Hinzufügen behoben werden Flex-item:first-child { text-align: left; }Flex-item:last-child { text-align: right; } wenn du es brauchst. Ich habe auch die ursprüngliche Lösung bearbeitet.
– Stefan Lindberg
19. Juni 2019 um 7:14 Uhr
Erstes und letztes Element haben jetzt einen größeren Abstand als die anderen Elemente. Kann man das konsistent machen?
– Allan Raquin
31. Oktober 2019 um 16:54 Uhr
Was bringt es, Flex-Item zweimal hinzuzufügen, wie z .Flex-item + .Flex-item ?
– SQ
21. Juli 2021 um 15:35 Uhr
Es ist der CSS-Selektor für benachbarte Geschwister. Also das Element mit der Klasse Flex-item neben einem Element mit Klasse Flex-item bekommt einen Rand nach links. In diesem Fall wird das erste Element mit einem linken Rand “übersprungen”. Damit Sie nicht schreiben müssen .Flex-item:first-child { border-left: 0; }developer.mozilla.org/en-US/docs/Web/CSS/…
– Stefan Lindberg
21. Juli 2021 um 19:40 Uhr
kukuz
Du kannst Bring es zum Laufen durch Verwendung von a verschachteltflexboxes – Ich verstehe, dass Sie das Markup nicht ändern können, aber Sie müssen zumindest den Inhalt von umschließen li in ein span wie ich hier habe:
Machen .flex-item auch eine flexbox mit dem Text in a span (das hätte jetzt den roten Hintergrund) und die Separator als ein :after Element
Sich bewerben flex-grow und flex-shrink zu 1 und flex-basis zu auto für die Flex-item.
Das flex: 0 bis zum letzten Flex-item und margin-auto zum :after trägt ebenfalls zur Wirkung bei.
Eine Demo kann es vielleicht besser erklären – siehe unten:
PS: Ja, ich habe es versucht display: list-item zunächst auf der :after Pseudo aber nein.
Hey Mann, danke für die Antwort. Leider können wir den HTML-Code nicht ändern, da der HTML-Code von unserem CMS gerendert wird :/. Das Hinzufügen eines Trennzeichens ist also keine Option
– Nikolaus
13. Januar 2017 um 9:50 Uhr
Außerdem wird für Hilfstechnologien jetzt eine Liste mit 10 Elementen angezeigt.
– Jason T. Featheringham
15. April 2017 um 21:00 Uhr
Michael Benjamin
Ich denke, die einzige Möglichkeit, dies mit Flexbox zu erreichen, besteht darin, den Text in ein neues Element einzufügen, wie es @Kukkuz in einer anderen Antwort getan hat.
Ohne diesen zusätzlichen Wrapper können Sie immer noch Trennzeichen mit gleichem Abstand erhalten, aber der rote Hintergrund ist nicht auf die Länge des Textes beschränkt.
Unten ist ein Beispiel mit:
Keine Änderungen am HTML.
Keine Notwendigkeit für Pseudoelemente.
Keine absolute Positionierung erforderlich.
Wenn eine Hintergrundfarbe für den Text nicht erforderlich ist, entfernen Sie sie und das sollte alles sein, was Sie brauchen.
body {
margin:0;
}
.Flex, .Flex-item {
display:flex;
padding:0.5em 0;
margin:0;
}
.Flex-item {
flex:1;/*spray them evenly*/
}
.Flex-item:before,
.Flex-item:after {/* add pseudos to fill extra space */
content:'';
flex:1;/* thats where it takes room not use by the text */
margin:-1em 0;/* grow them taller */
border-right:solid 1px white;
}
.Flex-item:first-child:before
{
order:2;/* put both pseudo after text*/
flex:.5;/* shrink that one can be .75 to .25 */
border:none; /* remove the border useless for the show */
}
.Flex-item:last-child:after {
order:-1;/* put both pseudos before text */
flex:0.5;/* shrink that one can be .75 to .25 */
}
.Flex-item:first-child + .Flex-item:before ,
.Flex-item:nth-last-child(1):after{
border:none; /* remove the border useless for the show */
}
body, :after, :before {
background:tomato;/* pseudo will hide li background */
}
li {
background:turquoise;
}
/* give some space around the text */
.Flex-item:first-child {
padding-left:1em;
}
.Flex-item:last-child {
padding-right:1em;
}
.Flex-item:before {
border:none;/* we do not need those after all */
margin-right:1em;
}
.Flex-item:after {
margin-left:1em;
}
.Flex-item:first-child:before {
margin:-1em 0;
}.Flex-item:last-child:after {
margin:-1em 0;
}