Как сделать, чтобы div заполнял оставшуюся высоту экрана после заголовка с помощью CSS вместо таблиц?
Я работаю над веб-приложением, где область содержимого должна заполнять всю высоту экрана. На странице есть заголовок с логотипом и информацией об аккаунте, который может иметь произвольную высоту. Мне нужно, чтобы div с содержимым заполнял оставшееся пространство до нижней части экрана.
В настоящее время я использую табличную верстку:
CSS:
#page {
height: 100%;
width: 100%
}
#tdcontent {
height: 100%;
}
#content {
overflow: auto; /* или overflow: hidden; */
}
HTML:
<table id="page">
<tr>
<td id="tdheader">
<div id="header">...</div>
</td>
</tr>
<tr>
<td id="tdcontent">
<div id="content">...</div>
</td>
</tr>
</table>
Этот подход заполняет всю высоту страницы без прокрутки. Однако я хочу избежать использования таблиц для верстки.
Дополнительные требования:
- Элементы внутри div с содержимым должны поддерживать процентные высоты
- Например, если заголовок занимает 20% высоты экрана, таблица внутри #content с высотой 50% должна занимать 40% пространства экрана
- Решение должно позволять вложенным элементам правильно вычислять их высоты относительно области содержимого
Какие CSS-техники могут достичь такой верстки без использования таблиц?
Чтобы сделать div, заполняющий оставшуюся высоту экрана после заголовка, с помощью CSS вместо таблиц, можно использовать несколько современных методов CSS-верстки. Наиболее эффективные подходы используют CSS Flexbox, CSS Grid или единицы viewport в сочетании с абсолютным позиционированием.
Содержание:
- Использование CSS Flexbox
- Использование CSS Grid
- Использование единиц viewport и абсолютного позиционирования
- Использование свойств отображения CSS Table
- Сравнение методов
- Практический пример реализации
Использование CSS Flexbox
Flexbox — это наиболее современный и рекомендуемый подход для этого требования к верстке. Установите для body или родительского контейнера значение display: flex с flex-direction: column, затем позвольте области контента расти и заполнять доступное пространство.
html, body {
height: 100%;
margin: 0;
padding: 0;
}
.page-container {
display: flex;
flex-direction: column;
height: 100vh;
}
#header {
/* Стили заголовка - высота может быть фиксированной или auto */
background: #f0f0f0;
padding: 20px;
}
#content {
flex: 1; /* Это заставляет область контента расти и заполнять оставшееся пространство */
overflow: auto;
/* Вложенные элементы с процентными высотами будут работать корректно */
}
<div class="page-container">
<div id="header">...</div>
<div id="content">
<!-- Элементы с процентными высотами будут работать -->
<div style="height: 50%;">Это будет 50% от высоты области контента</div>
</div>
</div>
Использование CSS Grid
CSS Grid предоставляет еще одно элегантное решение с аналогичными результатами по сравнению с Flexbox, но с другим синтаксисом и возможностями.
html, body {
height: 100%;
margin: 0;
padding: 0;
}
.page-container {
display: grid;
grid-template-rows: auto 1fr;
height: 100vh;
}
#header {
/* Стили заголовка */
background: #f0f0f0;
padding: 20px;
}
#content {
/* Grid автоматически обрабатывает оставшееся пространство */
overflow: auto;
}
<div class="page-container">
<div id="header">...</div>
<div id="content">
<div style="height: 50%;">Это будет 50% от высоты области контента</div>
</div>
</div>
Использование единиц viewport и абсолютного позиционирования
Для поддержки старых браузеров или когда вам требуется более точный контроль, вы можете использовать единицы viewport с абсолютным позиционированием:
html, body {
height: 100%;
margin: 0;
padding: 0;
position: relative;
}
#header {
/* Стили заголовка */
background: #f0f0f0;
padding: 20px;
}
#content {
position: absolute;
top: [высота-заголовка];
left: 0;
right: 0;
bottom: 0;
overflow: auto;
}
Для обработки динамических высот заголовка вы можете использовать CSS calc():
#content {
position: absolute;
top: calc([высота-заголовка] + [любые-отступы-поля]);
left: 0;
right: 0;
bottom: 0;
overflow: auto;
}
Использование свойств отображения CSS Table
Если вы хотите сохранить семантические преимущества div, но использовать табличное поведение верстки:
.page-container {
display: table;
width: 100%;
height: 100vh;
}
#header {
display: table-row;
height: auto;
}
#header > div {
display: table-cell;
}
#content {
display: table-row;
height: 1fr;
}
#content > div {
display: table-cell;
height: 100%;
overflow: auto;
}
Сравнение методов
Вот сравнение различных подходов:
| Метод | Поддержка браузерами | Гибкость | Производительность | Рекомендация |
|---|---|---|---|---|
| Flexbox | Отличная (IE11+) | Высокая | Отличная | Лучший выбор для современных сайтов |
| CSS Grid | Отличная (IE11 с -ms-) | Очень высокая | Отличная | Лучший выбор для сложных версток |
| Viewport + Absolute | Хорошая | Средняя | Хорошая | Хорошо для старых браузеров |
| CSS Table | Отличная | Средняя | Хорошая | Переход от табличной верстки |
Flexbox обычно является предпочтительным методом для этого конкретного случая использования благодаря своей простоте и отличной поддержке браузерами.
Практический пример реализации
Вот полный рабочий пример с использованием Flexbox:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Full Height Layout</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html, body {
height: 100%;
font-family: Arial, sans-serif;
}
.page-container {
display: flex;
flex-direction: column;
height: 100vh;
}
#header {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 20px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
#header h1 {
margin: 0;
font-size: 24px;
}
#content {
flex: 1; /* Это заставляет область контента расти и заполнять оставшееся пространство */
overflow: auto;
padding: 20px;
background: #f8f9fa;
}
.nested-container {
height: 50%;
background: #e9ecef;
border: 2px solid #dee2e6;
padding: 20px;
margin-bottom: 20px;
}
.example {
height: 30%;
background: #fff;
border: 1px solid #ced4da;
padding: 15px;
margin-bottom: 10px;
}
</style>
</head>
<body>
<div class="page-container">
<div id="header">
<h1>Website Header</h1>
<p>Account information and navigation</p>
</div>
<div id="content">
<h2>Content Area</h2>
<p>This content area fills the remaining screen height.</p>
<div class="nested-container">
<h3>50% Height Container</h3>
<p>This element takes 50% of the content area height.</p>
<div class="example">30% Height Example</div>
<div class="example">Another 30% Height Example</div>
</div>
<div class="example">Standalone 30% Height Example</div>
</div>
</div>
</body>
</html>
Это решение на основе Flexbox соответствует всем вашим требованиям:
- Заголовок может иметь любую высоту (авто или фиксированную)
- Div с контентом заполняет оставшееся пространство до низа экрана
- Вложенные элементы с процентными высотами работают корректно
- Не используются таблицы для верстки
- Решение современное, поддерживаемое и работает во всех современных браузерах
Для достижения наилучших результатов используйте подход Flexbox, так как он обеспечивает наиболее гибкое и поддерживаемое решение для версток с полной высотой в современной веб-разработке.
Источники
- MDN Web Docs - Использование CSS flexbox
- CSS-Tricks - Полное руководство по Flexbox
- MDN Web Docs - CSS Grid Layout
- Can I Use - Поддержка Flexbox
- W3C CSS Flexbox Layout Module
Заключение
Чтобы создать верстку с полной высотой без использования таблиц, CSS Flexbox является наиболее эффективным решением. Установив display: flex с flex-direction: column для родительского контейнера и используя flex: 1 для области контента, вы можете достичь именно того поведения верстки, которое вам нужно. Этот подход сохраняет семантическую структуру вашего HTML, обеспечивает отличную поддержку браузерами и позволяет корректно работать с вложенными процентными высотами. Для более сложных версток CSS Grid предлагает аналогичные возможности, но с другим синтаксисом. Оба метода превосходят табличную верстку по удобству обслуживания, доступности и соответствию современным веб-стандартам.