Сделайте флексбокс детей на 100% ростом их родителей

Я пытаюсь заполнить вертикальное пространство элемента flex внутри 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 в настоящее время.

14 ответов

Как и в случае с ответом Дэвида Стори, моя работа такова:

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

В качестве альтернативы align-items, ты можешь использовать align-self только на .flex-2-child вещь, которую вы хотите растянуть.

Я ответил на аналогичный вопрос здесь.

Я знаю, что вы уже сказали position: absolute; неудобно, но это работает. См. Ниже для получения дополнительной информации об устранении проблемы изменения размера.

Также ознакомьтесь с этим jsFiddle для демонстрации, хотя я добавил только префиксы webkit, открытые в Chrome.

У вас в основном есть 2 вопроса, с которыми я буду иметь дело отдельно.

  1. Заставить ребенка согнуть предмет на 100%
    • Задавать position: relative; на родителя ребенка.
    • Задавать position: absolute; на ребенка.
    • Затем вы можете установить ширину / высоту, как требуется (100% в моем образце).
  2. Исправление прокрутки изменения размера "причуды" в Chrome
    • Положил overflow-y: auto; на прокручиваемый div.
    • У прокручиваемого элемента div должна быть указана явная высота. Мой образец уже имеет высоту 100%, но если он еще не применен, вы можете указать height: 0;

Посмотрите этот ответ для получения дополнительной информации о проблеме прокрутки.

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

Если это так, вам просто нужно установить flex-2 для использования flexbox:

.flex-2 {
    display: flex;  
}

Затем скажите flex-2-child, чтобы он стал гибким:

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

Смотрите http://jsfiddle.net/2ZDuE/10/

Причина в том, что flex-2-child не элемент flexbox, а его родитель.

Я нашел решение самостоятельно, предположим, у вас есть 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;
}

Я полагаю, что поведение Chrome более соответствует спецификации CSS (хотя и менее интуитивно понятно). Согласно спецификации Flexbox, по умолчанию stretch ценность align-self свойство меняет только используемое значение элемента "свойство поперечного размера" (height, в этом случае). И, как я понимаю спецификацию CSS2.1, процентные высоты рассчитываются из указанного значения родительского height, а не его используемое значение. Указанное значение родительского height не зависит от каких-либо свойств flex и по-прежнему auto,

Установка явного height: 100% делает возможным формально рассчитать процент роста ребенка, как установка height: 100% в html позволяет рассчитать процентную высоту body в CSS2.1.

Это также можно решить с помощью align-self: stretch; на элементе, который мы хотим растянуть.

Иногда желательно растянуть только один элемент в настройке 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>

Другой подход (другой вариант не подходит для моего случая, потому что мне нужно более общее решение, я действительно хочу избежать использованияposition: absoluteпо возможности и только сalign-items: stretchв моем случае не сработает из-за другого сайлинга):

  1. Иметь родителя сdisplay: flex
  2. Дайте вашему элементу отображение гибкости,align-self: stretchиmargin-top: 0+margin-bottom: 0

Минимальный воспроизводимый пример:

      .parent {
    display: flex;
}

.child {
    min-height: 100%;
}

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/

Идея была бы, что display:flex; с flex-direction: row; заполняет container Div с .flex-1 а также .flex-2, но это не значит, что .flex-2 имеет значение по умолчанию height:100%; даже если он расширен до полной высоты и имеет дочерний элемент (.flex-2-child) с height:100%; вам нужно установить родительский height:100%; или использовать display:flex; с flex-direction: row; на .flex-2 Div тоже.

Из того, что я знаю display:flex не увеличит высоту всех ваших дочерних элементов до 100%.

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

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

.child {
    align-self: stretch;
}

Основываясь на предыдущих ответах, это решение работает для гибких элементов полной высоты.

забавный факт: высота-100% работает в последнем хром; но не в сафари;


поэтому решение в попутном ветре было бы

"гибкие элементы-растяжка"

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

и рекурсивно применяться к ребенку ребенка ...

.container { . . . . align-items: stretch; . . . . }

Это мое решение с использованием 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

услышать скрипку

Другие вопросы по тегам