В трехстрочном макете:
- верхняя строка должна быть в соответствии с ее содержимым
- нижняя строка должна иметь фиксированную высоту в пикселях.
- средняя строка должна расширяться для заполнения контейнера.
Проблема заключается в том, что по мере расширения основного содержимого он сжимает строки заголовка и нижнего колонтитула:
HTML:
<section>
<header>
header: sized to content
<br>(but is it really?)
</header>
<div>
main content: fills remaining space<br>
x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>
<!-- uncomment to see it break - ->
x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>
x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>
x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>
x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>
<!-- -->
</div>
<footer>
footer: fixed height in px
</footer>
</section>
CSS
section {
display: flex;
flex-flow: column;
align-items: stretch;
height: 300px;
}
header {
flex: 0 1 auto;
background: tomato;
}
div {
flex: 1 1 auto;
background: gold;
overflow: auto;
}
footer {
flex: 0 1 60px;
background: lightgreen;
/* fixes the footer: min-height: 60px; */
}
Скрипка:
- http://jsfiddle.net/7yLFL/1/ (работает с небольшим контентом)
- http://jsfiddle.net/7yLFL/ (сломанный, с большим содержимым)
Мне повезло, что я могу использовать последнюю и самую лучшую в CSS, не обращая внимания на устаревшие браузеры. Я думал, что смогу использовать гибкий макет, чтобы окончательно избавиться от старых табличных макетов. По какой-то причине это не делает то, что я хочу...
Для записи есть много связанных вопросов о SO о "заполнении оставшейся высоты", но ничего, что решает проблему, которую я испытываю с помощью flex. Refs:
- Сделайте div, чтобы заполнить высоту оставшегося экрана
- Заполнить оставшееся вертикальное пространство - только CSS
- У вас есть div, чтобы заполнить оставшуюся высоту/ширину контейнера при совместном использовании с другим div?
- Сделайте вложенное растяжение div до 100% оставшейся высоты контейнера в контейнере
- Как сделать мой макет flexbox занял 100% вертикальное пространство?
- и т.д.