Сделайте div, чтобы заполнить высоту оставшегося места на экране

Я работаю над веб-приложением, в котором я хочу, чтобы содержимое занимало высоту всего экрана.

На странице есть заголовок, содержащий логотип и информацию об учетной записи. Это может быть произвольная высота. Я хочу, чтобы div с содержимым заполнил остальную часть страницы до самого низа.

У меня есть заголовок div и контент div. На данный момент я использую такую ​​таблицу для раскладки:

CSS и HTML

#page {
    height: 100%; width: 100%
}

#tdcontent {
    height: 100%;
}

#content {
    overflow: auto; /* or overflow: hidden; */
}
<table id = "page">
    <tr>
        <td id = "tdheader">
            <div id = "header">...</div>
        </td>
    </tr>
    <tr>
        <td id = "tdcontent">
            <div id = "content">...</div>
        </td>
    </tr>
</table>

Страница заполнена по всей высоте, прокрутка не требуется.

Для всего, что находится внутри блока содержимого, установка top: 0; поместит его прямо под заголовок. Иногда содержимое представляет собой настоящую таблицу со 100% высотой. Помещение header внутрь content не позволит этому сработать.

Есть ли способ добиться такого же эффекта без использования table?

Обновлять:

Элементы внутри содержимого div также будут иметь высоту в процентах. Так что что-то на 100% внутри div заполнит его до самого дна. Как и два элемента на 50%.

Обновление 2:

Например, если заголовок занимает 20% высоты экрана, таблица, указанная на 50% внутри #content, займет 40% пространства экрана. Пока что просто обернуть все это в таблицу - это единственное, что работает.

Для тех, кто столкнется с этим в будущем, вы можете получить желаемый макет таблицы в большинстве браузеров без разметки таблицы, используя display:table и связанные свойства, см. этот ответ по очень похожему вопросу.

AmeliaBR 20.01.2014 06:23

Я пытался заново создать вашу настройку - jsfiddle.net/ceELs - но она не работает, что я пропустил?

Gill Bates 14.04.2014 16:12

@Мистер. Ответ инопланетянина прост и полезен, проверьте его http://stackoverflow.com/a/23323175/188784

Gohan 20.06.2014 07:30

На самом деле то, что вы описываете, не работает даже с таблицами: если содержимое занимает больше места по вертикали, чем высота экрана, ячейка таблицы и вся таблица будут расширяться за пределы нижней части экрана. Ваш контент переполнен: авто не будет отображать полосу прокрутки.

Damien 02.07.2014 00:00

@GillBates он будет работать после того, как вы укажете высоту родительского элемента, посмотрите на jsfiddle.net/ceELs/5

Michal Vašut 30.09.2014 13:45

Появляется .screenful: {height: 100vh}, добавьте box-sizing: border-box;, чтобы включить заполнение.

Stav Pan Geffen 30.05.2015 08:16

Поэтому люди не упускают из виду очевидное: если вам нужно заполнить оставшуюся страницу только некоторыми свойствами css (например, background-color), то вы можете установить этот css в элементе body.

andrew pate 27.07.2017 14:50

Javascript полностью :-) Легко рассчитать высоту, используя getClientBoundingRect нижнего и верхнего колонтитула. А затем просто динамически установите высоту div ... я знаю, что отвечать так на этот вопрос нереально (следовательно, только комментарий :-))

BennyHilarious 16.11.2019 16:45
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
2 160
8
1 193 007
36
Перейти к ответу Данный вопрос помечен как решенный

Ответы 36

Если единственная проблема - высота, кажется, работает просто использование div:

<div id = "header">header content</div>
<div id = "content" style = "height:100%">content content</div>

В простом тесте ширина заголовка / содержимого отличается в вашем и моем примере, но я не уверен, из вашего сообщения, если вас беспокоит ширина?

Это не совсем то, чем я хочу заниматься. Я хочу, чтобы содержимое div заполняло оставшуюся часть экрана, а не было фактически той же высоты, что и экран.

Vincent McNabb 18.09.2008 09:33

Это похоже на то, что делает мой пример, по крайней мере, когда я его пробую. Вы не замечаете такого поведения?

Bruce 20.09.2008 06:46

Попробуйте поместить таблицу в контент размером 100%. Он не будет работать.

Vincent McNabb 30.09.2008 02:08

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title>Test</title>
<style type = "text/css">
body
,html
{
    height: 100%;
    margin: 0;
    padding: 0;
    color: #FFF;
}

#header
{
    float: left;
    width: 100%;
    background: red;
}

#content
{
    height: 100%;
    overflow: auto;
    background: blue;
}

</style>
</head>
<body>

    <div id = "content">
        <div id = "header">
                Header
                <p>Header stuff</p>
        </div>
            Content
            <p>Content stuff</p>
    </div>

</body>
</html>

Во всех нормальных браузерах вы можете поместить div «заголовок» перед содержимым в качестве родственного элемента, и тот же CSS будет работать. Однако IE7- неправильно интерпретирует высоту, если в этом случае значение float равно 100%, поэтому заголовок должен находиться В содержимом, как указано выше. Переполнение: auto вызовет двойные полосы прокрутки в IE (в котором полоса прокрутки области просмотра всегда отображается, но отключена), но без нее содержимое будет обрезано, если оно переполнится.

Закрывать! Почти то, что я хочу, за исключением того, что я собираюсь разместить другие вещи в div ... то есть top: 0; поместит что-то прямо под заголовком. Я изменю свой вопрос еще раз, потому что вы ответили на него отлично, и все же не то, что я хочу! Я просто скрою переполнение, так как контент должен соответствовать.

Vincent McNabb 18.09.2008 11:50

-1: этот ответ создает div с именем content, который покрывает весь экран, а не отдых экрана.

Casebash 19.05.2011 09:44

На самом деле нет надежного кросс-браузерного способа сделать это в CSS. Предполагая, что ваш макет сложен, вам нужно использовать JavaScript, чтобы установить высоту элемента. Суть того, что вам нужно сделать, такова:

Element Height = Viewport height - element.offset.top - desired bottom margin

Как только вы сможете получить это значение и установить высоту элемента, вам нужно прикрепить обработчики событий как к загрузке окна, так и к onresize, чтобы вы могли запустить свою функцию изменения размера.

Кроме того, предполагая, что ваш контент может быть больше, чем область просмотра, вам нужно будет установить overflow-y для прокрутки.

Вот что я подозревал. Однако приложение также будет работать с отключенным Javascript, поэтому я думаю, что буду продолжать использовать таблицу.

Vincent McNabb 18.09.2008 13:22

Винсент, способ стоять на своем. Я хотел сделать то же самое, но с css это невозможно? Я не уверен, но, несмотря на то, что ни одно из других решений не делает то, что вы описали. На данный момент правильно работает только javascript.

Travis 05.05.2010 00:00

что, если высота окна изменится

Techsin 17.11.2013 12:55

@Techsin использует jquery или ему подобные для привязки к событию изменения размера окна: $ (window) .bind ('resize directionchange', doResize);

Emeka 26.12.2013 19:55

Я имею в виду ... почему мы не используем calc в 2013 году?

kamii 20.02.2014 03:21

Проблема с onresize в том, что он не работает. Он не улавливает изменение размера внутреннего содержимого дерева DOM, см. stackoverflow.com/q/5532453.

TMS 17.04.2014 13:32

@TMS Почему бы не добавить прослушивателей событий к содержимому, размер которого изменяется?

Algorath 22.05.2014 19:10

@Algorath, какое событие ты имеешь в виду? Проблема в том, что на самом деле нет такого события, которое запускалось бы при изменении DOM, см. Связанный вопрос stackoverflow.com/q/5532453

TMS 26.05.2014 19:12

У меня такая же проблема, по-прежнему нет лучшего способа?

Gohan 20.06.2014 05:53

Разве это не надежное кроссбраузерное решение: stackoverflow.com/questions/18665171/…

Mark Murphy 20.02.2015 17:29

@MarkMurphy Это зависит от обстоятельств. Посетители вашего веб-сайта все еще используют IE 6/7 или они обновились?

jkdev 17.02.2016 12:19

Было бы неплохо, если бы вы преобразовали свое описание как код

WasiF 19.07.2018 16:38

высота: calc (100vh - 400px); - допустимый стиль CSS, который делает именно то, о чем идет речь. Все другие решения полагаются на фиксированную родительскую высоту или отображение блока.

WilliamX 14.11.2018 03:24

@WilliamX это лучший ответ на этой странице. Вы должны добавить это как ответ

Miles M. 12.02.2021 18:01

Винсент, я отвечу еще раз, используя ваши новые требования. Поскольку вы не заботитесь о том, чтобы контент был скрыт, если он слишком длинный, вам не нужно перемещать заголовок. Просто поместите переполнение, скрытое в теги html и body, и установите высоту #content на 100%. Контент всегда будет длиннее области просмотра на высоту заголовка, но он будет скрыт и не будет вызывать полосы прокрутки.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns = "http://www.w3.org/1999/xhtml">
  <head>
    <title>Test</title>
    <style type = "text/css">
    body, html {
      height: 100%;
      margin: 0;
      padding: 0;
      overflow: hidden;
      color: #FFF;
    }
    p {
      margin: 0;
    }

    #header {
      background: red;
    }

    #content {
      position: relative;
      height: 100%;
      background: blue;
    }

    #content #positioned {
      position: absolute;
      top: 0;
      right: 0;
    }
  </style>
</head>

<body>
  <div id = "header">
    Header
    <p>Header stuff</p>
  </div>

  <div id = "content">
    Content
    <p>Content stuff</p>
    <div id = "positioned">Positioned Content</div>
  </div>

</body>
</html>

Уже думал об этом. Но тоже не работает. Я просто остановлюсь на table, потому что он работает. Тем не менее, спасибо за обновление.

Vincent McNabb 18.09.2008 22:02

Я тоже искал ответ на этот вопрос. Если вам посчастливилось настроить таргетинг на IE8 и выше, вы можете использовать display:table и связанные значения, чтобы получить правила отрисовки таблиц с элементами уровня блока, включая div.

Если вам еще повезло и ваши пользователи используют браузеры высшего уровня (например, если это приложение для интрасети на компьютерах, которыми вы управляете, как мой последний проект), вы можете использовать новый Гибкая компоновка коробки в CSS3!

Некоторое время я боролся с этим и в итоге получил следующее:

Поскольку легко сделать содержимое DIV той же высоты, что и родительский, но, очевидно, сложно сделать его родительской высотой за вычетом высоты заголовка, я решил сделать содержимое div полной высоты, но расположить его абсолютно в верхнем левом углу, а затем определить отступ для вершины, имеющей высоту заголовка. Таким образом, контент аккуратно отображается под заголовком и заполняет все оставшееся пространство:

body {
    padding: 0;
    margin: 0;
    height: 100%;
    overflow: hidden;
}

#header {
    position: absolute;
    top: 0;
    left: 0;
    height: 50px;
}

#content {
    position: absolute;
    top: 0;
    left: 0;
    padding-top: 50px;
    height: 100%;
}

Что делать, если вы не знаете высоту заголовка?

Yugal Jindle 17.03.2013 11:46

это никогда не работал у меня иначе с использованием JavaScript, как предложил NICCAI в самом первом ответе. Я использую этот подход для изменения масштаба <div> с помощью Google Maps.

Вот полный пример того, как это сделать (работает в Safari / FireFox / IE / iPhone / Andorid (работает с вращением)):

CSS

body {
  height: 100%;
  margin: 0;
  padding: 0;
}

.header {
  height: 100px;
  background-color: red;
}

.content {
  height: 100%;
  background-color: green;
}

JS

function resize() {
  // Get elements and necessary element heights
  var contentDiv = document.getElementById("contentId");
  var headerDiv = document.getElementById("headerId");
  var headerHeight = headerDiv.offsetHeight;

  // Get view height
  var viewportHeight = document.getElementsByTagName('body')[0].clientHeight;

  // Compute the content height - we want to fill the whole remaining area
  // in browser window
  contentDiv.style.height = viewportHeight - headerHeight;
}

window.onload = resize;
window.onresize = resize;

HTML

<body>
  <div class = "header" id = "headerId">Hello</div>
  <div class = "content" id = "contentId"></div>
</body>

Что сработало для меня (с div внутри другого div, и я предполагаю во всех других обстоятельствах), так это установить нижнее заполнение на 100%. То есть добавьте это в свою таблицу стилей / CSS:

padding-bottom: 100%;

100% чего? Если я попробую это сделать, у меня появится огромное пустое пространство, и начнется прокрутка.

mlibby 23.11.2013 19:44

100% размера области просмотра может быть @mlibby. Если вы также установите высоту html и body на 100%, тогда div может перейти на 100%. При наличии только одного div 100% будут относиться к содержимому div. Я не пробовал с вложенным div.

Jess 18.09.2014 05:44

Это означает 100% высоты элемента (добавляется в качестве заполнения элемента), что увеличивает его высоту вдвое. Нет уверенности, что он заполнит страницу, и определенно не ответ на вопрос. Как уже было сказано, он может заполнить больше, чем область просмотра.

Martin 01.07.2015 13:43

padding-bottom: 100% устанавливает высоту + 100% родительского контейнера ширина

Romeno 01.06.2016 20:24

from w3school: Задает отступ внизу в процентах от ширины элемента. w3schools.com/cssref/pr_padding-bottom.asp

mehdi.loa 12.09.2018 06:59

это не решение плохая идея, братан.

Brayan Loayza 10.02.2020 20:23

Оригинальный пост более 3-х лет назад. Думаю, многие люди, которые приходят к этому посту, как и я, ищут решение макета, похожее на приложение, например, фиксированный заголовок, нижний колонтитул и полноразмерный контент, занимающий остальной экран. Если да, то этот пост может помочь, он работает в IE7 + и т. д.

http://blog.stevensanderson.com/2011/10/05/full-height-app-layouts-a-css-trick-to-make-it-easier/

А вот несколько отрывков из этого поста:

@media screen { 
  
  /* start of screen rules. */ 
  
  /* Generic pane rules */
  body { margin: 0 }
  .row, .col { overflow: hidden; position: absolute; }
  .row { left: 0; right: 0; }
  .col { top: 0; bottom: 0; }
  .scroll-x { overflow-x: auto; }
  .scroll-y { overflow-y: auto; }

  .header.row { height: 75px; top: 0; }
  .body.row { top: 75px; bottom: 50px; }
  .footer.row { height: 50px; bottom: 0; }
  
  /* end of screen rules. */ 
}
<div class = "header row" style = "background:yellow;">
    <h2>My header</h2>
</div> 
<div class = "body row scroll-y" style = "background:lightblue;">
    <p>The body</p>
</div> 
<div class = "footer row" style = "background:#e9e9e9;">
    My footer
</div>

Есть только одна проблема: размер верхнего и нижнего колонтитулов не устанавливается автоматически. Который - это настоящая трудность, а который - почему ответ «это невозможно» в настоящее время находится наверху ...

Roman Starkov 04.03.2012 21:16

Мне нужен заголовок размером 55 пикселей и блок div, который заполняет остальную часть высоты документа. это решение!

Matías Cánepa 11.09.2012 04:46

Вы бомба, я так долго пробовал это, и это единственное решение, которое я нашел. Мне нужно было, чтобы мой элемент навигации был высотой 60 пикселей вверху, а остальная часть охватывала 100%, это решило проблему.

Adam Waite 07.01.2013 14:07

Это работает хорошо, за исключением того, что у меня небольшая проблема - если я помещаю элемент с display: table в корпус, кажется, что он переполняет корпус. Таким образом, height: 100% не дает правильной высоты.

GSTAR 08.03.2014 04:38

.col не используется?

slartidan 02.11.2015 15:34

Это решение не полностью реагирует. Если у вас есть навигация со значком переключателя меню в заголовке, который раскрывает меню, содержимое меню будет скрыто и перекрыто основным содержимым: s

Diego Perez 02.10.2018 13:52

Почему не так?

html, body {
    height: 100%;
}

#containerInput {
    background-image: url('../img/edit_bg.jpg');
    height: 40%;
}

#containerControl {
    background-image: url('../img/control_bg.jpg');
    height: 60%;
}

Дать вам высоту html и body (в этом порядке), а затем просто задать высоту вашим элементам?

Работает на меня

Дело в том, что если пользователь использует большой экран для просмотра этой страницы, а высота вашего заголовка фиксирована ровно 100 пикселей, что меньше 40% от текущей высоты, между вашим заголовком и контекстом тела будет большой пробел.

Saorikido 14.05.2015 11:13

Я нашел довольно простое решение, потому что для меня это была проблема дизайна. Я хотел, чтобы остальная часть страницы не была белой под красным колонтитулом. Поэтому я установил красный цвет фона страниц. Цвет фона содержимого станет белым. Если высота содержимого установлена, например. 20em или 50% почти пустая страница не оставит всю страницу красной.

Попробуй это

var sizeFooter = function(){
    $(".webfooter")
        .css("padding-bottom", "0px")
        .css("padding-bottom", $(window).height() - $("body").height())
}
$(window).resize(sizeFooter);

Если вы можете справиться с отсутствием поддержки старых браузеров (то есть MSIE 9 или старше), вы можете сделать это с помощью Модуль гибкой компоновки коробки, который уже является W3C CR. Этот модуль также позволяет использовать другие полезные трюки, такие как изменение порядка содержимого.

К сожалению, MSIE 9 или ниже не поддерживает это, и вы должны использовать префикс поставщика для свойства CSS для всех браузеров, кроме Firefox. Надеюсь, что другие поставщики тоже скоро откажутся от префикса.

Другой вариант - Макет сетки CSS, но он имеет еще меньшую поддержку в стабильных версиях браузеров. На практике это поддерживает только MSIE 10.

Обновить год 2020: все современные браузеры поддерживают как display: flex, так и display: grid. Единственное, чего не хватает, - это поддержка subgrid, которая поддерживается только Firefox. Обратите внимание, что MSIE не поддерживает ни то, ни другое в спецификации, но если вы хотите добавить специальные хаки CSS для MSIE, его можно заставить работать. Я бы посоветовал просто игнорировать MSIE, потому что даже Microsoft говорит, что его больше не следует использовать. Microsoft Edge отлично поддерживает эти функции.

Вместо использования таблиц в разметке вы можете использовать таблицы CSS.

Разметка

<body>    
    <div>hello </div>
    <div>there</div>
</body>

(Соответствующий) CSS

body
{
    display:table;
    width:100%;
}
div
{
    display:table-row;
}
div+ div
{
    height:100%;  
}

FIDDLE1 и FIDDLE2

Некоторые преимущества этого метода:

1) Меньше разметки

2) Разметка более семантическая, чем таблицы, потому что это не табличные данные.

3) Поддержка браузером отлично: IE8 +, все современные браузеры и мобильные устройства (могу ли я использовать)


Just for completeness, here are the equivalent Html elements to css properties for the Модель таблицы CSS
table    { display: table }
tr       { display: table-row }
thead    { display: table-header-group }
tbody    { display: table-row-group }
tfoot    { display: table-footer-group }
col      { display: table-column }
colgroup { display: table-column-group }
td, th   { display: table-cell }
caption  { display: table-caption } 

меня просто указали на техника таблиц css. Оказывается, ответ уже был в этом вопросе. Это лучшее решение в; чистый, элегантный и с использованием именно того инструмента, в котором он был предназначен. Таблицы CSS

Ian Boyd 11.08.2013 02:27

Код скрипки здесь не совсем соответствует ответу. Добавление html, body { height: 100%, width: 100% } показалось мне критически важным в моих тестах.

mlibby 23.11.2013 20:14

Раздражающие функции таблиц CSS точно такие же, как и у обычных таблиц: если содержимое слишком велико, они расширяют ячейку до нужного размера. Это означает, что вам все равно может потребоваться ограничить размер (max-height) или установить высоту из кода, если страница динамическая. Я очень скучаю по сеткам Silverlight! :(

Gone Coding 24.02.2014 21:32

Вы всегда можете добавить абсолютно позиционированный контейнер внутри элемента строки таблицы, а затем установить его ширину и высоту на 100%. Не забудьте также установить относительную позицию в элементе table-row.

Mike Mellor 13.05.2016 19:40

@MikeMellor не работает в IE11, хотя, поскольку он, кажется, игнорирует позиционирование relative на элементе table-row, принимает высоту первого восходящего элемента, который не является элементом таблицы.

dwelle 30.08.2016 19:32

более сложное аналогичное решение: stackoverflow.com/questions/21222663/…

user1742529 18.04.2018 17:06

Это решение не полностью реагирует: я пробую его с заголовком, который имеет панель навигации, и если вы нажмете значок переключателя меню, поведение будет неожиданным, оно не заставит контент перемещаться вниз вместе с меню.

Diego Perez 02.10.2018 14:11

Фактически вы можете использовать display: table для разделения области на два элемента (заголовок и содержимое), где заголовок может различаться по высоте, а содержимое заполняет оставшееся пространство. Это работает со всей страницей, а также когда область является просто содержимым другого элемента, позиционированного с position, установленным на relative, absolute или fixed. Он будет работать, пока родительский элемент имеет ненулевую высоту.

Посмотри на эту скрипку, а также код ниже:

CSS:

body, html {
    height: 100%;
    margin: 0;
    padding: 0;
}

p {
    margin: 0;
    padding: 0;
}

.additional-padding {
    height: 50px;
    background-color: #DE9;
}

.as-table {
    display: table;
    height: 100%;
    width: 100%;
}

.as-table-row {
    display: table-row;
    height: 100%;
}

#content {
    width: 100%;
    height: 100%;
    background-color: #33DD44;
}

HTML:

<div class = "as-table">
    <div id = "header">
        <p>This header can vary in height, it also doesn't have to be displayed as table-row. It will simply take the necessary space and the rest below will be taken by the second div which is displayed as table-row. Now adding some copy to artificially expand the header.</p>
        <div class = "additional-padding"></div>
    </div>
    <div class = "as-table-row">
        <div id = "content">
            <p>This is the actual content that takes the rest of the available space.</p>
        </div>
    </div>
</div>

Хороший ответ, за который я проголосовал, но, к сожалению, он не работает с IE8, который еще будет существовать еще долгое время.

Vincent McNabb 09.07.2013 10:24

Такие приложения, как Gmail, используют Javascript для изменения размера, что в любом случае является лучшим решением, чем CSS.

Vincent McNabb 10.07.2013 01:31

Я думаю, они используют Javascript, потому что нет другого хорошего кроссбраузерного решения CSS, а не потому, что оно лучше.

Greg 10.07.2013 01:37

@VincentMcNabb Работает в IE8 w3schools.com/cssref/pr_class_display.asp. Просто требуется объявление! DOCTYPE. Никогда даже не знал о табличном значении для атрибута отображения. Классный раствор. +1

Govind Rai 25.09.2016 08:45

Только CSS подход (если высота известна / фиксирована)

Если вы хотите, чтобы средний элемент занимал всю страницу по вертикали, вы можете использовать calc(), введенный в CSS3.

Предполагая, что у нас есть элементы фиксированная высотаheader и footer, и мы хотим, чтобы тег section занимал всю доступную высоту по вертикали ...

Демо

Предполагаемая разметка и ваш CSS должен быть

html,
body {
  height: 100%;
}

header {
  height: 100px;
  background: grey;
}

section {
  height: calc(100% - (100px + 150px));
  /* Adding 100px of header and 150px of footer */
  background: tomato;
}

footer {
  height: 150px;
  background-color: blue;
}
<header>100px</header>
<section>Expand me for remaining space</section>
<footer>150px</footer>

Итак, здесь я складываю высоту элементов, а затем вычитаю из 100% с помощью функции calc().

Просто убедитесь, что вы используете height: 100%; для родительских элементов.

OP сказал, что заголовок может быть произвольной высоты. Так что, если вы не знаете заранее высоту, вы не сможете использовать calc :(

Danield 28.04.2014 12:20

@Danield Вот почему я упомянул фиксированная высота :)

Mr. Alien 28.04.2014 14:52

Это решение, которое сработало для меня, и не потребовало от меня изменения дизайна моих существующих страниц вокруг флексбоксов. Если вы используете LESS, то есть Bootstrap, обязательно прочтите сообщение coderwall о том, как избежать функции calc (), чтобы LESS ее не обрабатывал.

jlyonsmith 01.08.2015 03:48

Оп сказал: «Это может быть произвольная высота». Произвольные средства, выбранные дизайнером, фиксированные таким образом. Это решение, безусловно, лучшее.

jck 25.04.2018 19:09
Ответ принят как подходящий

Обновление 2015 г .: подход flexbox

Есть два других ответа, в которых кратко упоминается Flexbox; однако это было более двух лет назад, и они не приводят никаких примеров. Спецификация для flexbox определенно определена.

Note: Though CSS Flexible Boxes Layout specification is at the Candidate Recommendation stage, not all browsers have implemented it. WebKit implementation must be prefixed with -webkit-; Internet Explorer implements an old version of the spec, prefixed with -ms-; Opera 12.10 implements the latest version of the spec, unprefixed. See the compatibility table on each property for an up-to-date compatibility status.

(taken from https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Flexible_boxes)

Все основные браузеры и IE11 + поддерживают Flexbox. Для IE 10 и старше вы можете использовать прокладку FlexieJS.

Чтобы проверить текущую поддержку, вы также можете увидеть здесь: http://caniuse.com/#feat=flexbox

Рабочий пример

С помощью flexbox вы можете легко переключаться между любыми строками или столбцами, имеющими фиксированные размеры, размеры содержимого или размеры оставшегося пространства. В моем примере я установил привязку заголовка к его содержимому (в соответствии с вопросом OP), я добавил нижний колонтитул, чтобы показать, как добавить область фиксированной высоты, а затем установил область содержимого, чтобы заполнить оставшееся пространство.

html,
body {
  height: 100%;
  margin: 0;
}

.box {
  display: flex;
  flex-flow: column;
  height: 100%;
}

.box .row {
  border: 1px dotted grey;
}

.box .row.header {
  flex: 0 1 auto;
  /* The above is shorthand for:
  flex-grow: 0,
  flex-shrink: 1,
  flex-basis: auto
  */
}

.box .row.content {
  flex: 1 1 auto;
}

.box .row.footer {
  flex: 0 1 40px;
}
<!-- Obviously, you could use HTML5 tags like `header`, `footer` and `section` -->

<div class = "box">
  <div class = "row header">
    <p><b>header</b>
      <br />
      <br />(sized to content)</p>
  </div>
  <div class = "row content">
    <p>
      <b>content</b>
      (fills remaining space)
    </p>
  </div>
  <div class = "row footer">
    <p><b>footer</b> (fixed height)</p>
  </div>
</div>

В приведенном выше CSS свойство сгибать сокращает свойства гибкий рост, гибко-усадочный и гибкая основа, чтобы установить гибкость элементов гибкости. В Mozilla есть хорошее знакомство с моделью гибких ящиков.

Почему атрибут flex: 0 1 30px; в box .row переопределяется в каждом div?

Erdal G. 15.11.2015 12:36

Вот поддержка браузером flexbox - приятно видеть весь этот зеленый цвет - caniuse.com/#feat=flexbox

Brian Burns 10.05.2016 21:40

Ссылка на Flexie.js мертва. Вот проект github github.com/doctyper/flexie

ses3ion 10.06.2016 13:49

@ ses3ion Я обновил гибкую ссылку, спасибо за указатель!

Pebbl 24.06.2016 11:45

Определенно это очень хороший подход, и он почти работает;) Есть небольшая проблема, когда содержимое div.content превышает исходную высоту сгибания. В текущей реализации нижний колонтитул будет сдвинут ниже, и разработчики этого не ожидают;) Так что я сделал очень простое исправление. jsfiddle.net/przemcio/xLhLuzf9/3 Я добавил дополнительную гибкость для прокрутки контейнера и переполнения.

przemcio 14.07.2016 00:55

@przemcio хороший момент, но я не думаю, что наличие прокручиваемого контента - это то, чего ожидает каждый разработчик;) - вам нужно только добавить overflow-y: auto к .row.content, чтобы достичь того, что вам нужно.

Pebbl 01.10.2016 14:51

@ bburns.km все зеленое - это хорошо. Даже со всеми возможными префиксами flex часто не работает в старых мобильных браузерах, таких как Android <4.4. Flex - это здорово, но только если вам повезет, и вы не поддерживаете все браузеры.

Atomosk 09.03.2017 05:33

Возможно ли без 100% высоты на html и body?

Stewart 01.06.2017 15:39

не работает в Safari 10! так что помните об использовании этого подхода

Kuba Šimonovský 20.02.2018 15:04

@ KubaŠimonovský, вам нужно будет предоставить больше информации, чем "не работает". При загрузке приведенного выше примера в Safari 10 (Mac OS X Yosemite) все работает, как ожидалось (afaics). Однако flexbox - это большая спецификация, поэтому, возможно, что-то не так поддерживается, как другие браузеры.

Pebbl 21.02.2018 11:47

@Pebbl, хорошо ... У меня yosemite 10.10, но по какой-то причине у меня есть Safari 8 .. Я понятия не имею, как это возможно, потому что я думал, что у меня есть Safari 10 .. так что мои извинения .. В любом случае, у меня были проблемы с flex-direction: column и flex: 1 для дочернего элемента в safari 10. потому что дочерний элемент не заполнил оставшееся пространство родительского элемента.

Kuba Šimonovský 21.02.2018 12:24

Могу ли я использовать свойство flex для элемента body? Есть ли причина, почему нет? Почему мы должны использовать flex:1 0 auto; или flex:1 1 auto;, если мы можем просто использовать flex-grow: 1 или flex-grow: 0`?

Ben Carp 19.03.2018 14:31

Кажется, что по большей части работает, но (по крайней мере, в Chrome) высота нижнего колонтитула не меняется независимо от того, что вы установили высоту .row.footer.

Jason Polites 27.08.2018 08:57

@JasonPolites - высота нижнего колонтитула изменится на то, что вы установили, если на нем есть место, если страница заполнена контентом, она рухнет. Если вы хотите, чтобы нижний колонтитул не сворачивался, установите flex-shrink на 0, а не на 1.

Pebbl 05.09.2018 02:05

@Pebble на самом деле я хочу наоборот. Я хочу, чтобы нижний колонтитул был меньше, даже если содержимое в основном пустое. Например. установка высоты нижнего колонтитула в вышеупомянутом решении на 10 пикселей не делает его 10 пикселей независимо от содержимого

Jason Polites 06.09.2018 03:07

@JasonPolites - я считаю, что вы столкнулись с другой проблемой (не связанной с flexbox). Скорее всего, вы пытаетесь установить нижний колонтитул меньше, чем высота его собственного содержимого. Нижний колонтитул выше содержит теги <p>, которые по умолчанию имеют дополнительные поля, которые определенно выталкивают больше, чем 10px. Если вы удалите поля или теги <p>, вы обнаружите, что можете уменьшить высоту нижнего колонтитула. Чтобы перейти на 10px, вам, возможно, придется уменьшить размер шрифта или высоту строки; или универсальное крепление для элементов обрезки overflow: hidden на вяз .footer.

Pebbl 07.09.2018 02:18

Смущает ваша точка зрения @ KirbyL.Wallace, display: flex - иначе известный как flexbox - это чистый CSS. Есть еще display: grid, тоже чистый CSS. FlexGrid, однако, представляет собой компонентную систему, которая была построена с использованием flexbox и не имеет ничего общего с приведенным выше ответом.

Pebbl 15.10.2019 02:34

Ого! Абсолютно прав. Когда это произошло? ха-ха, удалил мой комментарий. Это будет вводить в заблуждение. Спасибо, @Pebbl ...

Kirby L. Wallace 15.10.2019 16:28

@Pebbi Просто добавлю морали моей разочаровывающей, но, наконец, успешной истории: ваш ответ не сработает, если вы настроите body как гибкий контейнер. Гибкий контейнер должен быть элементом внутри body.

terminus.technicus 27.01.2020 04:11

Я предполагаю, что это может зависеть от браузера, который вы тестировали с помощью @ terminus.technicus (или, возможно, от конкретной подспособности, которая не работает). Но все мои тесты показывают, что использование вышеуказанного для элемента body должно работать нормально. Главное предостережение, которое вам нужно применить - и это просто природа самих элементов html / body - это сначала принудительно установить их на полную высоту с помощью html, body { height: 100%; margin: 0; padding: 0; }. Затем вы можете применить к телу обработку внешней гибкости. Тем не менее, этот ответ уже устарел. В наши дни есть много других типов гибкого / сеточного макета.

Pebbl 11.03.2020 02:00

Я копирую / вставляю точный код HTML и CSS в stackblitz, но он не получает желаемого поведения. Кто-нибудь знает почему? stackblitz.com/edit/angular-ivy-9xz7r8

kebab-case 09.06.2020 02:43

Я не работал с angular специально @ Minyc510, но большинство компонентных систем локально используют свои CSS. Это означает, что селекторы, которые пытаются выбрать элементы за пределами области действия компонента, такие как html, body в этом случае, либо игнорируются, либо не применяются должным образом. Я бы посоветовал изучить, как ориентироваться за пределами вашего компонента. Или, что еще лучше, разделите CSS между тем, что влияет на компонент, и тем, что контролирует размер / макет страницы (например, body / html). Затем вы можете применить css страницы на более высоком уровне, не нарушая области видимости.

Pebbl 11.06.2020 22:36

@ Minyc510 некоторые CSS, примененные к родительским элементам, могут быть причиной отсутствия желаемого поведения, .outer{display:flex}, .takes-avail-space{flex:1 1 auto} всегда работает.

Aditya Patnaik 09.09.2020 20:24

Это может быть сделано только с помощью 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.

Ничего себе, никогда раньше не слышал об устройствах vh и vw. Более подробная информация: snook.ca/archives/html_and_css/vm-vh-units

Steve Bennett 01.04.2015 14:30

К сожалению, это не поддерживает IE8 :(

Scott 07.01.2016 00:01

Я пробовал этот подход, но height: 100% на #content заставил его высоту соответствовать #page, игнорируя высоту #tdcontent в целом. При большом количестве содержимого полоса прокрутки выходит за пределы нижней части страницы.

Brandon 08.07.2016 16:44

Ни одно из опубликованных решений не работает, когда вам нужно прокручивать нижний div, когда содержимое слишком высокое. Вот решение, которое работает в этом случае:

.table {
  display: table;
}

.table-row {
  display: table-row;
}

.table-cell {
  display: table-cell;
}

.container {
  width: 400px;
  height: 300px;
}

.header {
  background: cyan;
}

.body {
  background: yellow;
  height: 100%;
}

.body-content-outer-wrapper {
  height: 100%;
}

.body-content-inner-wrapper {
  height: 100%;
  position: relative;
  overflow: auto;
}

.body-content {
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
}
<div class = "table container">
  <div class = "table-row header">
    <div>This is the header whose height is unknown</div>
    <div>This is the header whose height is unknown</div>
    <div>This is the header whose height is unknown</div>
  </div>
  <div class = "table-row body">
    <div class = "table-cell body-content-outer-wrapper">
      <div class = "body-content-inner-wrapper">
        <div class = "body-content">
          <div>This is the scrollable content whose height is unknown</div>
          <div>This is the scrollable content whose height is unknown</div>
          <div>This is the scrollable content whose height is unknown</div>
          <div>This is the scrollable content whose height is unknown</div>
          <div>This is the scrollable content whose height is unknown</div>
          <div>This is the scrollable content whose height is unknown</div>
          <div>This is the scrollable content whose height is unknown</div>
          <div>This is the scrollable content whose height is unknown</div>
          <div>This is the scrollable content whose height is unknown</div>
          <div>This is the scrollable content whose height is unknown</div>
          <div>This is the scrollable content whose height is unknown</div>
          <div>This is the scrollable content whose height is unknown</div>
          <div>This is the scrollable content whose height is unknown</div>
          <div>This is the scrollable content whose height is unknown</div>
          <div>This is the scrollable content whose height is unknown</div>
          <div>This is the scrollable content whose height is unknown</div>
          <div>This is the scrollable content whose height is unknown</div>
          <div>This is the scrollable content whose height is unknown</div>
        </div>
      </div>
    </div>
  </div>
</div>

Первоисточник: Заполнение оставшейся высоты контейнера при обработке переполнения в CSS

Предварительный просмотр JSFiddle в реальном времени

Спасибо!!! Я попробовал все ответы, не относящиеся к таблицам и Flexbox, и это единственный ответ, который работал на 100% правильно. Один вопрос: в исходном коде есть только body-content-wrapper, и, похоже, все работает нормально без двойной оболочки (без каких-либо table-cell). Есть ли в этом проблема?

Brandon 08.07.2016 17:26

@BrandonMintern Если у вас нет ячеек таблиц, это не работает в IE8 и IE9. (См. Комментарий в исходной статье.)

John Kurlak 10.07.2016 00:50

Да, ячейки также требуются в IE10. К сожалению, в IE10 и ниже высота .body оказывается такой же, как и в .container. Вертикальная полоса прокрутки по-прежнему находится на своем месте, но .container в конечном итоге растягивается больше, чем мы хотели. В полноэкранном режиме нижняя часть .body выходит за пределы нижней части экрана.

Brandon 12.07.2016 01:16

Спасибо, @JohnKurlak. Это единственное решение, которое сработало в моей ситуации (способ flexbox был заблокирован ошибочным поведением в конкретной версии Chrome, используемой моим клиентом)

Maksym Demidas 24.02.2020 16:10

Святой ****! Я так долго искал этот ответ! Большое спасибо. Flexbox здесь не работал, но ячейки таблиц действительно работали. Удивительный.

alistair 08.03.2020 13:24

Простое решение с использованием flexbox:

html,
body {
  height: 100%;
}

body {
  display: flex;
  flex-direction: column;
}

.content {
  flex-grow: 1;
}
<body>
  <div>header</div>
  <div class = "content"></div>
</body>

Образец кода

Альтернативное решение, с центром в div содержимого

Это, безусловно, лучший ответ. Работает как шарм для домашних страниц hero-img или как комбинация hero-img с вашей навигационной панелью

noobcoderiam 23.05.2019 21:27
jsfiddle.net/31ng75du/5 Tested with Chrome, FF, Edge, Vivaldi
user2360831 04.01.2020 19:39

CSS3 простой способ

height: calc(100% - 10px); // 10px is height of your first div...

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

Это не сработает, если вы не знаете высоту других элементов (например, если они содержат переменное количество дочерних элементов).

Ege Ersoz 19.03.2019 20:53

вы также можете использовать 100vh, любой, кто делает это: не забудьте поставить пробелы между минусом и элементами

htafoya 27.03.2019 06:59

Лучше использовать 100vh, а затем вычесть заголовок, поэтому calc(100vh - 10px).

Martavis P. 22.08.2020 09:16

Сейчас есть масса ответов, но я обнаружил, что height: 100vh; используется для работы с элементом div, который должен заполнить все доступное вертикальное пространство.

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

div {
    height: 100vh;
}

Поддерживает IE9 и выше: нажмите, чтобы увидеть ссылку

Но 100vh звучит как вся высота, а не остальная высота. Что делать, если у вас есть заголовок, и вы хотите заполнить остальное

Epirocks 13.03.2018 13:05

Disclaimer: The accepted answer gives the idea of the solution, but I'm finding it a bit bloated with an unnecessary wrapper and css rules. Below is a solution with very few css rules.

HTML 5

<body>
    <header>Header with an arbitrary height</header>
    <main>
        This container will grow so as to take the remaining height
    </main>
</body>

CSS

body {
  display: flex;
  flex-direction: column;
  min-height: 100vh;       /* body takes whole viewport's height */
}

main {
  flex: 1;                 /* this will make the container take the free space */
}

В приведенном выше решении используются единицы просмотра и Flexbox, следовательно, это IE10 +, при условии, что вы используете старый синтаксис для IE10.

Codepen для игры: ссылка на код

Или этот, для тех, кому нужен основной контейнер с возможностью прокрутки в случае переполнения содержимого: ссылка на код

главная {высота: 10 пикселей; гибкость: 1; переполнение: авто}

Naeem Baghi 01.01.2018 16:22

Потратив часы и протестировав несколько подходов, этот оказался лучшим! Это лаконично, просто и умно.

marciowb 07.09.2019 20:33

Использовал: height: calc(100vh - 110px);

код:

  
.header { height: 60px; top: 0; background-color: green}
.body {
    height: calc(100vh - 110px); /*50+60*/
    background-color: gray;
}
.footer { height: 50px; bottom: 0; }
  
<div class = "header">
    <h2>My header</h2>
</div> 
<div class = "body">
    <p>The body</p>
</div> 
<div class = "footer">
    My footer
</div>

Это, безусловно, самое простое из всех решений, перечисленных на этой странице.

Miles M. 12.02.2021 18:01

Отталкиваясь от идеи мистера Чужого ...

Это кажется более чистым решением, чем популярный гибкий блок для браузеров с поддержкой CSS3.

Просто используйте min-height (вместо height) с calc () для блока содержимого.

Calc () начинается со 100% и вычитает высоту верхних и нижних колонтитулов (необходимо включать значения отступов)

Использование «min-height» вместо «height» особенно полезно, так как оно может работать с отображаемым содержимым javascript и фреймворками JS, такими как Angular2. В противном случае при вычислении нижний колонтитул не будет перемещаться в нижнюю часть страницы после того, как визуализированный контент javascript станет видимым.

Вот простой пример верхнего и нижнего колонтитула с использованием высоты 50 пикселей и отступа 20 пикселей для обоих.

HTML:

<body>
    <header></header>
    <div class = "content"></div>
    <footer></footer>
</body>

CSS:

.content {
    min-height: calc(100% - (50px + 20px + 20px + 50px + 20px + 20px));
}

Конечно, математику можно упростить, но вы поняли ...

У меня была такая же проблема, но я не мог заставить работать решение с гибкими боксами, указанным выше. Итак, я создал свой собственный шаблон, который включает:

  • заголовок с элементом фиксированного размера
  • нижний колонтитул
  • боковая полоса с полосой прокрутки, занимающая оставшуюся высоту
  • содержание

Я использовал флексбоксы, но более простым способом, используя только свойства дисплей: гибкий и flex-direction: строка | столбец:

Я использую angular и хочу, чтобы размеры моих компонентов составляли 100% от их родительского элемента.

Главное - установить размер (в процентах) для всех родителей, чтобы ограничить их размер. В следующем примере высота myapp составляет 100% области просмотра.

Главный компонент занимает 90% области просмотра, потому что верхний и нижний колонтитулы занимают 5%.

Я разместил свой шаблон здесь: https://jsfiddle.net/abreneliere/mrjh6y2e/3

       body{
        margin: 0;
        color: white;
        height: 100%;
    }
    div#myapp
    {
        display: flex;
        flex-direction: column;
        background-color: red; /* <-- painful color for your eyes ! */
        height: 100%; /* <-- if you remove this line, myapp has no limited height */
    }
    div#main /* parent div for sidebar and content */
    {
        display: flex;
        width: 100%;
        height: 90%; 
    }
    div#header {
        background-color: #333;
        height: 5%;
    }
    div#footer {
        background-color: #222;
        height: 5%;
    }
    div#sidebar {
        background-color: #666;
        width: 20%;
        overflow-y: auto;
     }
    div#content {
        background-color: #888;
        width: 80%;
        overflow-y: auto;
    }
    div.fized_size_element {
        background-color: #AAA;
        display: block;
        width: 100px;
        height: 50px;
        margin: 5px;
    }

HTML:

<body>
<div id = "myapp">
    <div id = "header">
        HEADER
        <div class = "fized_size_element"></div>

    </div>
    <div id = "main">
        <div id = "sidebar">
            SIDEBAR
            <div class = "fized_size_element"></div>
            <div class = "fized_size_element"></div>
            <div class = "fized_size_element"></div>
            <div class = "fized_size_element"></div>
            <div class = "fized_size_element"></div>
            <div class = "fized_size_element"></div>
            <div class = "fized_size_element"></div>
            <div class = "fized_size_element"></div>
        </div>
        <div id = "content">
            CONTENT
        </div>
    </div>
    <div id = "footer">
        FOOTER
    </div>
</div>
</body>

Это динамическое вычисление пространства экрана напоминания, лучше с использованием Javascript.

Вы можете использовать технологию CSS-IN-JS, как показано ниже в lib:

https://github.com/cssobj/cssobj

ДЕМО: https://cssobj.github.io/cssobj-demo/

Для мобильного приложения я использую только VH и VW

<div class = "container">
  <div class = "title">Title</div>
  <div class = "content">Content</div>
  <div class = "footer">Footer</div>
</div>

.container {
  width: 100vw;
  height: 100vh;
  font-size: 5vh;
}

.title {
  height: 20vh;
  background-color: red;
}

.content {
  height: 60vh;
  background: blue;
}

.footer {
  height: 20vh;
  background: green;
}

Демо - https://jsfiddle.net/u763ck92/

Это неправильное решение. vh несовместим с мобильными браузерами. Подробнее см. Здесь: stackoverflow.com/questions/37112218/…

HarshMarshmallow 17.04.2017 20:59

Как насчет того, чтобы вы просто использовали vh, что означает view height в CSS ...

Посмотрите на фрагмент кода, который я создал для вас ниже, и запустите его:

body {
  padding: 0;
  margin: 0;
}

.full-height {
  width: 100px;
  height: 100vh;
  background: red;
}
<div class = "full-height">
</div>

Также посмотрите на изображение ниже, которое я создал для вас:

Make a div fill the height of the remaining screen space

Это хорошо, только если вы хотите, чтобы div занимал всю высоту окна. Теперь поместите над ним заголовок div с неизвестной высотой.

LarryBud 09.03.2018 04:53

@LarryBud, вы правы, это делает обертку div, поэтому все должно быть внутри этого div ...

Alireza 09.03.2018 05:42

Решение CSS Grid

Просто определяем body с помощью display:grid и grid-template-rows с использованием auto и свойства значения fr.

* {
  margin: 0;
  padding: 0;
}

html {
  height: 100%;
}

body {
  min-height: 100%;
  display: grid;
  grid-template-rows: auto 1fr auto;
}

header {
  padding: 1em;
  background: pink;
}

main {
  padding: 1em;
  background: lightblue;
}

footer {
  padding: 2em;
  background: lightgreen;
}

main:hover {
  height: 2000px;
  /* demos expansion of center element */
}
<header>HEADER</header>
<main>MAIN</main>
<footer>FOOTER</footer>

Полное руководство по сеткам @ CSS-Tricks.com

 style = "height:100vh"

решил проблему для меня. В моем случае я применил это к необходимому div

В Bootstrap:

Стили CSS:

html, body {
    height: 100%;
}

1) Просто заполните высоту оставшегося места на экране:

<body class = "d-flex flex-column">
  <div class = "d-flex flex-column flex-grow-1>

    <header>Header</header>
    <div>Content</div>
    <footer class = "mt-auto">Footer</footer>

  </div>
</body>

![


2) заполните высоту оставшегося пространства экрана и выровняйте содержимое по середине родительского элемента:

<body class = "d-flex flex-column">
  <div class = "d-flex flex-column flex-grow-1">

    <header>Header</header>
    <div class = "d-flex flex-column flex-grow-1 justify-content-center">Content</div>
    <footer class = "mt-auto">Footer</footer>

  </div>
</body>

![

Это моя собственная минимальная версия решения Pebbl. Потребовалось много времени, чтобы найти способ заставить его работать в IE11. (Также протестировано в Chrome, Firefox, Edge и Safari.)

html {
  height: 100%;
}

body {
  height: 100%;
  margin: 0;
}

section {
  display: flex;
  flex-direction: column;
  height: 100%;
}

div:first-child {
  background: gold;
}

div:last-child {
  background: plum;
  flex-grow: 1;
}
<body>
  <section>
    <div>FIT</div>
    <div>GROW</div>
  </section>
</body>

Еще одно решение с использованием CSS-сетка

Определить сетку

.root {
  display: grid;
  grid-template-rows: minmax(60px, auto) minmax(0, 100%);
}

Первая строка (заголовок): минимальная высота может быть установлена, а максимальная высота будет зависеть от содержимого. Вторая строка (содержимое) будет пытаться уместить свободное пространство, оставшееся после заголовка.

Преимущество этого подхода в том, что контент можно прокручивать независимо от заголовка, поэтому заголовок всегда находится вверху страницы.

body, html {
  margin: 0;
  height: 100%;
}

.root {
  display: grid;
  grid-template-rows: minmax(60px, auto) minmax(0, 100%);
  height: 100%;
}

.header {
  background-color: lightblue;
}

button {
  background-color: darkslateblue;
  color: white;
  padding: 10px 50px;
  margin: 10px 30px;
  border-radius: 15px;
  border: none;
}

.content {
  background-color: antiquewhite;
  overflow: auto;
}

.block {
  width: calc(100% - 20px);
  height: 120px;
  border: solid aquamarine;
  margin: 10px;
}
<div class = "root">
  <div class = "header">
    <button>click</button>
    <button>click</button>
    <button>click</button>
    <button>click</button>
    <button>click</button>
  </div>
  <div class = "content">
    <div class = "block"></div>
    <div class = "block"></div>
    <div class = "block"></div>
    <div class = "block"></div>
    <div class = "block"></div>
    <div class = "block"></div>
    <div class = "block"></div>
    <div class = "block"></div>
</div>
  <div class = "footer"></div>
</div>

Все, что вам нужно сделать, это просто установить высоту, чтобы растянуть или заполнить так

.divName {
    height: stretch
}

Вот ответ с использованием сеток.

.the-container-div {
  display: grid;
  grid-template-columns: 1fr;
  grid-template-rows: auto min-content;
  height: 100vh;
}
.view-to-remain-small {
  grid-row: 2;
}

.view-to-be-stretched {
  grid-row: 1
}

Другие вопросы по теме