Сделать div (высота) занимать родительскую оставшуюся высоту


http://jsfiddle.net/S8g4E/

у меня есть контейнер div с двумя детьми. Первый ребенок имеет заданный рост. Как я могу заставить второго ребенка занять "свободное пространство" контейнера div без указания конкретной высоты?

В примере, розовый div должно занимать также белое пространство.


похож на этот вопрос: Как сделать так, чтобы div занимал оставшуюся высоту?

но я не хочу давать позиция абсолютного.

7 77

7 ответов:

расширения #down ребенка, чтобы заполнить оставшееся пространство #container может быть достигнуто различными способами в зависимости от поддержки браузера, который вы хотите достичь и Ли #up имеет определенную высоту.

образцы

.container {
  width: 100px;
  height: 300px;
  border: 1px solid red;
  float: left;
}
.up {
  background: green;
}
.down {
  background: pink;
}
.grid.container {
  display: grid;
  grid-template-rows: 100px;
}
.flexbox.container {
  display: flex;
  flex-direction: column;
}
.flexbox.container .down {
  flex-grow: 1;
}
.calc .up {
  height: 100px;
}
.calc .down {
  height: calc(100% - 100px);
}
.overflow.container {
  overflow: hidden;
}
.overflow .down {
  height: 100%;
}
<div class="grid container">
  <div class="up">grid
    <br />grid
    <br />grid
    <br />
  </div>
  <div class="down">grid
    <br />grid
    <br />grid
    <br />
  </div>
</div>
<div class="flexbox container">
  <div class="up">flexbox
    <br />flexbox
    <br />flexbox
    <br />
  </div>
  <div class="down">flexbox
    <br />flexbox
    <br />flexbox
    <br />
  </div>
</div>
<div class="calc container">
  <div class="up">calc
    <br />calc
    <br />calc
    <br />
  </div>
  <div class="down">calc
    <br />calc
    <br />calc
    <br />
  </div>
</div>
<div class="overflow container">
  <div class="up">overflow
    <br />overflow
    <br />overflow
    <br />
  </div>
  <div class="down">overflow
    <br />overflow
    <br />overflow
    <br />
  </div>
</div>

решетки

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

.container { display: grid; grid-template-rows: 100px }

The grid-template-rows определяет первую строку как фиксированную высоту 100px, и оставшиеся строки будут автоматически растягиваться, чтобы заполнить оставшееся пространство.

я уверен, что IE11 требует -ms- префиксы, поэтому не забудьте проверить функциональность в браузерах, которые вы хотите поддерживать.

Flexbox

CSS3 и все!--44-->Гибкий Модуль Компоновки Коробки (flexbox) теперь хорошо поддерживается и может быть очень легко реализовать. Потому что он гибкий, он даже работает, когда #up не имеет определенной высоты.
#container { display: flex; flex-direction: column; }
#down { flex-grow: 1; }

важно отметить, что поддержка IE10 и IE11 для некоторых свойств flexbox может быть ошибочной, а IE9 или ниже вообще не поддерживает.

Расчетную Высоту

еще одним простым решением является использование CSS3 calc функциональный блок, как указывает Альваро в своем ответ, но для этого требуется, чтобы высота первого ребенка была известным значением:

#up { height: 100px; }
#down { height: calc( 100% - 100px ); }

он довольно широко поддерживается, и единственными заметными исключениями являются calc в сочетании с transform или box-shadow, так что не забудьте проверить в нескольких браузерах, если это вас беспокоит.

другие Альтернативы

если требуется более старая поддержка, вы можете добавить height:100%; до #down сделает розовый div полной высоты, с одной оговоркой. Это вызовет переполнение контейнера, потому что #up толкает его вниз.

таким образом, вы могли бы добавить overflow: hidden; к контейнеру, чтобы исправить это.

альтернативно, если высота #up фиксировано, вы смогли расположить его совершенно внутри контейнер, и добавляете прокладк-верхнюю часть к #down.

и, еще один вариант будет использовать отображение таблицы:

#container { width: 300px; height: 300px; border: 1px solid red; display: table;}
#up { background: green; display: table-row; height: 0; }
#down { background: pink; display: table-row;}​

прошло почти два года с тех пор, как я задал этот вопрос. Я просто придумал css calc (), который решает эту проблему, и подумал, что было бы неплохо добавить ее, если у кого-то есть такая же проблема. (Кстати, я в конечном итоге использовал абсолютную позицию).

http://jsfiddle.net/S8g4E/955/

вот css

#up { height:80px;}
#down {
    height: calc(100% - 80px);//The upper div needs to have a fixed height, 80px in this case.
}

и более подробную информацию об этом здесь: http://css-tricks.com/a-couple-of-use-cases-for-calc/

поддержка браузера:http://caniuse.com/#feat=calc

мой ответ использует только CSS, и он не использует overflow:hidden или display:table-row. Это требует, чтобы первый ребенок действительно имел заданную высоту, но в вашем вопросе вы заявляете, что только второй ребенок должен иметь свою высоту, не указанную, поэтому я считаю, что вы должны найти это приемлемым.

html

<div id="container">
    <div id="up">Text<br />Text<br />Text<br /></div>
    <div id="down">Text<br />Text<br />Text<br /></div>
</div>

css

#container { width: 300px; height: 300px; border:1px solid red;}
#up { background: green; height: 63px; float:left; width: 100% }
#down { background:pink; padding-top: 63px; height: 100%; box-sizing: border-box; }

http://jsfiddle.net/S8g4E/288/

проверьте демо -http://jsfiddle.net/S8g4E/6/

использовать css -

#container { width: 300px; height: 300px; border:1px solid red; display: table;}
#up { background: green; display: table-row; }
#down { background:pink; display: table-row;}

вы можете использовать поплавки для толкания содержание:

http://jsfiddle.net/S8g4E/5/

у вас есть контейнер фиксированного размера:

#container {
    width: 300px; height: 300px;
}

содержимое может течь рядом с поплавком. Если мы не установим поплавок на полную ширину:

#up {
    float: left;
    width: 100%;
}

пока #up и #down разделите верхнюю позицию,#downсодержание может начинаться только после того, как дно плавало #up:

#down {
    height:100%;
}​

если я не ошибаюсь, вы можете просто добавить height: 100%; и overflow:hidden; до #down.

#down { 
    background:pink; 
    height:100%; 
    overflow:hidden;
}​

демо

изменить: так как вы не хотите использовать overflow:hidden;, вы можете использовать display: table; для этого сценария; однако он не поддерживается до IE 8. (display: table; поддержка)

#container { 
    width: 300px; 
    height: 300px; 
    border:1px solid red;
    display:table;
}

#up { 
    background: green;
    display:table-row;
    height:0; 
}

#down { 
    background:pink;
    display:table-row;
}​

Live DEMO

Примечание: Вы сказали, что вы хотите #down высота #container высота минус #up высота. Элемент display:table; решение делает именно то, что и этот jsfiddle будет изображать это довольно ясно.

Я не уверен, что это можно сделать чисто с помощью CSS, если вам не удобно притворяться иллюзиями. Возможно, используйте ответ Джоша Мейна и установите #container to overflow:hidden.

для чего это стоит, вот решение на jQuery:

var contH = $('#container').height(),
upH = $('#up').height();
$('#down').css('height' , contH - upH);