Как сделать, чтобы div заполнял оставшееся пространство экрана по высоте?
Я работаю над веб-приложением, где контент должен занимать всю высоту экрана.
На странице есть заголовок, который содержит логотип и информацию о аккаунте. Высота заголовка может быть произвольной. Мне нужно, чтобы контейнер с контентом заполнял оставшуюся часть страницы до самого низа.
У меня есть блок div
для заголовка и div
для контента. На данный момент я использую таблицу для разметки:
<table id="page">
<tr>
<td id="tdheader">
<div id="header">...</div>
</td>
</tr>
<tr>
<td id="tdcontent">
<div id="content">...</div>
</td>
</tr>
</table>
CSS:
#page {
height: 100%;
width: 100%;
}
#tdcontent {
height: 100%;
}
#content {
overflow: auto; /* или overflow: hidden; */
}
Вся высота страницы заполняется, и прокрутка не требуется. Что касается элементов внутри контейнера с контентом, установка свойства top: 0;
помещает их прямо под заголовок. Иногда контент будет представлять собой настоящую таблицу, у которой высота задана в 100%. Помещение заголовка внутрь контейнера с контентом не позволяет это реализовать.
Существует ли способ достичь такого же эффекта без использования table
?
Обновление:
Элементы внутри div
с контентом также будут иметь высоты, заданные в процентах. Например, элемент с высотой 100% внутри div
займет всю его высоту. То же самое будет для двух элементов по 50%.
Обновление 2:
Например, если заголовок занимает 20% высоты экрана, то таблица, указавшая 50% внутри #content
, займет 40% пространства экрана. Пока что оборачивание всей структуры в таблицу — единственный вариант, который работает.
4 ответ(ов)
На самом деле, в CSS нет надежного и кросс-браузерного способа сделать это. Если ваш макет имеет сложности, вам нужно использовать JavaScript для установки высоты элемента. Суть того, что вам нужно сделать, заключается в следующем:
Высота элемента = Высота окна просмотра - element.offset.top - желаемый нижний отступ
После того как вы получите это значение и установите высоту элемента, необходимо прикрепить обработчики событий как к событию onload
, так и к onresize
у окна, чтобы можно было вызвать вашу функцию изменения размера.
Также, если ваш контент может быть больше, чем окно просмотра, вам нужно будет установить overflow-y
в значение scroll
.
В вашем коде вы используете CSS правило height: calc(100vh - 110px);
для элемента с классом .body
. Это выражение предназначено для вычисления высоты элемента с учётом высоты других элементов на странице — в данном случае .header
и .footer
.
Ваш шаблон выглядит следующим образом:
.header { height: 60px; top: 0; background-color: green }
.body {
height: calc(100vh - 110px); /* 60px (header) + 50px (footer) */
background-color: gray;
}
.footer { height: 50px; bottom: 0; }
Объяснение:
100vh
— это 100% высоты видимой области (viewport) браузера.110px
— это сумма высот.header
(60px) и.footer
(50px).
Таким образом, calc(100vh - 110px)
позволяет задать высоту .body
так, чтобы она занимала оставшееся пространство между шапкой и подвалом, что делает макет более адаптивным и удобным.
HTML структура:
<div class="header">
<h2>My header</h2>
</div>
<div class="body">
<p>The body</p>
</div>
<div class="footer">
My footer
</div>
Эта структура позволяет правильно реализовать ваш макет: шапка будет находиться сверху, затем контент тела, и внизу — подвал. Такой подход обычно используется для создания постоянных элементов, которые остаются на экране при прокрутке страницы.
Если у вас есть дополнительные вопросы по этому коду или CSS в целом, не стесняйтесь задавать!
В CSS3 есть простой способ задать высоту элемента с учетом высоты другого элемента, используя свойство calc()
. Например:
height: calc(100% - 10px); /* 10px — это высота вашего первого div */
Это решение поддерживается всеми основными браузерами на сегодняшний день, так что можете смело использовать его, если нет требований поддерживать устаревшие браузеры.
Это можно сделать с помощью чистого CSS, используя единицы измерения vh
(высота вьюпорта):
#page {
display: block;
width: 100%;
height: 95vh !important;
overflow: hidden;
}
#tdcontent {
float: left;
width: 100%;
display: block;
}
#content {
float: left;
width: 100%;
height: 100%;
display: block;
overflow: scroll;
}
А вот и разметка HTML:
<div id="page">
<div id="tdcontent"></div>
<div id="content"></div>
</div>
Я проверял, это работает во всех основных браузерах: Chrome, IE и Firefox.
Как задать cellpadding и cellspacing с помощью CSS?
Как создать плейсхолдер для выпадающего списка (select)?
Как сделать так, чтобы div не был больше своего содержимого?
Как выровнять содержимое div по нижнему краю
Как центрировать элемент с "position: absolute"