Як я можу зробити дітей Flexbox на 100% висотою свого батька?


458

Я намагаюся заповнити вертикальний простір гнучких елементів всередині Flexbox.

.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>

І ось JSFiddle

flex-2-child не заповнює необхідну висоту, за винятком двох випадків, коли:

  1. flex-2 має висоту 100% (що дивно, оскільки гнучка деталь має 100% за замовчуванням + вона баггі в Chrome)
  2. flex-2-child має абсолютне положення, яке також незручно

Наразі це не працює в Chrome чи Firefox.


у чому проблема використання висоти: 100%; для .flex-2?
rmagnum2002

Він не відповідає призначенню елемента flex, який полягає в тому, щоб заповнити вміст самостійно, і це дає мені найсмішнішу помилку в хромі, де висота повертається до нуля, коли я змінюю розмір вікна
Raz

3
Насправді, остання версія Firefox є єдиною, яка працює належним чином
Raz

1
В даний час існують значні відмінності в поведінці між браузерами , коли мова йде про відсотки рендеринга висот в Flexbox: stackoverflow.com/a/35537510/3597276
Michael Benjamin

2
Так, у Chrome є деякі проблеми, особливо з вкладеними флексоми. Наприклад, у мене є вкладений гнучкий ящик з дітьми, які мають, height:100%але вони замість цього мають природний зріст. І дивна річ, якщо я змінюю їхній зріст auto, тоді вони height:100%виглядають так, як я намагався це зробити. Це однозначно не інтуїтивно, якщо саме так воно має працювати.
trusktr

Відповіді:


236

Використовуйте align-items: stretch

Подібно до відповіді Девіда Сторі, мій спосіб вирішення:

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

Як варіант align-items, ви можете використовувати align-selfлише .flex-2-childпредмет, який ви хочете розтягнути.


7
stretch: це повинна бути обрана відповідь.
Дейв Еверітт

1
Однозначно, це далеко не найкраща відповідь на питання. Працює чудово.
marcias

Так, це справді найкраща відповідь на це питання.
Øyvind Bråthen

20
не забудьте також видалити height: 100%з дітей компонент, який ви хочете мати такий самий зріст, як і батько
Ilham Wahabi GX

Будь ласка, додайте видалення height: 100%до відповіді - я майже здався і побачив це в останній момент перед тим, як повернутися до absolute- що виникає з усілякими проблемами.
Петро

274

Я відповів на подібне запитання тут .

Я знаю, ви вже сказали, що position: absolute;це незручно, але це працює. Нижче див. Додаткову інформацію щодо вирішення проблеми зміни розміру.

Також дивіться цей jsFiddle для демонстрації, хоча я додав лише префікси webkit, настільки відкриті в Chrome.

У вас в основному є два питання, якими я буду займатися окремо.

  1. Отримання дитиною флекс-елемента на висоту заповнення 100%
    • Встановити position: relative;на батька дитини.
    • Встановити position: absolute;на дитину.
    • Потім ви можете встановити ширину / висоту, як потрібно (100% у моїй вибірці).
  2. Виправлення прокрутки "розміру" в Chrome
    • Поставте overflow-y: auto;прокручуваний дів.
    • Ділянка, що прокручується, повинна мати вказану чітку висоту. Мій зразок вже має висоту 100%, але якщо жодна вже не застосовується, ви можете вказатиheight: 0;

Дивіться цю відповідь для отримання додаткової інформації щодо проблеми прокрутки.


10
Точка 1) прекрасно працює в Chrome, Firefox не потребує позиції абсолютної.
Юрій

223

Якщо я правильно розумію, ви хочете, щоб дитина flex-2-dete заповнила висоту та ширину свого батьківського, щоб червона зона була повністю покрита зеленим?

Якщо так, вам просто потрібно встановити flex-2 для використання flexbox:

.flex-2 {
    display: flex;  
}

Потім скажіть дитині flex-2, щоб вона стала гнучкою:

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

Дивіться http://jsfiddle.net/2ZDuE/10/

Причина в тому, що дитина flex-2 не є елементом flexbox, але є його батьківським.


Як я можу зробити те саме, тільки з ростом 100% і кожна дитина - 50/50?
Рікі Леві

7
Майте на увазі, що якщо ви будете використовувати "align-items: center", ви не зможете використовувати це виправлення, оскільки ваші елементи тепер стануть однакової висоти.
Ніл Монро

10
@NeilMonroe Ви все одно можете використовувати, align-items: centerякщо ви використовуєте align-self: stretchлише одну дитину.
BT

1
Привіт @David, я спробував ваше рішення, він прекрасно працює для flex-напрямку: макет рядка, здається, не працює з flex-напрямком: макет стовпця, або у мене в коді немає помилок. Не могли б ви допомогти перевірити, чому в цій скрипці jsfiddle.net/78o54Lmv внутрішня скринька не буде займати повний зріст свого батька?
хуан фен

Я повинен додати min-height: 100vh;до .flex-2елементу , щоб вона працює. Дякую за допомогу!
Tenaciousd93

24

Я припускаю, що поведінка Chrome більше відповідає специфікації CSS (хоча це менш інтуїтивно). Згідно з специфікацією Flexbox, stretchзначення align-selfвластивості за замовчуванням змінює лише використовуване значення "властивості перехресного розміру" елемента ( heightу цьому випадку). І, як я розумію, специфікація CSS2.1 , відсоткові висоти обчислюються із зазначеного значення батьківського height, а не його використаного значення. На вказане значення батьківських heightвластивостей не змінюється жодних властивостей flex та є нерухомим auto.

Якщо встановити явний параметр, height: 100%то формально можливо обчислити відсоткову висоту дитини, як і встановлення, height: 100%що htmlдозволяє обчислити висоту відсотків bodyу CSS2.1.


2
Саме так! Для того, щоб це на практиці, просто додайте height:100%до .flex-2. Ось jsfiddle .
CourtDemone

7
Поведінка Chrome більше відповідає інтерпретації Chrome Team специфікації CSS. Хоча це можна було б інтерпретувати так, є набагато кращі способи його інтерпретації, жоден з яких не затримав би нас на цьому базарі, дратівливій і нахабній поведінці. Вони повинні були продумати це ще більше.
WraithKenny

1
@RickDoesburg, це було більше року тому, але я вважаю, що мені довелося вдатися до елементів фіксованої висоти. Я хочу, щоб ці браузери зібралися разом. Мені реально не подобається мобільний простір.
Йорданія

1
Якщо встановити для дитини вертикальний контейнер для флексокса, height: 100%це дає дуже дивні результати для Chrome. Здається, що це призводить до встановлення "заданої висоти" на загальну висоту контейнера , а не на висоту самого елемента, тому викликає небажане прокручування, коли інші елементи мають розміри, обчислені відносно нього.
Жуль

13

Я знайшов рішення сам, припустимо, у вас є CSS нижче:

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

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

У цьому випадку встановити висоту 100% не вийде, тому те, що я роблю, - це встановити margin-bottomправило auto, наприклад:

.child {
  margin-bottom: auto;
}

і дитина буде вирівняна до верхнього з батьків, ви також можете скористатись цим align-selfправилом, якщо ви хочете.

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

Гарний злом, але проблема полягає в тому, що якщо дитина є бічною панеллю і має колір тла, пробіл все ще білий.
Борис Бурков

У цьому рішенні чудово, що зріст батьків може бути динамічним! Попередні рішення вимагають від батька встановленої висоти. Дякую за це
Брибони

4

Ідея полягала б у тому, що display:flex;з flex-direction: row;заповненням containerdiv .flex-1і з .flex-2, але це не означає, що він .flex-2має за замовчуванням, height:100%;навіть якщо він розширений на повний зріст і мати дочірній елемент ( .flex-2-child), з яким height:100%;вам потрібно буде встановити батьківський height:100%;або використовувати display:flex;з flex-direction: row;на .flex-2DIV теж.

З того, що я знаю display:flex, не збільшиться висота всіх елементів вашої дитини до 100%.

Невелика демонстрація, зняла висоту з .flex-2-childі використовувалась display:flex;на веб-сайті .flex-2: http://jsfiddle.net/2ZDuE/3/


3

html

<div class="container">
    <div class="flex-1"></div>
    <div class="flex-2">
        <div class="flex-2-child"></div>
    </div>
</div>

css

.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;
}

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


0

Це також можна вирішити align-self: stretch;на елементі, який ми хочемо розтягнути.

Іноді бажано розтягнути лише один елемент у налаштуваннях флекси.

.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>


-7

.container {. . . . вирівняти-предмети: розтягнути; . . . . }


5
Ласкаво просимо в stackoverflow. Вам потрібно повністю пояснити свою відповідь, а що вона сприяє, що відрізняється від існуючих відповідей. Див stackoverflow.com/help/how-to-answer
Simon.SA

1
Здається, ваша відповідь така ж, як і у БТ (написана на три роки раніше), але висловлена ​​набагато поганіше.
Квентін

-12

Це моє рішення з використанням css +

Перш за все, якщо перша дитина (flex-1) має бути 100px, не повинна бути flex. Насправді в css + ви можете встановити гнучкі та / або статичні елементи (стовпці чи рядки), і ваш приклад стане таким же простим:

<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>

контейнер css:

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

і, очевидно, включають css + 0,2 ядра

почуйте скрипку

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.