Problem beim vertikalen Zentrieren mit der Flexbox, wenn die Höhen unbekannt sind

68

Mein Layout hat einen Container flex-containerund ein Kind.

HTML:

<div class="flex-container">
  <div>text</div>
</div>

Der Behälter und das Kind haben eine unbekannte Höhe . Und das Ziel ist:

  • Wenn das Kind eine geringere Höhe als der Behälter hat, erscheint es horizontal und vertikal zentriert.
  • Wenn das Kind eine größere Höhe als der Container hat, passt es sich oben und unten an und wir können scrollen.

Planen: Geben Sie hier die Bildbeschreibung ein

Der schnellste Weg zum Zentrieren eines Elements mit Flexbox ist der folgende:

Codepen: http://www.codepen.io/ces/pen/slicw

Wenn das Kind des Containers jedoch eine größere Höhe hat, wird das Kind nicht richtig angezeigt. Das Kind erscheint geschnitten (nur der obere Teil).

Codepen: http://www.codepen.io/ces/pen/sGtfK

Planen:

Geben Sie hier die Bildbeschreibung ein

Gibt es eine Möglichkeit, dieses Problem zu beheben?

cespon
quelle

Antworten:

138

Ich habe die Lösung gefunden:

.flex-container {
    display: flex; /* only */
    overflow-y: scroll;
}

.flex-container > div {
    margin: auto; /* horizontal and vertical align */
}

Codepen: http://codepen.io/ces/pen/Idklh

cespon
quelle
11
Ich wünschte, ich könnte dies mehr als einmal positiv bewerten - es ist nicht nur nützlich, es ist auch sehr gut kommuniziert, danke.
Hier .flex-containerhat der Anfangswert align-items: flex-start(dh oben).
Sam
1
Ich habe schon lange versucht, eine Antwort darauf zu finden! Dankeschön.
CT5845
Gute Lösung, aber gibt es ein Warum?
Jiyinyiyong
3
@jiyinyiyong - hier sind einige Details zum "Warum?" ... stackoverflow.com/a/33455342/3597276
Michael Benjamin
-1

Add align-self:flex-start;to .flex-container > divkann auch dieses Problem beheben.

Siehe: http://www.w3.org/TR/css-flexbox-1/#auto-margins

iwege
quelle
1
Dies beantwortet die Frage, anstatt eine Problemumgehung bereitzustellen, wie dies bei der akzeptierten Antwort der Fall ist. +1
RienNeVaPlu͢s
8
Ihre Lösung besteht einfach darin, die Zentrierungsanforderung zu ignorieren. Wenn eine Zentrierung nicht notwendig wäre, gäbe es natürlich kein Problem.
Michael Benjamin
3
Dies ist nicht die richtige Antwort, da die vertikale Zentrierung ignoriert wird. Es ist also keine Lösung.
Ranzwertig