Jak sprawić, by dzieci Flexbox osiągnęły 100% wzrostu swojego rodzica?

Próbuję wypełnić pionową przestrzeń elementu flex wewnątrz Flexboxa.

.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;
}
<div class="container">
  <div class="flex-1"></div>
  <div class="flex-2">
    <div class="flex-2-child"></div>
  </div>
</div>

A oto JSFiddle

flex-2-child nie wypełnia wymaganej wysokości z wyjątkiem dwóch przypadków, w których:

  1. W przeciwieństwie do innych elementów, które nie są w pełni kompatybilne z Chrome, nie są w pełni kompatybilne z Chrome.]}
  2. flex-2-child ma pozycję absolutną, która jest również niewygodna

To nie działa w Chrome lub Firefox obecnie.

 536
Author: Peter Mortensen, 2013-03-13

11 answers

Użyj align-items: stretch

Podobnie jak odpowiedź Davida Storeya, moje obejście to:

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

Zauważ, że height: 100% powinny być usunięte z komponentu potomnego even (patrz komentarze).

Alternatywnie do align-items, możesz użyć align-self tylko na .flex-2-child elemencie, który chcesz rozciągnąć.

 354
Author: B T,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-26 20:19:28

Odpowiedziałem na podobne pytanie tutaj .

Wiem, że już powiedziałeś, że to niewygodne, ale to działa. Poniżej znajdziesz więcej informacji na temat rozwiązania problemu zmiany rozmiaru.

Zobacz również to jsFiddle dla demo, chociaż dodałem tylko prefiksy WebKit, więc otwórz w Chrome.

Zasadniczo masz dwa problemy, którymi zajmę się osobno.
  1. uzyskanie dziecka elementu flex do wypełnienia wysokości 100%
  • Ustaw position: relative; na rodzicu dziecka.
  • Ustaw position: absolute; Na dziecku.
  • następnie możesz ustawić szerokość / wysokość zgodnie z wymaganiami (100% w mojej próbce).
  1. Zmiana rozmiaru przewijania "quirk" w Chrome
  • Umieść overflow-y: auto; na przewijanym div.
  • przewijalny div musi mieć wyraźnie określoną wysokość. Moja próbka ma już wysokość 100% , ale jeśli żadna nie jest już zastosowana, możesz określić height: 0;

Zobacz ta ODPOWIEDŹ aby uzyskać więcej informacji na temat kwestii przewijania.

 281
Author: Brett Postin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-24 15:05:58

Jeśli dobrze rozumiem, chcesz, aby flex-2-child wypełnił wysokość i szerokość swojego rodzica, aby czerwony obszar był w pełni pokryty zielonym?

Jeśli tak, wystarczy ustawić flex-2, aby używać Flexbox:

.flex-2 {
    display: flex;
}

Następnie powiedz flex-2-child, aby stał się elastyczny:

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

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

Powodem jest to, że flex-2-child nie jest elementem Flexbox, ale jego rodzicem.

 233
Author: David Storey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-24 15:08:55

Przypuszczam, że zachowanie Chrome jest bardziej zgodne ze specyfikacją CSS (choć jest mniej intuicyjne). Zgodnie ze specyfikacją Flexbox, domyślna wartość stretch właściwości align-self zmienia tylko użytą wartość właściwości "cross size" elementu (height, w tym przypadku). I, jak rozumiem specyfikacji CSS 2.1, wysokość procentowa jest obliczana na podstawie podanej wartości rodzica height, a nie jego użytej wartości. Na wartość rodzica height nie ma wpływu na właściwości flex i nadal wynosi auto.

Ustawienie jawnego height: 100%sprawia, że formalnie można obliczyć procentową wysokość dziecka, podobnie jak ustawienie height: 100% na html pozwala obliczyć procentową wysokość body W CSS 2.1.

 24
Author: Ilya Streltsyn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-24 15:11:20

Znalazłem rozwiązanie sam. Załóżmy, że masz CSS poniżej:

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

.child {
  height: 100%; <- didn't work
}

W tym przypadku ustawienie wysokości 100% nie zadziała, więc ustawiłem margin-bottom regułę na auto, Jak:

.child {
  margin-bottom: auto;
}

I dziecko będzie wyrównane do najwyższego poziomu rodzica.

Możesz również użyć reguły align-self jeśli wolisz:

.child {
  align-self: flex-start;
}
 17
Author: user3896501,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-24 15:18:02

Pomysł byłby taki, że display:flex; z flex-direction: row; wypełnia container div z .flex-1 i .flex-2, ale to nie znaczy, że .flex-2 ma domyślne height:100%;, nawet jeśli jest przedłużony do pełnej wysokości.

I aby mieć element potomny (.flex-2-child) z height:100%;, musisz ustawić rodzica na height:100%; lub użyć display:flex; z flex-direction: row; w div .flex-2.

Z tego co wiem, display:flex nie zwiększy wysokości wszystkich elementów Twojego dziecka do 100%.

Małe demo, usunęło wysokość z .flex-2-child i użyło display:flex; na .flex-2: http://jsfiddle.net/2ZDuE/3/

 4
Author: rmagnum2002,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-24 15:02:49

Można to również rozwiązać za pomocą align-self: stretch; na elemencie, który chcemy rozciągnąć.

Czasami pożądane jest rozciągnięcie tylko jednego elementu w konfiguracji Flexbox.

.container {
  height: 200px;
  width: 500px;
  display: flex;
  flex-direction: row;
}
.flex-1 {
  width: 100px;
  background-color: blue;
}
.flex-2 {
  position: relative;
  flex: 1;
  align-self: stretch;
  background-color: red;
}
.flex-2-child {
  background-color: green;
}
<div class="container">
  <div class="flex-1"></div>
  <div class="flex-2">
    <div class="flex-2-child"></div>
  </div>
</div>
 4
Author: GiorgosK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-24 15:21:38

.container {
    height: 200px;
    width: 500px;
    display: -moz-box;
    display: -webkit-flexbox;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: -moz-flex;
    display: flex;
    -webkit-flex-direction: row;
    -moz-flex-direction: row;
    -ms-flex-direction: row;
    flex-direction: row;
}
.flex-1 {
   flex:1 0 100px;
    background-color: blue;
}
.flex-2 {
    -moz-box-flex: 1;
    -webkit-flex: 1;
    -moz-flex: 1;
    -ms-flex: 1;
    flex: 1 0 100%;
    background-color: red;
}
.flex-2-child {
    flex: 1 0 100%;
    height: 100%;
    background-color: green;
}
<div class="container">
    <div class="flex-1"></div>
    <div class="flex-2">
        <div class="flex-2-child"></div>
    </div>
</div>

Http://jsfiddle.net/2ZDuE/750/

 3
Author: Carol McKay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-29 13:51:02

Ciekawostka: wysokość-100% działa w najnowszym chrome; ale nie w safari;


Więc rozwiązanie w tailwind byłoby

"elementy flex-stretch"

Https://tailwindcss.com/docs/align-items

I być stosowane rekurencyjnie do dziecka dziecka ...

 0
Author: lo.fish の archywillhe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-02-09 08:17:27

.Pojemnik { . . . . / align = "left" / ; . . . . }

 -9
Author: HRK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-13 02:45:31

To jest moje rozwiązanie przy użyciu css + .

Po pierwsze, jeśli pierwsze dziecko (flex-1) powinno mieć 100px, to nie powinno być flex.

W css + w rzeczywistości możesz ustawić elastyczne i / lub statyczne elementy (kolumny lub wiersze), a twój przykład stanie się tak prosty jak ten:

<div class="container">
  <div class="EXTENDER">
    <div class="COLS">
      <div class="CELL _100px" style="background-color:blue">100px</div>
      <div class="CELL _FLEX" style="background-color:red">flex</div>
    </div>
  </div>
</div>

Kontener CSS:

.container {
    height: 200px;
    width: 500px;
    position: relative;
}

I oczywiście zawierać css + 0.2 core .

Oto skrzypce .

 -12
Author: Marco Allori,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-24 15:14:01