Сделать div (высота) занимать родительскую оставшуюся высоту
у меня есть контейнер div
с двумя детьми. Первый ребенок имеет заданный рост. Как я могу заставить второго ребенка занять "свободное пространство" контейнера div
без указания конкретной высоты?
В примере, розовый div
должно занимать также белое пространство.
похож на этот вопрос: Как сделать так, чтобы div занимал оставшуюся высоту?
но я не хочу давать позиция абсолютного.
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/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;}
вы можете использовать поплавки для толкания содержание:
у вас есть контейнер фиксированного размера:
#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; }
Примечание: Вы сказали, что вы хотите
#down
высота#container
высота минус#up
высота. Элементdisplay:table;
решение делает именно то, что и этот jsfiddle будет изображать это довольно ясно.
Я не уверен, что это можно сделать чисто с помощью CSS, если вам не удобно притворяться иллюзиями. Возможно, используйте ответ Джоша Мейна и установите
#container
tooverflow:hidden
.для чего это стоит, вот решение на jQuery:
var contH = $('#container').height(), upH = $('#up').height(); $('#down').css('height' , contH - upH);