Как прижать подвал к низу экрана

15.02.2009 | Рубрики: Верстка
Тэги: , ,

footer-up.gif

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

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

Итак, принцип следующий: если мы верстаем страницу, помещая все блоки в один общий контейнер, то блок футера нужно вынести за пределы контейнера. При этом нужно обоим блокам задать относительное позиционирование (position: relative;), в блоке контейнера добавить внизу пустую блок-распорку по высоте равную высоте футера, а футеру, в свою очередь, задать отрицательный верхний отступ на то же значение. В листе стилей у блока контейнера будет задана минимальная высота в 100%. Получится, что контейнер у нас распространится на всю высоту экрана. Но чтобы подвал не потерялся за нижним краем монитора, мы его “подтянем” вверх на отрицательную высоту. То есть, чтобы проделать этот трюк, надо заранее знать, какой высоты будет подвал. Ну, а так как мы это уже знаем, то нет ничего проще.

Теперь подробнее. Общая схема страницы следующая:

<html>
<head></head>
<body>
<div id="container">
<div id="header"></div>
<div id="leftside"></div>
<div id="rightside"></div>
<div class="clearfloat"></div>
<div class="empty"></div>
</div>
<div id="footer"></div>
</body>
</html>

Это 2-х колоночная страница с шапкой и подвалом. Колонка leftside — основной контент, колонка rightside — сайдбар, расположенный, соответственно, справа. Блоки шапки (header), левой и правой колонок находятся в общем блоке контейнера. Сразу после блока сайдбара (rightside) мы прописали так называемую “очистку” — clearfloat. Она помогает избавиться от всяческих глюков и не пускает подвал запрыгивать в пустое пространство страницы, буде там таковое образуется. Вообще, небольшой совет: пишите этот clearfloat всегда. При плавающей верстке (а блочная иногда так и называется) это очень полезная штука.

Сразу после очистки, но до(!) закрытия блока контейнера, мы поместили пустой блок-распорку empty, тем самым зарезервировав место под подвал.

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

* {
margin: 0;
padding: 0;
border: 0;
}

html, body {
width: 100%;
height: 100%;
}

* html #container {
height: 100%;
}

body {
background: #fff;
color: #333;
}

#container {
position: relative;
width: 960px;
margin: 0 auto;
min-height: 100%;
}

.clearfloat {
clear: both;
}

.empty {
height: 50px;
}

#footer {
position: relative;
background: #333;
width: 960px;
height: 50px;
color: #ccc;
font-size: .9em;
margin: -50px auto 0;
}

Что тут есть. Во-первых, мы задаем отдельным набором правил размеры всей страницы как 100% по высоте и по ширине:

html, body {
width: 100%;
height: 100%;
}

Во-вторых, обязательно прописываем хак для ИЕ, иначе он не станет толком работать:

* html #container {
height: 100%;
}

Далее пишем правила для контейнера. Здесь важными являются два момента: относительное позиционирование (relative) и указание на минимальную высоту, опять же в 100%.

#container {
position: relative;
width: 960px;
margin: 0 auto;
min-height: 100%;
}

Для очистки применяем вот такое нехитрое правило:

.clearfloat {
clear: both;
}

А вот пустой блок-распорка имеет следующие параметры:

.empty {
height: 50px;
}

Здесь мы задали только высоту. Как я уже и говорил, высота эта берется из высоты самого футера. То есть, подразумевается, что его высота уже задана в 50 пикселей. Это важно. И вот почему:

#footer {
position: relative;
background: #333;
width: 960px;
height: 50px;
color: #ccc;
font-size: .9em;
margin: -50px auto 0;
}

В наборе правил для подвала мы задали точно такую же высоту. Но обратите внимание: здесь тоже относительное позиционирование (relative), а в самом нижнем правиле прописан минусовой отступ в те же 50 пикселей. То есть, выходит, что контейнер распространился на всю высоту монитора, и по идее, вытеснил подвал за пределы монитора. Но мы смещаем подвал (благодарая опять же относительному позиционированию) на 50 пикселей вверх. Словно бы накладывая подвал поверх контейнера. И в результате и овцы целы и волки довольны. Вот такая вот петрушка.

Пример страницы можно посмотреть здесь, а здесь файл CSS для нее.

Вебсовет

Комментарии (54)

  1. nornad 15.02.2009

    Большое спасибо, Игорь.
    От себя добавлю для таких же начинающих, как и я сам - чтобы подвал не заезжал за нижний край надо ещё убрать padding (а возможно и margin) в css для body и #container.
    Дело в том, что я сначала читал уроки по блочной вёрстке, а потом пробовал как-то приклеить футер книзу на той же странице. CSS там, конечно, отличатся от приведённого выше. :)

    Ответить

  2. Игорь Квентор 15.02.2009

    Да, верно, может потребоваться корректировка. Например, если контейнеру задать рамку всего в 1 пиксель толщиной, то появляется вертикальная полоса прокрутки. Как раз на эти пару пикселей (1+1). Но сам принцип, думаю, понятен.

    Ответить

  3. rust 19.02.2009

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

    Ответить

  4. Игорь Квентор 19.02.2009

    rust, не за что! :) Рад, что пригодилось.

    Ответить

  5. Сокол 19.02.2009

    За темку спасибо,оказалось то все так прсто:) Да и книгу о верстке скачаю,если там все так же доступно,то можно считать что клад сегодня нашел)))

    Ответить

  6. stellar 30.03.2009

    Спасибо! Очень полезный материал, воспользовался :)

    Но, насколько я могу судить, указывать position: relative здесь совсем не имеет смысла :)
    Ведь свойства left или top не заданы - положение футера задается margin`ом. В соответствии с текущей разметкой HTML по стандартным правилам. Т.е., хоть relative, хоть дефолтный statiс - не имеет значения.

    Так что static имхо логичней получается. Или не так?

    Ответить

  7. Amiora 11.05.2009

    Средняя часть получается не резиновая???
    Пихаю туда материал, он подкладывается под футер и выезжает снизу из под него…

    Ответить

  8. Amiora 11.05.2009

    Млин это я что=то нахимичила, в вашем файле резиновый. Пошла мучится. Спасибо за материал!

    Ответить

  9. stenli 26.06.2009

    Спасибо, как раз искал подобное решение.

    Ответить

  10. Михаил 20.07.2009

    Действительно, а зачем задавать position: relative?

    Ответить

  11. Игорь Квентор 21.07.2009

    stellar, Михаил, да вы правы. У блока footer это правило можно смело удалить.

    Ответить

  12. Иван 02.08.2009

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

    Ответить

  13. Игорь Квентор 03.08.2009

    Спасибо, Иван, на добром слове! :)

    Ответить

  14. Михаил 04.08.2009

    Игорь, попробовал все это проделать, получилось, что ни для блока #container, ни для #footer задавать position: relative не нужно - все и так хорошо работает. А если у #container позиционирование оставить, а у футера убрать, футер провалится. Если задать позиционирование только для футера - тоже все отлично. А так хорошая статья, большое Вам спасибо.

    Ответить

  15. Игорь Квентор 04.08.2009

    Михаил, а в IE6 пробовали смотреть? Я уже, честно, не помню почему, но на сайте автора, где я нашел данную фишку (http://webmolot.com/prizhimaem-futer-k-nizu/), было про это дело какое-то обсуждение тоже. Там, кстати, в комментах много чего интересного появилось за год. Советую почитать.

    Ответить

  16. Михаил 04.08.2009

    Да, в IE 6 тоже смотрел, все работает корректно, как написал выше. За ссылку спасибо, почитаю. Скажите, есть ли способ прижать футер не фиксированной высоты?

    Ответить

  17. Игорь Квентор 06.08.2009

    Про такое пока не слышал. Если найду - расскажу обязательно.

    Ответить

  18. Дмитрий 02.03.2010

    Вопрос как сие реалиловать чтоб по ширене браузера было и резиновое?

    Ответить

  19. Игорь Квентор 03.03.2010

    Дмитрий, не пробовали задать центральному блоку ширину в 100%?

    Ответить

  20. Дмитрий 03.03.2010

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

    Ответить

  21. Игорь Квентор 03.03.2010

    Так статья как раз об этом и написана. Другой вопрос: а надо ли при малом количестве контента делать резину? Что получится в результате на мониторе в 22″ и разрешении экрана 1680х1050? Такой сайт там просто потеряется. Имхо, не вижу смысла в подобных упражнениях. Хотя, каждый волен выбирать что ему по душе :)

    Ответить

  22. Aleksandr 18.04.2010

    Если двухколоночный сайт - контент и вертикальное меню, возможно ли данным методом обеспечить их одновременное растяжение и прилипание к футеру, хоть контент заполненный, а меню полупустое.
    Или есть другой способ?

    Ответить

  23. Игорь Квентор 19.04.2010

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

    Ответить

  24. Hripsime 25.04.2010

    Здравствуйте, Игорь.
    Наконец-то нашла у вас код, который действительно работает во всех случаях и во всех браузерах.
    Спасибо Вам! А то порой ищешь нужный код, а он не всегда правильный.

    Ответить

  25. Игорь Квентор 27.04.2010

    Приветствую! Вэлкам! :)

    Ответить

  26. Scream 31.05.2010

    А кто-нибудь может подсказать, как растянуть sidebar от шапки до футера?:)

    Ответить

  27. Игорь Квентор 04.06.2010

    Scream, а что конкретно нужно растянуть: фон или содержимое? Если первое, то следует просто нарисовать одну общую картинку-полосу для контента и сайдбара и задать ей повтор по вертикали. А если второе - пишите больше! :)

    Ответить

  28. Враг народа 30.06.2010

    Спасибо за рецепт. Сам полдня мучился, так и не сделал. А тут даже в ИЕ6 все работает как надо.

    Ответить

  29. Руслан 19.07.2010

    Спасибо очень помогло))) Доволен)!

    Ответить

  30. Игорь Квентор 21.07.2010

    Не за что!

    Ответить

  31. Макс 30.08.2010

    Большое спасибо. Каждый проект у меня начинается с этой страницы.

    Ответить

  32. Игорь Квентор 30.08.2010

    Макс, вэлкам!

    Ответить

  33. Виктор 09.09.2010

    Огромное спасибо! перерыл кучу информации, и нигде не смог найти такого хорошего описания. Очень помогло.

    Ответить

  34. Игорь Квентор 19.09.2010

    Не за что, Виктор! Рад, что смог чем-то помочь :)

    Ответить

  35. Александр 17.11.2010

    Здравствуйте Игорь! Спасибо вам за статью и за книжку! У меня один вопрос никак не могу прояснить - футер к низу экрана прижал, а как растянуть столбцы на всю длину? Вот у такого шаблона - http://blog.html.it/layoutgala/LayoutGala01.html чтобы цветные области по бокам доходили прямо до футера и вместе с ним до низа экрана соответственно :-).

    min-height: 100% для них уже почему-то не работает. Что-то я и так и сяк пробовал но не получилось, в чем фишка?

    Ответить

    Игорь Квентор

    @Александр, здравствуйте! Самое простое, что можно сделать в этом случае - нарисовать полоску фона по ширине главного контейнера и высотой в несколько пикселей. У этой полоски соответственно покрасить левую и правую часть в нужные цвета, а середину оставить белой. Потом задать ее в качестве фона с повтором по высоте (repeat-y)

    Ответить

    Александр

    @Игорь Квентор, аааа, понял, точняк %-) обязательно попробую, спасибо!!!

    Ответить

    Александр

    @Игорь Квентор, А если мне нужна резиновая верстка? Допустим правый и левый столбцы - фиксированной ширины, а середина тянется?

    Ответить

    Игорь Квентор

    @Александр, заполнить обе боковые колонки под завязку, чтобы на любое разрешение экрана хватило :) Если честно, то не вижу смысла в резиновой верстке. Любой текст хорошо воспринимается, когда в строке не более 9 - 12 слов. Если будет больше, а именно это и случается при растягивании контентной части, то читать становится неудобно и информация плохо воспринимается.

    Ответить

  36. MAXHO 23.11.2010

    Спасибо, работает теперь :)

    Ответить

  37. Андрей 05.03.2011

    Игорь, спасибо большое!!! … даже не большое, а огромное!!! Весь интернет обшарил, но только у вас смог найти правильное решение этой проблемы (3 дня пробовал разными способами, но все никак не хотели прижимать мой футер к низу страницы). Как я рад…. Всё-таки, побольше бы таких хороших людей:)

    Ответить

    Игорь Квентор

    @Андрей, не за что! :)

    Ответить

  38. Виталий 16.05.2011

    Игорь, прекрассная статья, все работает, НО
    когда внутрь футера вставляю картинку ТАКОГО же размера по высоте как указано в стиле футера, то внизу футера, то есть за его пределами появляется тоненькая горизонтальная полоска цвета фона всей страницы ….

    Но это только в IE !!

    В Хроме, оепре и файрфоксе все прекрассно,

    подскажите, в чем тут может быть дело?

    Ответить

    Игорь Квентор

    @Виталий, увы, не видя вашей страницы, сказать в чем причина не смогу.

    Ответить

  39. Иван 15.07.2011

    А как решить такую проблему у меня в html прописано что бы растягивать фон на весь экран браузера но если дописать width: 100%;
    height: 100%;
    то фон исчезает, но зато футер встает внизу экрана

    html
    {
    background: url(pic/fon.jpg) no-repeat center center fixed;
    -webkit-background-size: auto;
    -moz-background-size: auto;
    -o-background-size: auto;
    background-size: auto;
    }

    Ответить

  40. Иван 15.07.2011

    Спасибо решил данную проблему, перместил
    background: url(pic/fon.jpg) no-repeat center center fixed;
    -webkit-background-size: auto;
    -moz-background-size: auto;
    -o-background-size: auto;
    background-size: auto;

    в body и тогда фон растянут и стоит на месте и футер прижат к низу

    Ответить

  41. Рагим 15.07.2011

    Огромное спасибо!Я целый день не мог найти статью, где точно, подробно и понятно написано, как это сделать!Thanks!!!

    Ответить

    Игорь Квентор

    @Рагим, вэлкам!

    Ответить

  42. Виталий 23.09.2011

    Огромное спасибо за статью, но у меня не прижимается. Может ли это связано с тэгом (нужен обязательно т.к. runat server). т.е. конструкция такая .

    Ответить

  43. slovoblydie 03.11.2011

    о как -)) спасибо .. всё работает как надо ..
    я столкнулся с проблемой прижатия футера недавно.. до этого как-то странички маленькие не делал .. и после попыток 20-ти наверное разными способами уже полез гуглить ..кстати если гуглить тоже вариантов много предлагается но не все рабочие.. много кривых ..

    Ответить

  44. Kerny 18.11.2011

    если футер будет меньше 40-50 пикселей, то данное решение не работает, подвал не прижимается и это практически во всех браузерах. Для в качестве, решения можно попробовать calc, но пока свойство доступно только для 2-х браузеров.
    (в данном случае размер футера 23 пиксела)

    height: -moz-calc(23px + 26px);
    height: calc(23px + 26px);

    Ответить

  45. Kerny 18.11.2011

    Хотя нет, ваш пример работает, не пойму, почему у меня перекашивается.

    Ответить

  46. Kerny 18.11.2011

    Хотя все, разобрался, работает. У меня свойства html, body, перекрывались, вот что значит работать целые сутки. Спасибо, помогли.

    Ответить

  47. VRS 17.01.2012

    Спасибо, помогло.
    А кто знает как отцентровать div внутри другого div-а по вертикали?

    Ответить

Трэкбеки

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