Заполнение оставшегося вертикального пространства CSS

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для заполнения доступного вертикального пространства гибким расположением элементов используйте Flexbox. В контейнере установите display: flex и flex-direction: column. Для дочернего элемента, который должен занимать оставшееся пространство, установите flex-grow: 1:

CSS
Скопировать код
.container { 
  display: flex;
  flex-direction: column;
  height: 100vh;
}

.main-content { 
  flex-grow: 1;
}

Не забудьте установить height: 100% и margin: 0 для <body>, чтобы исключить проблемы с встроенными отступами и полностью использовать доступное пространство.

Кинга Идем в IT: пошаговый план для смены профессии

Конфигурация основы

Чтобы контейнер занимал всю высоту окна браузера:

CSS
Скопировать код
html, body { height: 100%; margin: 0; }

Такая конфигурация обеспечит надёжную основу и избавит от стандартных настроек, которые могут привести к неожиданным результатам.

Альтернативы и запасные варианты

Абсолютное позиционирование

Вместо Flexbox можно использовать абсолютное позиционирование. Это решение менее гибкое, но вполне надёжное.

CSS
Скопировать код
#second {
  position: absolute;
  top: 200px; bottom: 0; left: 0; width: 300px;
  background-color: #9ACD32;
}

Использование свойств таблицы в CSS

Если вам ещё помнятся старые таблицы, можно использовать свойства display: table и его производные:

CSS
Скопировать код
.wrapper { display: table; width: 100%; }
.row { display: table-row; }
.cell { display: table-cell; }

Еgo гибкость не так велика по сравнению с Flexbox, но подобный подход также может оказаться эффективным.

Работа с элементами фиксированной высоты

Приведём пример с блоком .content, располагающимся между .header и .footer, имеющими фиксированную высоту.

CSS
Скопировать код
.wrapper {
  display: flex;
  flex-direction: column;
  height: 100vh;
}
.header {
  height: 100px;
}
.content {
  flex-grow: 1;
  overflow: auto;
}
.footer {
  height: 50px;
}

Визуализация

CSS
Скопировать код
.container {
  display: flex;
  flex-direction: column;
  height: 100vh;
}
.header {
  height: 50px;
}
.content {
  flex: 1;
}
.footer {
  height: 30px;
}

На "сцене" нашего Viewport:

👒 = .header (Фиксированная шапка)
🧔 = .content (Гибкий главный элемент)
👞 = .footer (Фиксированный подвал)

Продвинутые тактики

Учёт разнородности размеров экранов

Использование процентов или единиц высоты окна браузера (vh) для определения размеров контейнера позволит адаптировать макет к различным размерам экранов.

Работа с цветом

Цвет фона поможет визуально разграничить разные секции и обеспечить лучшую видимость каждой части содержимого.

HTML
Скопировать код
<div id="first" style="background-color: #F5DEB3;">...</div>

Минимализм в структуре макета

Меньше элементов означает меньше ошибок. Старайтесь использовать как можно меньше обёрток.

Совместимость с браузерами

Регулярно проверяйте, как Flexbox работает в разных браузерах. Используйте префиксы и полифилы для обеспечения поддержки в старых версиях браузеров.

Доработка макета

С помощью инструментов вроде Jsfiddle протестируйте макет и найдите все недочёты до его публикации.

Полезные материалы

  1. A Complete Guide to Flexbox | CSS-Tricks — подробное руководство по Flexbox.
  2. flex-grow – CSS | MDN — детальное описание свойства flex-grow и его роли в распределении вертикального пространства.
  3. A Complete Guide to CSS Grid | CSS-Tricks — если вы готовы к работе с сетками, данное руководство по CSS Grid будет весьма полезно.
  4. CSS Grid Layout — обширное практическое введение в использование CSS Grid.
  5. Grids – Learn web development | MDN — освойте силу сеток и расширьте свои возможности в верстке.
  6. Can I use... Support tables for HTML5, CSS3, etc — ресурс для проверки совместимости Flexbox со всеми актуальными браузерами.
  7. How To Create a Custom Scrollbar — руководство по созданию пользовательской полосы прокрутки для элементов с переполнением содержимого.