Display: Flex verliert rechte Polsterung beim Überlaufen?

Lesezeit: 6 Minuten

Ich habe ein Problem mit einer CSS3-Flexbox.

Wenn ich das Flexbox-Element auf setze overflow und setze a min-width Wert für die Kinder, die richtige Polsterung am Elternteil geht verloren? Dies gilt für alle unterstützenden Browser.

Hier ist ein Beispiel für den Fehler. Wenn Sie nach rechts vom Container scrollen, sehen Sie, dass das letzte Kind hart an der rechten Kante des Containers anliegt, anstatt den Polsterungswert zu berücksichtigen.

.outer {
    display: flex;
    flex-direction: row;
    width: 300px;
    height: 80px;
    border:1px #ccc solid;
    overflow-x: auto;
    padding: 5px;
}
.outer > div {
    flex: 1 1 auto;
    border: 1px #ccc solid;
    text-align: center;
    min-width: 50px;
    margin: 5px;
}
<div class="outer">
    <div>text1</div>
    <div>text2</div>
    <div>text3</div>
    <div>text4</div>
    <div>text5</div>
    <div>text6</div>
    <div>text7</div>
    <div>text8</div>
    <div>text9</div>
    <div>text10</div>
</div>

Weiß jemand warum das so ist und wie ich das beheben könnte? Ich habe mit rumgespielt padding und margin Werte in verschiedenen Kombinationen ohne Erfolg.

  • Zumindest in Firefox ist dies kein Flexbox-spezifisches Verhalten – es tritt auch beim Blocklayout auf und ist gemäß der CSS-Spezifikation korrekt. Sehen bugzilla.mozilla.org/show_bug.cgi?id=748518 für mehr.

    – Holbert

    12. November 2014 um 17:09 Uhr

  • Danke dafür, ich war mir nicht sicher, ob es etwas Spezifisches für Flex war.

    – Chris Spittles

    12. November 2014 um 19:33 Uhr

Sie müssen eine weitere Wrapping-Ebene hinzufügen, wenn Sie beide “overflow-x:auto” mit scrollbarem Padding am Ende haben möchten.

Etwas wie das:

.scroll {
    overflow-x: auto;
    width: 300px;
    border:1px #ccc solid;
}
.outer {
    display: flex;
    flex-direction: row;
    box-sizing: border-box;
    min-width: 100%;
    height: 80px;
    padding: 5px;
    float: left; /* To size to content, & not be clamped to available width. (Vendor-prefixed intrinsic sizing keywords for "width" should work here, too.) */
}
.outer > div {
    flex: 1 1 auto;
    border: 1px #ccc solid;
    text-align: center;
    min-width: 50px;
    margin: 5px;
}
<div class="scroll">
  <div class="outer">
    <div>text1</div>
    <div>text2</div>
    <div>text3</div>
    <div>text4</div>
    <div>text5</div>
    <div>text6</div>
    <div>text7</div>
    <div>text8</div>
    <div>text9</div>
    <div>text10</div>
  </div>
</div>

  • Danke! Ein etwas einfacheres Beispiel gemacht: jsfiddle.net/rckd/237dgLjj

    – rd

    9. Januar 2017 um 15:34 Uhr

  • Warum funktioniert float: left? Laut Dokumentation in MDN soll es nichts tun, wenn es auf display: flex elements angewendet wird. Wäre es besser, stattdessen display: inline-flex zu verwenden? Es scheint in meinen Tests zu funktionieren, aber ich bin mir nicht sicher, ob es irgendwelche Nachteile hat

    – xgrtl

    22. Januar 2019 um 21:09 Uhr


  • float:left wirkt sich absolut aus flexible Behälter (display:flex Elemente), im Allgemeinen. Die Stelle wo float hat keinen Einfluss auf Flex Artikel (Kinder von display:flex Elemente). Ich sehe die MDN-Seite, die Sie erwähnt haben – das scheint zu sein developer.mozilla.org/en-US/docs/Web/CSS/float und es ist falsch. Ich werde es wieder in Ordnung bringen – danke für den Hinweis auf diese Unrichtigkeit.

    – Holbert

    26. Februar 2019 um 21:51 Uhr


  • Aber zur Beantwortung Ihrer Frage bzgl inline-flex: es sieht aus wie display:inline-flex würde auch gehen (statt float). Ich habe die Details hier vergessen, aber basierend auf meinem /**/ Code-Kommentar im Textausschnitt hatte ich nur vorgeschlagen float:left um eine intrinsische Dimensionierung auszulösen. Und inline-flex auch intrinsische Größenanpassung, so dass das hier wahrscheinlich auch gut funktioniert.

    – Holbert

    26. Februar 2019 um 21:53 Uhr


  • Ihr Code-Snippet hat immer noch keine Auffüllung auf “text10”?

    – James

    5. Mai 2021 um 15:12 Uhr

Benutzer-Avatar
Artur K.

Alternativ ist es möglich, die Ränder mit Pseudo-Elementen zu erstellen:

.outer::before { content: ''; min-width: 5px; }
.outer::after { content: ''; min-width: 5px; }

.outer {
    display: flex;
    flex-direction: row;
    width: 300px;
    height: 80px;
    border:1px #ccc solid;
    overflow-x: auto;
    padding: 5px;
}
.outer::after { content: ''; min-width: 5px; }
.outer > div {
    flex: 1 1 auto;
    border: 1px #ccc solid;
    text-align: center;
    min-width: 50px;
    margin: 5px;
}
<div class="outer">
    <div>text1</div>
    <div>text2</div>
    <div>text3</div>
    <div>text4</div>
    <div>text5</div>
    <div>text6</div>
    <div>text7</div>
    <div>text8</div>
    <div>text9</div>
    <div>text10</div>
</div>

  • Dieser funktioniert, es sei denn, Sie verwenden ein align-items: center; weil es dann wieder kaputt geht. Kennst du eine Lösung dafür?

    – BonifatiusK

    11. Juni 2019 um 14:42 Uhr

  • Nachdem ich mehrere Methoden aus dem Stack ausprobiert hatte, war dies für meine Situation am nächsten. musste ich hinzufügen border-top: 1px solid transparent; zum ::after um die Polsterung sichtbar zu machen.

    – SAUERSTOFF

    9. September 2020 um 9:24 Uhr

  • Habe diese Antwort erst heute gefunden! Sehr hilfreich. Wenn Sie den rechten Rand verwenden, um Ihre Elemente in einem Flex-Container zu platzieren, müssen Sie sicherstellen, dass Sie ihn aus dem letzten untergeordneten Element entfernen, da Sie am Ende sowohl den Pseudoinhalt als auch den Rand haben. Gute Lösung.

    – Johannes E

    10. Mai 2021 um 21:53 Uhr

  • Mann, genial!!

    – yzfdjzwl

    25. November 2021 um 12:39 Uhr

Benutzer-Avatar
BonifatiusK

Beide Lösungen von Arthur Käpp und dholbert funktionieren. Wenn Sie sich jedoch dafür entscheiden, irgendwelche ‘Align-Items’ (Akzeptieren für Dehnung) in der Hauptflexbox zu verwenden, wird es wieder brechen. Es hat eine Weile gedauert, aber schließlich habe ich eine Lösung gekocht, die gut funktioniert.

Diese Lösung verwendet die Pseudoelemente:

.outer {
    display: flex;
    flex-direction: row;
    width: 300px;
    height: 80px;
    border:1px #ccc solid;
    overflow-x: auto;
    padding: 5px;
    align-items: center;
    position: relative;
}
.outer > div {
    flex: 1 1 auto;
    border: 1px #ccc solid;
    text-align: center;
    min-width: 50px;
    margin: 5px;
}

.outer > div:last-child::after {
    content: '';
    position: absolute;
    height: 100%;
    width: 10px;
    display: inline-block;
    margin-left: 10px;
}
<div class="outer">
    <div>text1</div>
    <div>text2</div>
    <div>text3</div>
    <div>text4</div>
    <div>text5</div>
    <div>text6</div>
    <div>text7</div>
    <div>text8</div>
    <div>text9</div>
    <div>text10</div>
</div>

Beachten Sie, dass in einigen Fällen die Angabe margin-left: 10px im Pseudo-Element nicht funktioniert. Sie können ein Recht verwenden: -10px, das auch funktionieren würde.

Es gibt einen anderen Weg: Sie können ein anderes DIV-Item-flex -> TEXT_11 haben, dann setzen Sie MarginLeft = PaddingRight, wie Sie möchten

<div class="outer">
    <div>text1</div>
    <div>text2</div>
    <div>text3</div>
    <div>text4</div>
    <div>text5</div>
    <div>text6</div>
    <div>text7</div>
    <div>text8</div>
    <div>text9</div>
    <div>text10</div>

    <div style="margin-left: 5px" class="TEXT_11">&nbsp;</div>

</div>

1246930cookie-checkDisplay: Flex verliert rechte Polsterung beim Überlaufen?

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

Privacy policy