924 Stimmen

Wie kann ich Flexbox-Elemente zu 100 % der Höhe ihres Elternelements machen?

Ich versuche, den vertikalen Platz eines Flex-Elements innerhalb eines Flexbox auszufüllen.

.container {
  height: 200px;
  width: 500px;
  display: flex;
  flex-direction: row;
}
.flex-1 {
  width: 100px;
  background-color: blue;
}
.flex-2 {
  position: relative;
  flex: 1;
  background-color: red;
}
.flex-2-child {
  height: 100%;
  width: 100%;
  background-color: green;
}

Und hier ist der JSFiddle

flex-2-child füllt die erforderliche Höhe nicht aus, außer in den beiden Fällen, in denen:

  1. flex-2 eine Höhe von 100% hat (was seltsam ist, weil ein Flex-Element standardmäßig 100% hat + es in Chrome fehlerhaft ist)
  2. flex-2-child position:absolute hat, was auch unpraktisch ist

Dies funktioniert derzeit nicht in Chrome oder Firefox.

0 Stimmen

Was ist das Problem bei der Verwendung von height:100%; für .flex-2?

3 Stimmen

Es widersetzt sich dem Zweck des Flex-Elements, das den Inhalt von selbst füllen soll, und es bringt mir den seltsamsten Fehler in Chrome, wo die Höhe immer wieder auf null zurückgeht, wenn ich das Fenster neu dimensioniere

0 Stimmen

Firefox-Versionen, die immer noch der Spezifikation von 2009 (display: box) folgen, verhalten sich sehr unterschiedlich von Versionen, die der modernen Spezifikation folgen. Wenn FF sich schlecht verhält, würde ich empfehlen, die Unterstützung dafür einzustellen.

961voto

B T Punkte 51689

Verwenden Sie align-items: stretch

Ähnlich wie die Antwort von David Storey ist mein Workaround:

.flex-2 {
    display: flex;
    align-items: stretch;
}

Beachten Sie, dass height: 100% aus dem Kindkomponenten entfernt werden muss (siehe Kommentare).

Alternativ zu align-items können Sie align-self nur auf dem Element .flex-2-child verwenden, das gedehnt werden soll.

27 Stimmen

stretch: Dies sollte die gewählte Antwort sein.

7 Stimmen

Wie würden Sie den Text in einem div ausrichten, das vertikal ausgerichtet wurde, um in der Mitte auszurichten?

38 Stimmen

Ja, du solltest height: 100% entfernen hinzufügen.

297voto

Brett Postin Punkte 10963

Ich weiß, du hast bereits gesagt, dass position: absolute; umständlich ist, aber es funktioniert. Siehe unten für weitere Informationen zur Behebung des Resize-Problems.

Sieh dir auch dieses jsFiddle für eine Demo an, obwohl ich nur WebKit-Präfixe hinzugefügt habe, also öffne es in Chrome.

Im Grunde hast du zwei Probleme, die ich separat behandeln werde.

  1. Das Kind eines Flex-Elements ausfüllen
  • Setze position: relative; auf das Eltern-Element des Kindes.
  • Setze position: absolute; auf das Kind.
  • Du kannst dann Breite/Höhe nach Bedarf festlegen (wie 100% in meinem Beispiel).
  1. Behebung des Resize-Scrolling-"Problems" in Chrome
  • Füge overflow-y: auto; auf das scrollbare Element hinzu.
  • Das scrollbare Element muss eine explizite Höhe angegeben haben. Mein Beispiel hat bereits eine Höhe von 100%, aber wenn keine angegeben ist, kannst du height: 0; festlegen.

Siehe diese Antwort für weitere Informationen zum Scroll-Problem.

10 Stimmen

Punkt 1) funktioniert perfekt in Chrome, Firefox benötigt nicht die absolute Position.

4 Stimmen

Dies ist keine akzeptable Lösung. In all meinen Jahren des Programmierens habe ich gelernt, dass man position: absolute nur sehr vorsichtig für bestimmte Dinge verwendet, da Elemente in anderen Browsern möglicherweise nicht korrekt gerendert werden. Außerdem wird die Antwort nicht richtig behandelt, da er Flexbox direkt im Titel erwähnt hat, ist diese Antwort also falsch.

0 Stimmen

@MannyAlvarado Diese Frage und Antwort wurden zu einer Zeit veröffentlicht, als Flexbox noch im Arbeitsentwurf war und Browser-Implementierungen überall waren. Der historische Kontext ist hier wichtig. Zum Glück sind wir jetzt an einem besseren Ort, deshalb haben bessere Antworten diese übertroffen.

283voto

David Storey Punkte 26260

Wenn ich es richtig verstehe, möchten Sie, dass flex-2-child die Höhe und Breite seines Elternelements ausfüllt, sodass der rote Bereich vollständig vom grünen Bereich bedeckt ist?

Wenn ja, müssen Sie nur flex-2 so einstellen, dass Flexbox verwendet wird:

.flex-2 {
    display: flex;
}

Sagen Sie dann flex-2-child, flexibel zu werden:

.flex-2-child {
    flex: 1;
}

Siehe http://jsfiddle.net/2ZDuE/10/

Der Grund dafür ist, dass flex-2-child kein Flexbox-Element ist, aber sein Elternteil schon.

0 Stimmen

Wie kann ich das Gleiche tun, nur mit einer Höhe von 100% und jedes Kind ist 50/50?

9 Stimmen

Bitte beachten Sie, dass Sie bei Verwendung von "align-items: center" diese Lösung nicht nutzen können, da Ihre Elemente nun eine gleichmäßige Höhe haben werden.

20 Stimmen

@NeilMonroe Du kannst immer noch align-items: center verwenden, wenn du align-self: stretch nur auf das eine Kind anwendest.

36voto

user3896501 Punkte 2802

Ich habe die Lösung selbst gefunden. Nehmen wir an, Sie haben das folgende CSS:

.parent {
  align-items: center;
  display: flex;
  justify-content: center;
}

.child {
  height: 100%; <- hat nicht funktioniert
}

In diesem Fall funktioniert das Setzen der Höhe auf 100% nicht, daher habe ich die Regel margin-bottom auf auto gesetzt, wie folgt:

.child {
  margin-bottom: auto;
}

Und das Kind wird oben an den obersten Teil des Elternelements ausgerichtet sein.

Sie können auch die Regel align-self verwenden, wenn Sie möchten:

.child {
  align-self: flex-start;
}

3 Stimmen

Ein guter Hack, aber das Problem ist: Wenn das Kind ein Seitenleisten-Element ist und eine Hintergrundfarbe hat, bleibt der Abstand (margin space) trotzdem weiß.

0 Stimmen

Was an dieser Lösung großartig ist, ist dass die Höhe des Elternelements dynamisch sein kann! Bei den bisherigen Lösungen musste das Elternelement eine festgelegte Höhe haben. Danke dafür.

0 Stimmen

Das Problem ist, dass ich einen Rand benötige, der bis nach unten reicht.

29voto

Ilya Streltsyn Punkte 12521

Ich nehme an, dass das Verhalten von Chrome konsistenter mit der CSS-Spezifikation ist (obwohl es weniger intuitiv ist). Gemäß der Flexbox-Spezifikation ändert der standardmäßige stretch-Wert der Eigenschaft align-self nur den verwendeten Wert der "queren Größe-Eigenschaft" des Elements (height in diesem Fall). Und soweit ich die CSS 2.1-Spezifikation verstehe, werden prozentuale Höhen vom festgelegten Wert der Eltern-height berechnet, nicht vom verwendeten Wert. Der festgelegte Wert der Eltern-height wird von keinen Flex-Eigenschaften beeinflusst und ist immer noch auto.

Das Festlegen einer expliziten height: 100% macht es formal möglich, die prozentuale Höhe des Kindes zu berechnen, genau wie das Festlegen von height: 100% für html es möglich macht, die prozentuale Höhe von body in CSS 2.1 zu berechnen.

2 Stimmen

Genau! Um dies in die Praxis umzusetzen, fügen Sie einfach height:100% zu .flex-2 hinzu. Hier ist der jsfiddle.

7 Stimmen

Das Verhalten von Chrome ist eher konsistent mit der Interpretation des CSS-Spezifikation durch das Chrome-Team. Auch wenn es so interpretiert werden könnte, gibt es weit bessere Möglichkeiten, es zu interpretieren, von denen keine uns in dieses skurrile, nervige und ärgerliche Verhalten gelockt hätte. Sie hätten es besser durchdenken sollen.

1 Stimmen

@RickDoesburg, das ist zwar schon mehr als ein Jahr her, aber ich glaube, dass ich auf festgelegte Höhenelemente zurückgreifen musste. Ich wünschte, diese Browser würden sich zusammenreißen. Ich fange wirklich an, den mobilen Raum zu verabscheuen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X