Dimensionierung von flexiblen Artikeln in der letzten Reihe

Lesezeit: 7 Minuten

Baros Benutzeravatar
Baro

Mein Problem ist, dass ich die Flexbox mit variabler Bereichsbreite haben möchte, und alles funktioniert gut, aber nicht in der letzten Reihe. Ich möchte die gleiche Dimension für alle Kinder, auch wenn die Reihe nicht voll von Kindern ist (die letzte Reihe).

#products-list {
    position:relative;
    display: flex;
    flex-flow: row wrap;
    width:100%;
}

#products-list .product {
    min-width:150px;
    max-width:250px;
    margin:10px 10px 20px 10px;
    flex:1;
}

ich erschuf eine dynamische Situation in jsFiddle

Meine Flex-Divs können bis 150px schrumpfen und bis 250px wachsen, aber alle müssen die gleiche Größe haben (und natürlich will ich eine CSS-Lösung, mit JS kenne ich mich aus).

Benutzeravatar von Michael Benjamin
Michael Benjamin

Leider gibt es in der aktuellen Iteration von Flexbox (Level 1) keine saubere Möglichkeit, das Ausrichtungsproblem der letzten Zeile zu lösen. Es ist ein allgemeines Problem.

Es wäre nützlich, eine Flex-Eigenschaft wie folgt zu haben:

  • last-row
  • last-column
  • only-child-in-a-row
  • alone-in-a-column

Dieses Problem scheint für Flexbox Level 2 eine hohe Priorität zu haben:

Obwohl dieses Verhalten in Flexbox schwer zu erreichen ist, ist es einfach und leicht in CSS-Grid-Layout:

  • Flexartikel mit gleicher Breite auch nach dem Wickeln

Falls Grid keine Option ist, finden Sie hier eine Liste ähnlicher Fragen mit verschiedenen Flexbox-Hacks:

  • Korrekte Dimensionierung und Ausrichtung der Flex-Elemente in der letzten Reihe
  • Flexbox: Letzte Reihe am Raster ausrichten
  • Flexbox Wrap – andere Ausrichtung für die letzte Reihe
  • Wie kann ein flexibles Element die gleichen Abmessungen behalten, wenn es in eine neue Reihe gezwungen wird?
  • Selektor für ein Element allein in einer Reihe?
  • Ausrichten von Elementen in der letzten Flexbox-Reihe
  • Wie kann ich zulassen, dass Flex-Elemente wachsen, während sie dieselbe Größe behalten?
  • Richten Sie die letzte Zeile der Flexbox mit Abstand zwischen und Rändern linksbündig aus
  • Inkonsistenter Rand zwischen Flex-Elementen in der letzten Reihe
  • Wie hält man umwickelte Flex-Elemente auf der gleichen Breite wie die Elemente in der vorherigen Reihe?
  • So richten Sie die linke letzte Zeile/Zeile in einer mehrzeiligen Flexbox aus
  • Die letzten Kinder des Grids bekommen eine riesige Rinne, weil zwischen den Flexboxen Platz ist
  • Verwalten von justify-content: space-between in der letzten Zeile
  • Flexbox-Abstand zwischen Verhalten kombiniert mit Umbruch
  • Ist es möglich, CSS Flexbox zu verwenden, um Elemente in jeder Zeile zu dehnen und dabei konsistente Breiten beizubehalten?
  • Verhindern Sie, dass sich der letzte Artikel ausdehnt, um den Behälter zu füllen

  • Diese Antwort hat das gleiche Problem wie Bücher heutzutage: zu viele Informationen => niemand liest sie. Wäre schön gewesen, ein TL; DR zu haben; Abschnitt (schnelle Lösung).

    – tao

    28. April 2017 um 10:05 Uhr

  • @AndreiGheorghiu, ich kenne keine schnelle Lösung für dieses Problem. Tatsächlich ist das Problem selbst unterschiedlicher Natur. Wenn Sie eine universelle Lösung haben, sollten Sie eine Antwort posten.

    – Michael Benjamin

    28. April 2017 um 12:09 Uhr


  • Auch für jemanden, der diese Antwort nur zu Bildungszwecken liest, denke ich, dass Sie Recht haben. Nur wenige, wenn überhaupt, werden die gesamte Linkliste durchgehen.

    – Michael Benjamin

    28. April 2017 um 12:10 Uhr

  • Aber für jemanden, der diese Seite besucht, der braucht dringend eine Lösung, würde ich argumentieren, dass sie jeden einzelnen Link durchgehen werden, in der Hoffnung, eine Methode zu finden, die funktioniert. Basierend auf den Upvotes zu dieser Antwort und Dieses hier Und Dieses hier (siehe “Randbemerkung” unten), würde ich sagen, dass zumindest einige Leute die Referenzen nützlich finden.

    – Michael Benjamin

    28. April 2017 um 12:11 Uhr


  • @Michael_B, ich hatte nicht die Geduld, alle Links durchzugehen und zu prüfen, ob jemand einen js-Fix dafür gefunden hat, also habe ich meinen eigenen gemacht, für den Sonderfall, wenn es kein bestimmtes Raster (oder bekannte Kindbreite) gibt. . Nur Kinder mit variabler Breite, die letzte Zeile sollte linksbündig ausgerichtet sein, während die vorherigen Zeilen gestreckt werden sollten, um die volle Größe auszufüllen.

    – tao

    28. Juni 2017 um 14:59 Uhr


Benutzeravatar von Boris D. Teoharov
Boris D. Teoharov

Als schnelle und schmutzige Lösung kann man verwenden:

.my-flex-child:last-child/*.product:last-child*/ {
  flex-grow: 100;/*Or any number big enough*/
}

  • Sollte das nicht sein flex-grow: 0? OP will „dasselbe Maß für alle Kinder, auch wenn die Reihe nicht voller Kinder ist“. flex-grow: 100 würde möglicherweise dazu führen, dass das Element die Breite seines übergeordneten Elements ausfüllt.

    – fullStackChris

    22. April 2020 um 10:40 Uhr

  • Selbst wenn flex-grow: 0 ist, würde dies immer noch dazu führen, dass das vorletzte Element wächst, um diese Breite anzunehmen.

    – Matt Eland

    8. Juli 2020 um 21:33 Uhr

Sie könnten hier versuchen, Grid anstelle von Flexbox zu verwenden:

#products-list {

  display: grid;
  grid-gap: 5px;
  grid-template-columns: repeat(auto-fit, minmax(100px, 250px)); //grid automagic
  justify-content: start; //start left

}

Fiddle-Link

Davids Benutzeravatar
David

Wenn alle Ihre Zeilen die gleiche Anzahl von Elementen haben, können Sie verwenden :nth-last-child. Wenn beispielsweise alle Zeilen 3 Elemente enthalten, können Sie so etwas tun, um den Rand der letzten 3 Elemente zu entfernen:

.container{
  display: flex;
  flex-wrap: wrap;
  background: yellow;
}

.item{
  width: calc((100% - 2*10px)/3);
  height: 50px;
  background: blue;
  color: white;
  margin-right: 10px;
  margin-bottom: 10px;
  padding: 5px;
  box-sizing: border-box;
}

/* last item of each row */
.item:nth-child(3n){
  margin-right: 0;
  font-size: 150%;
}

/* last 3 items */
.item:nth-last-child(-n+3){
  margin-bottom: 0;
  background: green;
}
<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>

Fankys Benutzeravatar
Fanky

Ein einfacher Trick fügt einen flexiblen Raum hinzu, um den Rest der letzten Reihe zu füllen:

#products-list{
    display:flex;
    flex-flow: row wrap;
    justify-content:space-between;
}
#products-list::after {
    content: "";
    flex: auto;
    flex-basis: 200px;/*your item width*/
    flex-grow: 0;
}

Aber Sie sollten dann keine Ränder für Artikel verwenden. Wickeln Sie sie lieber in Behälter mit Polsterung.

Benutzeravatar von TylerH
TylerH

Ich habe diese Problemumgehung verwendet, auch wenn sie nicht sehr elegant ist und nicht die Leistung von Flexbox nutzt.

Es kann unter folgenden Bedingungen durchgeführt werden:

  • Alle Artikel haben die gleiche Breite
  • Die Artikel haben eine feste Breite
  • Sie nutzen SCSS/SASS (kann man aber vermeiden)

Wenn dies der Fall ist, können Sie das folgende Snippet verwenden:

 $itemWidth: 400px;
 $itemMargin: 10px;

html, body {
  margin: 0;
  padding: 0;
}

.flex-container {
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  margin: 0 auto;
  border: solid 1px blue;
}

@for $i from 1 through 10 {
  @media only screen and (min-width: $i * $itemWidth + 2 * $i * $itemMargin) {
    .flex-container {
      width: $i * $itemWidth + 2 * $i * $itemMargin;
    }
  }
}

.item {
  flex: 0 0 $itemWidth;
  height: 100px;
  margin: $itemMargin;
  background: red;
}
<div class="flex-container">
  <div class="item"></div>
  <div class="item" style="flex: 500 0 200px"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
</div>

Hier Ich habe ein Beispiel auf erstellt Codestift die auch Marge implementiert.

Die zweite und die dritte Bedingung können jeweils vermieden werden, indem Sie CSS-Variablen verwenden (wenn Sie sich entschieden haben, dies zu unterstützen) und das obige scss-Snippet kompilieren.

Stimmt, wir könnten es auch vor Flexbox machen, aber display: flex kann für ein responsives Design dennoch unerlässlich sein.

Benutzeravatar von simi
simi

Es gibt eine großartige Lösung, die immer funktioniert. fügen Sie ein div mit dem Klassenprodukt hinzu (dieselbe Klasse für andere Elemente, die unter Flex sind) und fügen Sie einen Stil für dieses div:height:0px hinzu; Sie müssen so viele Tauchgänge wie möglich in einer Reihe hinzufügen.

<div class="product" style="height:0px">

so viele, wie in einer Reihe sein können. Das ist alles. Funktioniert immer.

  • Ich würde sagen, es ist eher ein Hack als eine großartige Lösung, besonders in Situationen, in denen Sie die Anzahl nicht im Voraus kennen.

    – Crollywood

    11. Oktober 2021 um 11:47 Uhr

  • Es ist eine großartige Lösung, denn wenn Sie die Anzahl nicht im Voraus kennen und möchten, dass die letzte Reihe immer bleibt !!! perfekt, dann ist es ein sehr einfacher Weg. Arbeite immer großartig. funktioniert auf allen Größen. Nichts kann besser sein als diese Lösung.

    – ähnlich

    12. Oktober 2021 um 13:48 Uhr

1449290cookie-checkDimensionierung von flexiblen Artikeln in der letzten Reihe

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

Privacy policy