Лучший способ прижать футер используя flexbox

О сайтеПравилаКонтакты

» Статьи » Разработка » Лучший способ прижать футер используя flexbox

  • Инструменты
  • Заработок
  • Раскрутка

30 июня 2018 . Антон Кулешов

При разработке веб-сайтов в какой-то момент, вероятно, можно столкнуться с такой задачей как прижатие футера к низу страницы, в этой статье мы разберем как это сделать, используя flexbox.

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

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

Разберем наш способ

Чтобы предотвратить эту ошибку, мы будем создавать нашу страницу, используя flexbox — самый продвинутый инструмент, который CSS3 может предложить для построения адаптивных макетов.

Итак, чтобы в CSS прижать футер, flexbox-модель становится самым лучшим вариантом. На нашей простой странице для демонстрации будет заголовок, основной раздел и нижний колонтитул.

<body>
    <header>...</header>
    <section>...</section>
    <footer>...</footer>
</body>

Чтобы включить модель flex, мы добавляем display: flex в тело и изменяем направление в столбец (по умолчанию это строка, которая является горизонтальной компоновкой). Кроме того,

html и body потребуют 100% высоты с целью заполнения всего экрана.

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

После этого нужно настроить, какое количество места займет каждый раздел. Мы добились этого благодаря свойству flex, которое объединяет три гибких спецификации в одну:

  • flex-grow — определяет, сколько свободного места в контейнере переходит к элементу;
  • flex-shrink — определяет, насколько будет сокращаться элемент, когда для всего не будет достаточно места;
  • flex-basis — размер для элемента, установленный по умолчанию.

Мы хотим, чтобы наш верхний и нижний блоки занимали такое количества места, какое им нужно, и все остальное было зарезервировано для основного раздела контента. Для такого макета, чтобы через CSS прижать футер (flexbox), все выглядит следующим образом:

header{
   /* 0 flex-grow, 0 flex-shrink, auto flex-basis */
   flex: 0 0 auto;
}
.main-content{
   /* 1 flex-grow, 0 flex-shrink, auto flex-basis */
   flex: 1 0 auto;
}
footer{
   /* 0 flex-grow, 0 flex-shrink, auto flex-basis */
   flex: 0 0 auto;
}

Чтобы увидеть эту технику в действии, ознакомьтесь с нашей демонстрационной страницей в конце страницы.

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

Подводим итоги и делаем выводы

Таким образом, flexbox можно считать отличным союзником при построении макетов с нуля. Все основные браузеры поддерживают его с несколькими незначительными исключениями, поэтому его довольно безопасно использовать во всех проектах IE9+. На сайте вы можете найти ещё один способ, но уже используя только CSS – «Как прижать футер к низу страницы».

Надеемся, наш метод создания закрепленных футеров был вам полезен, вы узнали что-то новое и вам понравилась эта статья. Оставьте нам комментарий, если знаете отличный способ использования flexbox!

#Flexbox

57 146

1

Перевод

Самый простой способ создания боковых панелей на CSS, одинаковой высоты Простой способ выровнять элементы в CSS по центру вертикально и горизонтально Простейший способ создать отзывчивые заголовки Создание адаптивного раздела комментариев с помощью flexbox Flexbox несколько полезных примеров для работы

Простой способ выровнять элементы в CSS по центру вертикально и горизонтально

Создание адаптивного раздела комментариев с помощью flexbox

Популярное

1 Пишем парсер контента на PHP2 Кликджекинг как соцфишинг, пишем скрипт для получения id пользователя вконтакте3 Лучший способ прижать футер используя flexbox4 Пишем первый модуль для 1С-Битрикс с использованием ядра D75 Делаем подгрузку контента при прокрутке страницы

Обратите внимание

Как прижать footer (подвал сайта) к низу окна браузера — Учимся создавать сайты — персональный блог верстальщика Заура Магомедова

Приветствую всех посетителей моего блога! В данной заметке затронем тему верстки и разберем как прижать footer (подвал) сайта к низу окна браузера.

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

Давайте же рассмотрим каким образом этого можно добиться средствами html и css. Данный метод, что приведен ниже относится к блочной верстке сайта, т.к. сегодня на таблицах уже никто не верстает, я имею ввиду профессиональных верстальщиков.

Вот как выглядит подвал по умолчанию, т.е. когда на странице мало контента:

А вот как должно быть по сути:

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

Для реализации задуманного создается общий блок «page» в который кладутся все остальные: шапка сайта (header), правая и левая колонки (left, right) и еще какие либо, а вот подвал (footer) остается за пределами данного блока «page».

Теперь перейдем к стилям. Задаем «html» и «body» высоту в 100%, а блоку «page» минимальную высоту также 100%. Таким образом у нас блок «footer» выталкивается за пределы окна браузера и его не будет видно совсем. Чтобы исправить ситуацию мы создаем еще один блок (substrate-footer) равный по высоте блоку подвала, но помещаем его в общий блок  «page», т.е. на то место, где по идее должен был находиться блок footer. Далее отрицательным отступом смещаем блок подвала (footer) вверх. Величина отступа равна высоте блока подвала и блока substrate-footer. После данных манипуляций наш подвал сайта встанет на свое место и будет постоянно находится внизу.

Также хотел отметить, что выше блока substrate-footer добавляется очищающий блок «clear». Это необходимо для того, чтобы отменить обтекание блокам «footer» и «substrate-footer», т.к. блокам «left» и «right» задаются свойства float:left и float:right соответственно.

Чтобы не быть голословным взгляните на код и вам станет сразу понятно что к чему.

HTML:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>Подвал по умолчанию</title>
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div><!-- Основной блок PAGE -->
<div><h4>Шапка сайта</h4></div>
<div><h4>Левая колонка</h4></div>
<div><h4>Правая колонка</h4></div>
<div>
<h4>Основная колонка с контентом</h4>
<p> Pellentesque vel est id massa varius interdum. Nunc nibh lectus,   fringilla quis scelerisque a, eleifend vitae nibh. Sed hendrerit mauris   quis tortor auctor ut luctus odio malesuada. Praesent facilisis felis   nisi, sed tincidunt erat. Phasellus ornare dignissim orci in   pellentesque. Aliquam dictum diam nec ipsum adipiscing vitae bibendum   tellus faucibus.</p>
<p>Praesent facilisis felis   nisi, sed tincidunt erat.
Phasellus ornare dignissim orci in pellentesque. Aliquam dictum diam nec ipsum adipiscing vitae bibendum tellus faucibus. </p> </div> <div></div><!-- очищающий блок --> <div></div><!-- блок подложка подвала сайта --> </div><!-- конец блока PAGE --> <div><!-- подвал сайта --> <h4>Подвал сайта</h4> </div> </body> </html>

CSS:

html,body {
    margin:0;
    padding:0;
    text-align:center;
    height:100%
}
#page {
    text-align:left;
    margin:0 auto;
    min-height:100%;
    width:960px;
}
#page h4 {text-align:center; margin:0}
#header {
    background-color:#06F;
    height:150px;
    margin:0 0 3px
}
#left {
    background-color:#C93;
    float:left;
    height:100px;
    width:180px;
}
#right {
    background-color:#C93;
    float:right;
    height:100px;
    width:180px;
}
#content {
    margin:0 180px;
    padding:10px
}
.clear {
    clear:both;
    height:0px;
}
#substrate-footer {
    height:100px;
    margin:20px 0 0
}
#footer {
    background-color:#6C9;
    height:100px;
    margin:-100px auto 0;
    width:960px;
}

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

А на этом все. Встретимся в следующих постах. Пока…

CSS. Как обеспечить, чтобы нижний колонтитул всегда находился внизу страницы?

Начало основного содержимого

CSS, Макет · 30 октября 2022 г.

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

 <тело>
  

Использование флексбокса

Вы можете использовать flexbox, чтобы нижний колонтитул всегда находился внизу страницы. Это делается путем установки body element min-height: 100vh , display: flex и flex-direction: column . Затем дайте нижний колонтитул элемент a margin-top: auto , чтобы его поле заполнило оставшееся пространство между ним и его предыдущим братом. Обратите внимание, что этот метод не будет растягивать предыдущий одноуровневый элемент, а скорее подтолкнет нижний колонтитул к нижней части страницы .

 корпус {
  мин-высота: 100вх;
  дисплей: гибкий;
  flex-направление: столбец;
}
нижний колонтитул {
  верхняя граница: авто;
} 

Использование сетки

Вы также можете использовать сетку очень похожим образом. Просто поменять местами display: flex для display: grid и flex-direction: column для grid-template-rows: 1fr auto в элементе body . Никаких дополнительных атрибутов для элемента нижнего колонтитула не требуется. В этом случае блок fr используется для растягивания основного элемента до заполнения оставшегося пространства .

 корпус {
  мин-высота: 100вх;
  отображение: сетка;
  строки шаблона сетки: 1fr авто;
} 

Примечания

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

Автор: Ангелос Чаларис

Я Ангелос Чаларис, инженер-программист JavaScript, живу в Афинах, Греция. Лучшие фрагменты из моих приключений в программировании публикуются здесь, чтобы помочь другим научиться программировать.

Если вы хотите оставаться на связи, подписывайтесь на меня на GitHub или в Twitter.

  • Clearfix

    Обеспечивает самоочистку дочерних элементов элемента.

    CSS, Макет · 30 декабря 2020 г.

  • Адаптивный макет с боковой панелью

    Создает адаптивный макет с областью содержимого и боковой панелью.

    CSS, Layout · 16 сентября 2020 г.

  • Постоянное отношение ширины к высоте

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

    CSS, Макет · 30 декабря 2020 г.

Нижний колонтитул и ссылки — CSS

jgokop:

Когда я создал позицию : исправлено для моего заголовка, я понял, что она ведет себя как абсолютная, а мое содержимое ниже частично скрыто. Следовательно, создание position:relative и top:100px для моего основного тега.

Да, используя позицию : фиксированная и z-index: 1 приводят к тому, что ваш заголовок прилипает к верхней части страницы и отображается поверх другого содержимого. Я бы исправил это, добавив отступ к верхней части скрытого содержимого.

jgokop:

Я хотел, чтобы нижний колонтитул отображался внизу при прокрутке вниз

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

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

Если вы имеете в виду что-то другое, вам нужно будет сказать мне, что вы имеете в виду. (Не стесняйтесь рисовать блоки вашего сайта в Paint или чем-то еще, если это сделает его более понятным.)

jgokop:

Когда я нажимаю на ссылку, она не достигает желаемого уровня. Он переходит к следующей строке кода вниз. Это только когда я экспериментирую, удаляя position: исправлено в шапке, ссылка ведет именно туда, куда я и предполагал.

Нет, он идет именно туда, куда вы говорите.

Ваш фрагмент #top — это тег абзаца:

 

Это тестовый первый абзац на этой странице.

Если я изменю вашу таблицу стилей, включив в нее непрозрачность: 40% в наборе правил заголовка , вы сможете увидеть, куда якорь ведет страницу, когда я щелкаю ссылку, нацеленную на .0015 #top фрагмент:

image1031×394 11,4 КБ

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

jgokop:

Мне интересно, это потому, что у меня есть position:fixed в моем заголовке

Да, я так думаю.

Щелчок по этому якорю помещает целевой фрагмент прямо в самый верх — за раздел заголовка, который статически закреплен на странице.

Используя Dev Tools, я вижу, что ваш элемент заголовка имеет высоту примерно 80 пикселей:

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

Мы можем сделать это с помощью CSS, используя псевдоэлемент ::before:

 #top::before {
  дисплей: блок;
  содержание: " ";
  верхнее поле: -100px;
  высота: 100 пикселей;
  видимость: скрытая;
}
 

Что мы делаем с этим CSS, так это создаем псевдоэлемент, который существует в потоке страницы перед элементом #top высотой 100 пикселей. Это эффективно смещает тег абзаца вниз на 100 пикселей, но это выглядит немного странно… поэтому отрицательное поле (-100 пикселей) возвращает его туда, где он должен был быть изначально.