100% минимальная высота CSS макета


164

Каков наилучший способ сделать элемент с минимальной высотой 100% в широком диапазоне браузеров?

В частности, если у вас есть макет с headerи footerфиксированной height,

как сделать так, чтобы средняя часть содержимого заполняла 100%пространство между footerфиксированными снизу?


24
Вы могли бы рассмотреть min-height: 100vh;. Это устанавливает высоту , равную или больше по размеру экрана, vh: vertical height. Для получения дополнительной информации: w3schools.com/cssref/css_units.asp .
— Станислав

2
Подобно тому , как разъяснение, vhозначает , viewport heightи поэтому вы можете также использовать vwдля viewport widthи vminдля какой размер является наименьшим, viewport minimum.
— iopener

1
Это решение даст нежелательные результаты на Chrome для Android (придется проверить в других мобильных браузерах, таких как Safari), потому что 100vh не будет совпадать со 100%. Фактически высота 100% соответствует высоте экрана минус адресная строка в верхней части экрана, а 100vh соответствует высоте экрана без адресной строки. Таким образом, использование 100vh не будет работать на Chrome для Android. Нижний колонтитул будет ниже сгиба на высоту, соответствующую высоте адресной строки браузера.
— sboisse

Вы можете достичь этого с Flexbox. Смотрите пример .
— Реджи

1
Теперь дни «100vh» работает как шарм
— Awais

Ответы:


114

Я использую следующее: CSS Layout - 100% высота

Минимальная высота

Элемент #container этой страницы имеет минимальную высоту 100%. Таким образом, если контент требует больше высоты, чем обеспечивает область просмотра, высота #content заставляет #container также увеличиваться. Затем возможные столбцы в #content можно визуализировать с помощью фонового изображения на #container; div не являются ячейками таблицы, и вам не нужны (или не нужны) физические элементы для создания такого визуального эффекта. Если вы еще не убеждены; думать о шатких линиях и градиентах вместо прямых линий и простых цветовых схем.

Относительное позиционирование

Поскольку #container имеет относительную позицию, #footer всегда будет оставаться внизу; поскольку упомянутая выше минимальная высота не препятствует масштабированию #container, это будет работать, даже если (или, скорее, особенно когда) #content заставляет #container становиться длиннее.

Перетяжка дно

Так как он больше не находится в нормальном потоке, padding-bottom элемента #content теперь предоставляет пространство для абсолютного #footer. Этот отступ включен в высоту прокрутки по умолчанию, так что нижний колонтитул никогда не будет перекрывать вышеуказанное содержимое.

Немного измените размер текста или измените размер окна браузера, чтобы протестировать этот макет.

html,body {
    margin:0;
    padding:0;
    height:100%; /* needed for container min-height */
    background:gray;

    font-family:arial,sans-serif;
    font-size:small;
    color:#666;
}

h1 { 
    font:1.5em georgia,serif; 
    margin:0.5em 0;
}

h2 {
    font:1.25em georgia,serif; 
    margin:0 0 0.5em;
}
    h1, h2, a {
        color:orange;
    }

p { 
    line-height:1.5; 
    margin:0 0 1em;
}

div#container {
    position:relative; /* needed for footer positioning*/
    margin:0 auto; /* center, not in IE5 */
    width:750px;
    background:#f0f0f0;

    height:auto !important; /* real browsers */
    height:100%; /* IE6: treaded as min-height*/

    min-height:100%; /* real browsers */
}

div#header {
    padding:1em;
    background:#ddd url("../csslayout.gif") 98% 10px no-repeat;
    border-bottom:6px double gray;
}
    div#header p {
        font-style:italic;
        font-size:1.1em;
        margin:0;
    }

div#content {
    padding:1em 1em 5em; /* bottom padding for footer */
}
    div#content p {
        text-align:justify;
        padding:0 1em;
    }

div#footer {
    position:absolute;
    width:100%;
    bottom:0; /* stick to bottom */
    background:#ddd;
    border-top:6px double gray;
}
div#footer p {
    padding:1em;
    margin:0;
}

У меня отлично работает.


В этом примере в IE7 пытались увеличить размер шрифта (Ctrl + "+"), и этот разрушенный липкий нижний колонтитул :(
— Виталий

этот, кажется, не работает в IE9 ... он работает в других IE?
— Уильям Ниу

30

Чтобы установить произвольную высоту, заблокированную где-то:

body, html {
  height: 100%;
}
#outerbox {
  width: 100%;
  position: absolute; /* to place it somewhere on the screen */
  top: 130px;         /* free space at top */
  bottom: 0;          /* makes it lock to the bottom */
}
#innerbox {
  width: 100%;
  position: absolute;				
  min-height: 100% !important; /* browser fill */
  height: auto;                /*content fill */
}
<div id="outerbox">
  <div id="innerbox"></div>
</div>


23

Вот еще одно решение, основанное vhили viewpoint height, для деталей, посещение блоков CSS . Он основан на этом решении , которое вместо этого использует flex.

* {
    /* personal preference */
    margin: 0;
    padding: 0;
}
html {
    /* make sure we use up the whole viewport */
    width: 100%;
    min-height: 100vh;
    /* for debugging, a red background lets us see any seams */
    background-color: red;
}
body {
    /* make sure we use the full width but allow for more height */
    width: 100%;
    min-height: 100vh; /* this helps with the sticky footer */
}
main {
    /* for debugging, a blue background lets us see the content */
    background-color: skyblue;
	min-height: calc(100vh - 2.5em); /* this leaves space for the sticky footer */
}
footer {
    /* for debugging, a gray background lets us see the footer */
    background-color: gray;
	min-height:2.5em;
}
<main>
    <p>This is the content. Resize the viewport vertically to see how the footer behaves.</p>
    <p>This is the content.</p>
    <p>This is the content.</p>
    <p>This is the content.</p>
    <p>This is the content.</p>
    <p>This is the content.</p>
    <p>This is the content.</p>
    <p>This is the content.</p>
    <p>This is the content.</p>
    <p>This is the content.</p>
</main>
<footer>
    <p>This is the footer. Resize the viewport horizontally to see how the height behaves when text wraps.</p>
    <p>This is the footer.</p>
</footer>

Единицами измерения являются vw, vh, vmax, vmin. По сути, каждая единица равна 1% от размера области просмотра. Таким образом, при изменении области просмотра браузер вычисляет это значение и корректирует его соответствующим образом.

Вы можете найти больше информации здесь:

В частности:

1vw (viewport width) = 1% of viewport width
1vh (viewport height) = 1% of viewport height
1vmin (viewport minimum) = 1vw or 1vh, whatever is smallest
1vmax (viewport minimum) = 1vw or 1vh, whatever is largest


6

Чтобы min-heightправильно работать с процентами, при этом наследуя родительский узел min-height, нужно было бы установить высоту родительского узла, 1pxи тогда дочерний узел min-heightбудет работать правильно.

Демо-страница


Хорошо, НО, если содержимое div в демо имеет большую высоту, чем окно браузера, фон будет обрезан после прокрутки вниз
— fider

@fider - предоставьте игровую площадку с указанием упомянутой вами проблемы.
— vsync

jsbin.com/nixuf/1/edit прокрутите вниз. Я нашел полезную информацию в этом посте ниже
— fider

6

Чистое CSSрешение ( #content { min-height: 100%; }) будет работать во многих случаях, но не во всех, особенно в IE6 и IE7.

К сожалению, вам нужно прибегнуть к решению JavaScript, чтобы получить желаемое поведение. Это можно сделать, рассчитав нужную высоту для вашего контента <div>и установив ее как свойство CSS в функции:

function resizeContent() {
  var contentDiv = document.getElementById('content');
  var headerDiv = document.getElementById('header');
  // This may need to be done differently on IE than FF, but you get the idea.
  var viewPortHeight = window.innerHeight - headerDiv.clientHeight;
  contentDiv.style.height = 
    Math.max(viewportHeight, contentDiv.clientHeight) + 'px';
}

Вы можете установить эту функцию в качестве обработчика onLoadи onResizeсобытий:

<body onload="resizeContent()" onresize="resizeContent()">
  . . .
</body>

3

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

Подумайте об этом так, если ваш заголовок имеет высоту 50px, а нижний колонтитул имеет высоту 50px, а содержимое просто встраивается в оставшееся пространство, например, 100px, а контейнер страницы составляет 100% от этого значения, его высота будет 200px. Затем, когда вы устанавливаете высоту боковой панели на 100%, она составляет 200 пикселей, хотя она должна плотно прилегать между верхним и нижним колонтитулом. Вместо этого получается 50px + 200px + 50px, поэтому страница теперь имеет 300px, потому что боковые панели установлены на ту же высоту, что и контейнер страницы. Там будет большой пробел в содержании страницы.

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


3

Сначала вы должны создать divс id='footer'после вашего contentdiv, а затем просто сделать это.

Ваш HTML должен выглядеть так:

<html>
    <body>
        <div id="content">
            ...
        </div>
        <div id="footer"></div>
    </body>
</html>

И CSS:

​html, body {
    height: 100%;   
}
#content {
    height: 100%;
}
#footer {
    clear: both;        
}

2

Попробуй это:

body{ height: 100%; }
#content { 
    min-height: 500px;
    height: 100%;
}
#footer {
    height: 100px;
    clear: both !important;
}

divЭлемент ниже DIV контента должен иметь clear:both.


2

Вероятно, самое короткое решение (работает только в современных браузерах)

Этот маленький кусочек CSS делает "the middle content part fill 100% of the space in between with the footer fixed to the bottom":

html, body { height: 100%; }
your_container { min-height: calc(100% - height_of_your_footer); }

единственное требование - иметь нижний колонтитул фиксированной высоты.

Например, для этого макета:

    <html><head></head><body>
      <main> your main content </main>
      </footer> your footer content </footer>
    </body></html>

вам нужен этот CSS:

    html, body { height: 100%; }
    main { min-height: calc(100% - 2em); }
    footer { height: 2em; }


0

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

#content{
        height: auto;
        min-height:350px;
}

0

Как упоминалось в ответе Афшина Мехрабани, вы должны установить высоту body и html на 100%, но чтобы получить нижний колонтитул, рассчитайте высоту оболочки:

#pagewrapper{
/* Firefox */
height: -moz-calc(100% - 100px); /*assume i.e. your header above the wrapper is 80 and the footer bellow is 20*/
/* WebKit */
height: -webkit-calc(100% - 100px);
/* Opera */
height: -o-calc(100% - 100px);
/* Standard */
height: calc(100% - 100px);
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.