Как заставить нижний колонтитул оставаться внизу веб-страницы? - PullRequest
269 голосов
/ 03 сентября 2008

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

Обновление:

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

Ответы [ 24 ]

192 голосов
/ 03 сентября 2008

Чтобы получить липкий нижний колонтитул:

  1. Иметь <div> с class="wrapper" для вашего контента.

  2. Справа до закрытия </div> wrapper места <div class="push"></div>.

  3. Справа после закрытия </div> wrapper размещения <div class="footer"></div>.

* {
    margin: 0;
}
html, body {
    height: 100%;
}
.wrapper {
    min-height: 100%;
    height: auto !important;
    height: 100%;
    margin: 0 auto -142px; /* the bottom margin is the negative value of the footer's height */
}
.footer, .push {
    height: 142px; /* .push must be the same height as .footer */
}
73 голосов
/ 29 сентября 2014

Используйте CSS VH единиц!

Вероятно, самый очевидный и не хакерский способ сделать липкий нижний колонтитул - использовать новые единицы просмотра css .

Возьмем, к примеру, следующую простую разметку:

<header>header goes here</header>
<div class="content">This page has little content</div>
<footer>This is my footer</footer>

Если заголовок имеет высоту 80px, а нижний колонтитул - 40px, то мы можем сделать наш липкий нижний колонтитул с одним единственным правилом для содержимого div:

.content {
    min-height: calc(100vh - 120px);
    /* 80px header + 40px footer = 120px  */
}

Что означает: пусть высота содержимого div будет не менее 100% высоты области просмотра минус объединенная высота верхнего и нижнего колонтитулов.

Вот и все.

* {
    margin:0;
    padding:0;
}
header {
    background: yellow;
    height: 80px;
}
.content {
    min-height: calc(100vh - 120px);
    /* 80px header + 40px footer = 120px  */
    background: pink;
}
footer {
    height: 40px;
    background: aqua;
}
<header>header goes here</header>
<div class="content">This page has little content</div>
<footer>This is my footer</footer>

... и вот как один и тот же код работает с большим количеством контента в div контента:

* {
    margin:0;
    padding:0;
}
header {
    background: yellow;
    height: 80px;
}
.content {
    min-height: calc(100vh - 120px);
    /* 80px header + 40px footer = 120px  */
    background: pink;
}
footer {
    height: 40px;
    background: aqua;
}
<header>header goes here</header>
<div class="content">Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Typi non habent claritatem insitam; est usus legentis in iis qui facit eorum claritatem. Investigationes demonstraverunt lectores legere me lius quod ii legunt saepius. Claritas est etiam processus dynamicus, qui sequitur mutationem consuetudium lectorum. Mirum est notare quam littera gothica, quam nunc putamus parum claram, anteposuerit litterarum formas humanitatis per seacula quarta decima et quinta decima. Eodem modo typi, qui nunc nobis videntur parum clari, fiant sollemnes in futurum.Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Typi non habent claritatem insitam; est usus legentis in iis qui facit eorum claritatem. Investigationes demonstraverunt lectores legere me lius quod ii legunt saepius. Claritas est etiam processus dynamicus, qui sequitur mutationem consuetudium lectorum. Mirum est notare quam littera gothica, quam nunc putamus parum claram, anteposuerit litterarum formas humanitatis per seacula quarta decima et quinta decima. Eodem modo typi, qui nunc nobis videntur parum clari, fiant sollemnes in futurum.
</div>
<footer>
    This is my footer
</footer>

Примечание:

1) Высота заголовка и нижнего колонтитула должна быть известна

2) Старые версии IE (IE8-) и Android (4.4-) не поддерживают единицы просмотра. ( caniuse )

3) Когда-то в webkit возникла проблема с единицами просмотра в рамках правила расчета. Это действительно было исправлено ( см. Здесь ), поэтому здесь нет проблем. Однако, если вы по какой-то причине не хотите использовать calc, вы можете обойти это, используя отрицательные поля и отступы с изменением размера блока -

Примерно так:

* {
    margin:0;padding:0;
}
header {
    background: yellow;
    height: 80px;
    position:relative;
}
.content {
    min-height: 100vh;
    background: pink;
    margin: -80px 0 -40px;
    padding: 80px 0 40px;
    box-sizing:border-box;
}
footer {
    height: 40px;
    background: aqua;
}
<header>header goes here</header>
<div class="content">Lorem ipsum 
</div>
<footer>
    This is my footer
</footer>
46 голосов
/ 08 декабря 2015

Липкий нижний колонтитул с display: flex

Решение на основе липкого нижнего колонтитула Филиппа Уолтона .

Объяснение

Это решение действительно только для :

  • Chrome ≥ 21,0
  • Firefox ≥ 20,0
  • Internet Explorer ≥ 10
  • Safari ≥ 6,1

Он основан на flex отображении , используя свойство flex-grow, которое позволяет элементу расти в высота или width (когда для flow-direction установлено значение column или row соответственно), чтобы занять дополнительное пространство в контейнере.

Мы собираемся использовать также подразделение vh, где 1vh равно , определенное как :

1/100 высоты окна просмотра

Поэтому высота 100vh - это краткий способ указать элементу, чтобы он охватывал всю высоту области просмотра.

Вот как вы бы структурировали свою веб-страницу:

----------- body -----------
----------------------------

---------- footer ----------
----------------------------

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

Поэтому наш макет становится:

----------- body -----------
----------------------------

---------- spacer ----------
                             <- This element must grow in height
----------------------------

---------- footer ----------
----------------------------

Осуществление

body {
    margin: 0;
    display: flex;
    flex-direction: column;
    min-height: 100vh;
}

.spacer {
    flex: 1;
}

/* make it visible for the purposes of demo */
.footer {
    height: 50px;
    background-color: red;
}
<body>
    <div class="content">Hello World!</div>
    <div class="spacer"></div>
    <footer class="footer"></footer>
</body>

Вы можете играть с ним на JSFiddle .

Причуды Сафари

Имейте в виду, что в Safari имеется некорректная реализация свойства flex-shrink , которое позволяет элементам сжиматься больше минимальной высоты, необходимой для отображения содержимого. Чтобы решить эту проблему, вам необходимо явно установить для свойства flex-shrink значение 0, равное .content и footer в приведенном выше примере:

.content { flex-shrink: 0; }
.footer  { flex-shrink: 0; }
30 голосов
/ 03 сентября 2008

Вы можете использовать position: absolute после, чтобы поместить нижний колонтитул внизу страницы, но затем убедитесь, что ваши 2 столбца имеют соответствующий margin-bottom, чтобы нижний колонтитул не перекрывался.

#footer {
    position: absolute;
    bottom: 0px;
    width: 100%;
}
#content, #sidebar { 
    margin-bottom: 5em; 
}
15 голосов
/ 19 февраля 2012

Вот решение с jQuery, которое работает как шарм. Он проверяет, больше ли высота окна, чем высота тела. Если это так, то он меняет верхний колонтитул нижнего колонтитула для компенсации. Протестировано в Firefox, Chrome, Safari и Opera.

$( function () {

    var height_diff = $( window ).height() - $( 'body' ).height();
    if ( height_diff > 0 ) {
        $( '#footer' ).css( 'margin-top', height_diff );
    }

});

Если у вашего нижнего колонтитула уже есть край поля (например, 50 пикселей), вам нужно изменить последнюю часть на:

css( 'margin-top', height_diff + 50 )
11 голосов
/ 03 сентября 2008

Установите CSS для #footer на:

position: absolute;
bottom: 0;

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

Кроме того, если я правильно помню, в IE6 есть проблема с bottom: 0 CSS. Возможно, вам придется использовать решение JS для IE6 (если вам небезразлично IE6).

4 голосов
/ 04 декабря 2017

Решение, аналогичное @ gcedo , но без необходимости добавления промежуточного содержимого, чтобы сдвинуть нижний колонтитул. Мы можем просто добавить margin-top:auto в нижний колонтитул, и он будет помещен в конец страницы независимо от его высоты или высоты содержимого выше.

body {
  display: flex;
  flex-direction: column;
  min-height: 100vh;
  margin:0;
}

.content {
  padding: 50px;
  background: red;
}

.footer {
  margin-top: auto;
  padding:10px;
  background: green;
}
<div class="content">
  some content here
</div>
<footer class="footer">
  some content
</footer>
2 голосов
/ 26 августа 2012

Используйте абсолютное позиционирование и z-index для создания липкого div нижнего колонтитула при любом разрешении, используя следующие шаги:

  • Создайте div нижнего колонтитула с position: absolute; bottom: 0; и желаемой высотой
  • Установите отступ нижнего колонтитула, чтобы добавить пробел между нижней частью содержимого и нижней частью окна
  • Создайте контейнер div, который обернет содержимое тела с position: relative; min-height: 100%;
  • Добавление нижнего отступа к основному содержимому div, равного высоте плюс отступ нижнего колонтитула
  • Установите z-index нижнего колонтитула больше, чем контейнер div, если нижний колонтитул обрезан

Вот пример:

    <!doctype html>
    <html>
    <head>
      <title>Sticky Footer</title>
      <meta charset="utf-8">
      <style>
      .wrapper { position: relative; min-height: 100%; }
      .footer { position: absolute; bottom:0; width: 100%; height: 200px; padding-top: 100px; background-color: gray; }
      .column { height: 2000px; padding-bottom: 300px; background-color: green; }
     /* Set the `html`, `body`, and container `div` to `height: 100%` for IE6 */

      </style>
    </head>
    <body>
      <div class="wrapper">
        <div class="column">
          <span>hello</span>
        </div>
        <div class="footer">
          <p>This is a test. This is only a test...</p>
        </div>
      </div>
    </body>
    </html>
1 голос
/ 21 декабря 2014

CSS:

  #container{
            width: 100%;
            height: 100vh;
            }
 #container.footer{
            float:left;
            width:100%;
            height:20vh;
            margin-top:80vh;
            background-color:red;
            }

HTML:

           <div id="container">
               <div class="footer">
               </div>
           </div>

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

1 голос
/ 03 сентября 2008

Одним из решений будет установка минимальной высоты для ящиков. К сожалению, похоже, что не очень хорошо поддерживается IE (сюрприз).

...