Fügen Sie eine Trennlinie zwischen Flex-Elementen mit gleichmäßiger Raumverteilung hinzu

Lesezeit: 10 Minuten

Benutzer-Avatar
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.

Das habe ich:

Das habe ich

Das versuche ich zu erreichen

Hier ist, was ich erreichen möchte

Hier ist der Code, den ich derzeit habe

html {
    box-sizing: border-box;
}

.Container {
    max-width: 70%;
    margin-right: auto;
    margin-left: auto;
    background: blue;
    padding-top: 20px;
    padding-bottom: 20px;
}

.Flex {
    display: flex;
    flex-flow: row wrap;
    justify-content: space-between;
    list-style: none;
    margin: 0;
    padding: 0;
}

.Flex-item {
    background: red;
    position: relative;
}

.Flex-item:after {
    content: "";
    position: absolute;
    background: white;
    width: 1px;
    height: 40px;
    top: 50%;
    transform: translateY(-50%);
}
<div class="Container">
    <ul class="Flex">
         <li class="Flex-item">Lorem</li>
         <li class="Flex-item">consectetur</li>
         <li class="Flex-item">vestibulum</li>
         <li class="Flex-item">nec</li>
         <li class="Flex-item">condimentum</li>
    </ul>
</div>

Benutzer-Avatar
Stefan Lindberg

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.

html {
    box-sizing: border-box;
}

.Container {
    max-width: 70%;
    margin-right: auto;
    margin-left: auto;
    background: blue;
    padding-top: 20px;
    padding-bottom: 20px;
}

.Flex {
    display: flex;
    flex-flow: row wrap;
    justify-content: space-between;
    list-style: none;
    margin: 0;
    padding: 0;
}

.Flex-item {
    flex: 1 1 auto;
    background: red;
    position: relative;
    text-align: center;
    line-height: 40px;
}

.Flex-item + .Flex-item {
    border-left: solid 1px white;
}

/** Optional for OPs exact layout */

.Flex-item:first-child {
    text-align: left;
}

.Flex-item:last-child {
    text-align: right;
}
<div class="Container">
    <ul class="Flex">
        <li class="Flex-item">Lorem</li>
        <li class="Flex-item">consectetur</li>
        <li class="Flex-item">vestibulum</li>
        <li class="Flex-item">nec</li>
        <li class="Flex-item">condimentum</li>
    </ul>
</div>

Keine Änderung an HTML.

  • 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


Benutzer-Avatar
kukuz

Du kannst Bring es zum Laufen durch Verwendung von a verschachtelt flexboxes – 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:

  1. 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

  2. Sich bewerben flex-grow und flex-shrink zu 1 und flex-basis zu auto für die Flex-item.

  3. 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:

html {
  box-sizing: border-box;
}
.Container {
  max-width: 70%;
  margin-right: auto;
  margin-left: auto;
  background: blue;
  padding-top: 20px;
  padding-bottom: 20px;
}
.Flex {
  display: flex;
  justify-content: space-between;
  list-style: none;
  margin: 0;
  padding: 0;
}
.Flex-item {
  display: flex;
  justify-content: space-between;
  align-items: center;
  flex: 1 1 auto;
}
.Flex-item span {
  background: red;
}
.Flex-item:not(:last-child):after {
  content: "";
  border: 1px solid white;
  height: 40px;
  margin: auto;
}
.Flex-item:last-child {
  flex: 0;
}
<div class="Container">
  <ul class="Flex">
    <li class="Flex-item">
      <span>Lorem</span>
    </li>
    <li class="Flex-item">
      <span>consectetur</span>
    </li>
    <li class="Flex-item">
      <span>vestibulum</span>
    </li>
    <li class="Flex-item">
      <span>nec</span>
    </li>
    <li class="Flex-item">
      <span>condimentum</span>
    </li>
  </ul>
</div>

  • Diese Antwort ist möglicherweise nicht gültig, da sie den Aufschlag ändert, was keine Option ist, wie in der Frage angegeben.

    – Michael Benjamin

    13. Januar 2017 um 15:12 Uhr

Benutzer-Avatar
Roko C. Buljan

Anstatt von :after Verwenden Sie stilistische, ARIA-repräsentative LIs

<li class="separator" aria-hidden="true" role="presentation"></li>

wie:

.Container {
  max-width: 70%;
  margin: 0 auto;
  background: blue;
}

.Flex {
  display: flex;
  justify-content: space-between;
  list-style: none; padding: 20px 0; margin:0;
}

.Flex-item {
  background: red;
}

.separator {
  background: white; width: 1px;
}
<div class="Container">
  <ul class="Flex">
    <li class="Flex-item">Lorem</li>
    <li class="separator" aria-hidden="true" role="presentation"></li>
    <li class="Flex-item">consectetur</li>
    <li class="separator" aria-hidden="true" role="presentation"></li>
    <li class="Flex-item">vestibulum</li>
    <li class="separator" aria-hidden="true" role="presentation"></li>
    <li class="Flex-item">nec</li>
    <li class="separator" aria-hidden="true" role="presentation"></li>
    <li class="Flex-item">condimentum</li>
  </ul>
</div>

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

Benutzer-Avatar
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.

.Flex {
  display: flex;
  list-style: none;
  margin: 0;
  padding: 0;
}
.Flex-item {
  flex: 1 1 auto;
  background: red;
}
.Flex-item {
  text-align: center;
}
.Flex-item:first-child {
  text-align: left;
}
.Flex-item:last-child {
  text-align: right;
}
.Flex-item + .Flex-item {
  border-left: 1px solid white;
}
.Container {
  max-width: 70%;
  margin-right: auto;
  margin-left: auto;
  background: blue;
  padding-top: 20px;
  padding-bottom: 20px;
}
<div class="Container">
  <ul class="Flex">
    <li class="Flex-item">Lorem</li>
    <li class="Flex-item">consectetur</li>
    <li class="Flex-item">vestibulum</li>
    <li class="Flex-item">nec</li>
    <li class="Flex-item">condimentum</li>
  </ul>
</div>

Wenn Sie ein hinzufügen können span um den Text, wodurch Sie den roten Hintergrund auf die Länge des Textes beschränken können, dann sind Sie fertig:

.Flex {
  display: flex;
  list-style: none;
  margin: 0;
  padding: 0;
}
.Flex-item {
  flex: 1 1 auto;
  display: inline-flex;
  justify-content: center;
}
.Flex-item span {
    background-color: red;
}
.Flex-item:first-child span {
  margin-right: auto;
}
.Flex-item:last-child span {
  margin-left: auto;
}
.Flex-item + .Flex-item {
  border-left: 1px solid white;
}
.Container {
  max-width: 70%;
  margin-right: auto;
  margin-left: auto;
  background: blue;
  padding-top: 20px;
  padding-bottom: 20px;
}
<div class="Container">
  <ul class="Flex">
    <li class="Flex-item"><span>Lorem</span></li>
    <li class="Flex-item"><span>consectetur</span></li>
    <li class="Flex-item"><span>vestibulum</span></li>
    <li class="Flex-item"><span>nec</span></li>
    <li class="Flex-item"><span>condimentum</span></li>
  </ul>
</div>

Benutzer-Avatar
G-Cyrillus

wenn Sie imbrizieren flexvielleicht bekommst du was nah dran zu dem, was Sie versuchen, ohne zusätzliches Markup zu tun.

Es handelt sich um Pseudos, order & css3-Selektoren (fein beiseite flex).

http://codepen.io/gc-nomade/pen/BpzYWP

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;
}
<div class="Container">
    <ul class="Flex">
         <li class="Flex-item">Lorem</li>
         <li class="Flex-item">consectetur</li>
         <li class="Flex-item">vestibulum</li>
         <li class="Flex-item">nec</li>
         <li class="Flex-item">condimentum</li>      
    </ul>
</div>

Benutzer-Avatar
vedankita kumbhar

Versuche dies

html {
    box-sizing: border-box;
}

.Container {
    max-width: 90%;
    margin-right: auto;
    margin-left: auto;
    background: blue;
    padding-top: 11px;
    padding-bottom: 50px;
}

.Flex {
    list-style: none;
    margin: 0;
    padding: 0;
    position: relative;
    left: 50%;
    transform: translateX(-50%);
    float: left;
}

.Flex-item {
    position: relative;
    float: left;
    padding: 5px 10px;
    border-right:1px solid #fff;
}
.Flex-item:last-child{border-right:none;}

.Flex-item >div{
  margin:0 5px;
  background:red;
  padding:5px;
}
<div class="Container">
    <ul class="Flex">
         <li class="Flex-item"><div>
         Lorem
         </div></li>
         <li class="Flex-item"><div>
         consectetur
         </div></li>
         <li class="Flex-item"><div>
         vestibulum
         </div></li>
         <li class="Flex-item"><div>
         nec
         </div></li>
         <li class="Flex-item"><div>
         condimentum
         </div></li>
    </ul>
</div>

1144650cookie-checkFügen Sie eine Trennlinie zwischen Flex-Elementen mit gleichmäßiger Raumverteilung hinzu

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy