Подготовка полигона для испытаний

Набросаем простенькую страничку, на которой будем экспериментировать:

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
  <div class="page">

    <header>
       <h1>HEADER - HEADER</h1>
    </header>

    <div class="content">

      <div class="content-row">
        <main>
          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Praesentium molestias nulla neque omnis eaque ad perspiciatis cum mollitia excepturi sit. Amet, totam velit fugiat sunt voluptatum incidunt reprehenderit earum animi.</p>
          <p>Sit excepturi natus velit laborum adipisci deserunt quasi veniam, pariatur non aspernatur fuga beatae dolorum cupiditate commodi maxime, id eligendi laboriosam molestiae iusto dignissimos ea et error assumenda architecto! Eos.</p>
          <p>Perferendis animi totam, vel at reprehenderit veniam assumenda consequuntur perspiciatis similique. Eum repellat minus sed dolorem molestias, aperiam debitis hic! Quis obcaecati delectus iusto amet atque veritatis incidunt aspernatur temporibus.</p>
           <p>Pariatur id ut obcaecati expedita, impedit ipsa error repudiandae fuga harum, saepe ratione perspiciatis recusandae! Hic numquam, beatae fuga laborum id illum voluptates voluptatibus ex deleniti mollitia nesciunt temporibus consequatur.</p>  
        </main>

        <aside>
          SIDEBAR
          <br>
          SIDEBAR
        </aside>

      </div>
    </div>

    <footer>
      <h2>FOOTER - FOOTER</h2>
    </footer>

  </div>
</body>
</html>

И зададим для нее такие же простенькие стили:

/* Декоративные стили */

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}
.page {

  width: 900px;
  margin: 0 auto;
  border: 2px dotted black;
}
header {
  padding: 10px;
  background: black;
  color: white;
  text-align: center;
}
.content-row {
  display: flex;
}
main {
  background: #eee;
  padding: 10px;
}
aside {
  background: #ddd;
  padding: 10px;
}
footer{
  background: #ffa;
  text-align: center;
}

Пока что это простое украшательство, мы добавили обертке штриховую рамку и раскрасили основные блоки — header, main, aside и footer, чтобы проще их различать. Текущий результат не очень впечатляет, правда?)

Базовая верстка. Футер далеко от низа страницы

Футер висит где-то высоко над землей, а мы очень хотим его к этой земле приклеить.

Постановка задачи

Если в главном блоке мало контента, футер «прилипать» к низу странички. Если контента много, футер должен следовать за ним в нормальном потоке, скрываясь за нижней границей браузера. Другими словами, футер не должен маячить в нижней части страницы как приклеенный, если контент пытается выдавить его вниз.
Рассмотрим несколько вариантов решения проблемы.

Position: absolute

Предупреждение: данный способ годится только для футеров фиксированной высоты (для блока footer определено свойство height)!

footer {
    height: 50px;
}

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

.page {
    position: relative;
}
footer {
    position: absolute;
    left: 0;
    bottom: 0;
}
Абсолютное позиционирование футера

Что произошло? Да в общем ничего, за исключением того, что ширина футера уменьшилась до ширины его содержимого, а сам он наполз на контент главного блока. Чтобы исправить это пропишем футеру 100% ширину, а блоку .content нижний паддинг (отступ).

footer {
    width: 100%;
}
.content {
    padding-bottom: 50px;
}

При этом 100% будут браться от ширины блока .page, так как наш футер спозиционирован относительно него.

Однако, проблема по-прежнему не решена: футер парит высоко над землей. Логика подсказывает, что необходимо каким-то образом вытянуть наш шаблон на всю высоту экрана, но при этом не добавляя контент. Справиться с этой задачей поможет свойство минимальной высоты:

.page {
    min-height: 100%;
}

Ничего же не изменилось! — возмутитесь вы, и будете правы. Да, мы строго-настрого приказали блоку page растянуться минимум на 100% от высоты доступной ему области. Однако, мы забыли, что этот блок находится внутри тела нашего документа — тега body, а тот, в свою очередь, внутри html, которым никто не потрудился сообщить о том, что следует занять всю доступную высоту. Понаблюдать за этой связью мы можем, назначив body любую высоту, например:

body {
    height: 600px;
}
Страница растягивается на 100% от body

Прогресс налицо — футер уполз вниз. Теперь просто задаем body и html 100%-ную высоту и радуемся прилипшему футеру.

html, body {
    height: 100%;
}

Того же эффекта можно было добиться, просто установив блоку .page минимальную высоту в 100vh.

.page {
  min-height: 100vh;
}

See the Pen Sticky footer. Position absolute by furrycat (@furrycat) on CodePen.

Табличная верстка

Не пугайтесь, никто не заставляет вас верстать таблицами, эта технология постепенно отходит в прошлое. Однако, сложно отрицать тот факт, что таблицы в некоторых аспектах — вещь крайне удобная. Например, в позиционировании футера. Мы можем заставить наши блоки вести себя как строки таблицы с помощью CSS-свойства display:table-row. Это весьма удобный метод, который, к тому же, не требует категорично определять высоту футера.
Блок .page станет таблицей, а блоки header, .content и footer ее рядами.

.page {
    display:table;
}
header, .content, footer {
    display:table-row;
}

На первый взгляд ничего не изменилось. Однако теперь давайте зададим таблице и ее родительским блокам 100%-ную высоту.

html,
body,
.page {
    height: 100%;
}
Табличное отображение


Что такое произошло? Наша таблица растянулась на всю высоту экрана, но все высота блоков изменилась. Это волшебное свойство таблиц — автоматически балансировать высоту своих рядов в зависимости от содержимого. С этим очень легко разобраться. Зададим футеру и хедеру высоту в 1 пиксель. Не бойтесь, они не превратятся в узкие полоски, их реальная высота будет высчитываться в зависимости от контента. Этот способ лишь позволить блоку .content растянуться во всю высоту страницы.

header, footer {
  height: 1px;
}
Ограничение высоты шапки и футера


В принципе, никто не мешает и здесь задать конкретную высоту для футера или хедера.

See the Pen by furrycat (@furrycat) on CodePen.

Флексбоксы

На самом деле, таблицы — не самый лучший инструмент для верстки сайтов. Просто потому, что предназначены они для другого. Но принимая во внимание отсутствие специального инструмента, приходилось как-то крутиться. Теперь же этот инструмент есть и поддерживается он уже почти всеми браузерами.


Это флексбоксы.
С их помощью решение проблемы «липкого футера» осуществляется очень просто и очень изящно:

html, body {
    height:100%;
}
.page {
    display: flex;
    min-height: 100%;
    flex-direction: column;
}
 .content {
    flex: 1;
}
Использование flexbox-модели

See the Pen Sticky footer. Flexbox by furrycat (@furrycat) on CodePen.


Вот и вся хитрость «липкого» футера.

Верстайте с удовольствием!

8 комментариев

  • HiStO rIaN
    HiStO rIaN
    3/10/2017, 15:04
    C боковой панелью это не подходит....
  • HiStO rIaN
    HiStO rIaN
    3/10/2017, 09:09
    Почему нельзя сделать примеры с боковой панелью? Где вы видели сайты, состоящие только из центрального меню?
    • Мария
      Мария
      3/10/2017, 20:53
      засунь боковую панель внутрь main и будет тебе счастье
      • HiStO rIaN
        HiStO rIaN
        4/10/2017, 08:35
        Умные все такие... Думаешь не пробовал? Все слетело к чертям, футер опять прилип к мэйну и ездил при прокрутке с ним.. Было бы все так просто, не ломал бы голову 3-тьи сутки
        • Мария
          Мария
          4/10/2017, 14:53
          Посмотри тут https://jsfiddle.net/furrycat/wpukgb2a/ самый простой вариант с флексами что не получается? дай ссылку, посмотрим
          • HiStO rIaN
            HiStO rIaN
            7/10/2017, 16:44
            Да уже все, другие помогли.
      • HiStO rIaN
        HiStO rIaN
        4/10/2017, 09:28
        и продолжает прилипать с любыми настройками футера... ну нахер эту фигню бесполезную... проще убрать бесполезный футер или оставить его на вершине, кому не нравится, пусть не заходит на сайт...
        • User
          User
          16/04/2023, 21:00
          Проще и не делать никакой сайт. Кому надо - на другой сходят

Оставить комментарий

*Доступные HTML-теги: a, abbr, blockquote, code, pre, del, i, em, strong, b, strike
*Не будет опубликован