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

288

Я пытаюсь заполнить вертикальное пространство элемента flex внутри flexbox.

.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 {
  width: 100px;
  background-color: blue;
}
.flex-2 {
  position: relative;
  -moz-box-flex: 1;
  -webkit-flex: 1;
  -moz-flex: 1;
  -ms-flex: 1;
  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 не заполняет требуемую высоту, за исключением двух случаев, когда:

  • flex-2 имеет высоту 100% (что странно, потому что элемент гибкости имеет 100% по умолчанию + он глючит в Chrome)
  • flex-2-child имеет абсолютную позицию, которая также неудобна

В настоящее время это не работает в Chrome или Firefox.

  • 0
    в чем проблема с использованием высоты: 100%; для .flex-2?
  • 0
    Он не соответствует назначению элемента flex, который состоит в том, чтобы самому заполнять контент, и дает мне самую странную ошибку в chrome, когда высота возвращается к нулю всякий раз, когда я изменяю размер окна
Показать ещё 4 комментария
Теги:
flexbox

8 ответов

207

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

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

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

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

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

Подробнее о проблеме прокрутки см. в этом .

  • 10
    Пункт 1) отлично работает в Chrome, Firefox не нуждается в абсолютной позиции.
162

Если я правильно понял, вы хотите, чтобы 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, но его родительский.

  • 0
    Как я могу сделать то же самое, просто с ростом 100% и каждому ребенку 50/50?
  • 6
    Имейте в виду, что если вы используете «align-items: center», вы не сможете использовать это исправление, поскольку ваши предметы теперь станут равными по высоте.
Показать ещё 2 комментария
59

Как и Дэвид Стори, моя работа:

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

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

18

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

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

  • 2
    Именно так! Чтобы применить это на практике, просто добавьте height:100% к .flex-2 . Вот JSFiddle .
  • 6
    Поведение Chrome более соответствует интерпретации Chrome Team CSS-спецификации. Хотя это может быть истолковано таким образом, есть гораздо лучшие способы его интерпретации, любой из которых не привел бы нас в ловушку к этому базарному, раздражающему и утомительному поведению. Они должны были обдумать это больше.
Показать ещё 2 комментария
2

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

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/

2

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

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

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

-9

Это мое решение, используя css +

Прежде всего, если первый ребенок (flex-1) должен быть 100px не должен быть гибким. В 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 core

услышать fiddle

Ещё вопросы

Сообщество Overcoder
Наверх
Меню