У 3-рядному макеті:
- верхній ряд має бути розміром відповідно до його вмісту
- нижній ряд повинен мати фіксовану висоту в пікселях
- середній ряд повинен розширюватися, щоб заповнити контейнер
Проблема полягає в тому, що в міру розширення основного вмісту він стискає рядки заголовка і колонтитула:
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; */
}
Fiddle:
- http://jsfiddle.net/7yLFL/1/ (працює, з невеликим вмістом)
- http://jsfiddle.net/7yLFL/ (зламано, з більшим вмістом)
Мені пощастило, що я можу використовувати найновіші та найкращі в CSS, не зважаючи на застарілі браузери. Я подумав, що зможу використовувати гнучкий макет, щоб нарешті позбутися старих макетів на основі таблиці. Чомусь це не те, що я хочу ...
Для запису, існує багато пов'язаних питань на SO про "заповнення залишків висоти", але нічого, що вирішує проблему, яку я маю з flex. Відгуки:
- Зробіть, щоб div заповнив висоту залишку екрану
- Заповніть вертикальний простір, що залишився - лише CSS
- Чи є div, щоб заповнити решту висоти / ширини контейнера під час обміну ним з іншим div?
- Зробіть вкладений ділян розтягнути до 100% від висоти, що залишилася в контейнері
- Як я можу зробити так, щоб мій макет flexbox займав 100% вертикальний простір?
- тощо