Сделать 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, если вам не удобно притворяться иллюзиями. Возможно, используйте ответ Джоша Мейна и установите
#containertooverflow:hidden.для чего это стоит, вот решение на jQuery:
var contH = $('#container').height(), upH = $('#up').height(); $('#down').css('height' , contH - upH);