Расширение #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>
Сетка
grid
Макет CSS предлагает еще один вариант, хотя он может быть не таким простым, как модель Flexbox. Однако для этого требуется только стилизация элемента контейнера:
.container { display: grid; grid-template-rows: 100px }
В grid-template-rows
определяет первую строку как фиксированную высоту 100 пикселей, а оставшиеся строки автоматически растягиваются, чтобы заполнить оставшееся пространство.
Я почти уверен, что IE11 требует -ms-
префиксов, поэтому не забудьте проверить функциональность в браузерах, которые вы хотите поддерживать.
Flexbox
Модульflexbox
CSS3 Flexible Box Layout ( ) теперь хорошо поддерживается и его очень легко реализовать. Поскольку он гибкий, он работает даже тогда, когда #up
не имеет определенной высоты.
#container { display: flex; flex-direction: column; }
#down { flex-grow: 1; }
Важно отметить, что поддержка IE10 и IE11 для некоторых свойств flexbox может содержать ошибки, а IE9 или более ранняя версия не поддерживает вообще.
Расчетная высота
Еще одно простое решение - использовать функциональный блок CSS3calc
, как указывает Альваро в своем ответе , но для этого требуется, чтобы высота первого дочернего элемента была известным значением:
#up { height: 100px; }
#down { height: calc( 100% - 100px ); }
Он довольно широко поддерживается, с единственными заметными исключениями: <= IE8 или Safari 5 (без поддержки) и IE9 (частичная поддержка). Некоторые другие проблемы включают использование calc в сочетании с преобразованием или box-shadow , поэтому обязательно проверьте в нескольких браузерах, если это вас беспокоит.
Другие альтернативы
Если старше необходима поддержка, вы могли бы добавить height:100%;
к#down
сделают розовую Диву полную высоту, с одной оговоркой. Это вызовет переполнение контейнера, потому что #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;}