Как прижать подвал к низу экрана
Дата: 15.02.2009 | Автор: Игорь Квентор | Рубрика: Верстка |

Когда на странице сайта мало контента, то при обычной блочной верстке подвал (он же футер) прижимается кверху, хотя по логике вещей должен бы находиться внизу экрана. Но так уж устроены браузеры, что все содержимое страницы кучкуют вверху экрана, занимая плотно все свободное место. Особенно бестолково это выглядит, когда дизайнер рисует футер в виде земельки с травками и прочими жучками. Тут уж хочешь не хочешь, а надо как-то придавить непослушный подвал к низу монитора, вне зависимости от количества контента на странице.
В своей книге о верстке 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 для нее.
Не менее подходящая работа — проектно-изыскательские работы,
а так же малая энергетика. Выбирай — не хочу. Трудиться надо. Надо работать. Работать надо! :)
Комментарии (21) на запись “Как прижать подвал к низу экрана”
Трэкбеки
Оставить комментарий












Большое спасибо, Игорь.
От себя добавлю для таких же начинающих, как и я сам - чтобы подвал не заезжал за нижний край надо ещё убрать padding (а возможно и margin) в css для body и #container.
Дело в том, что я сначала читал уроки по блочной вёрстке, а потом пробовал как-то приклеить футер книзу на той же странице. CSS там, конечно, отличатся от приведённого выше. :)
Да, верно, может потребоваться корректировка. Например, если контейнеру задать рамку всего в 1 пиксель толщиной, то появляется вертикальная полоса прокрутки. Как раз на эти пару пикселей (1+1). Но сам принцип, думаю, понятен.
Игорь, спасибо за статью, как раз собиралась на днях заняться изучением данного вопроса. Так что очень кстати
rust, не за что! :) Рад, что пригодилось.
За темку спасибо,оказалось то все так прсто:) Да и книгу о верстке скачаю,если там все так же доступно,то можно считать что клад сегодня нашел)))
Спасибо! Очень полезный материал, воспользовался :)
Но, насколько я могу судить, указывать position: relative здесь совсем не имеет смысла :)
Ведь свойства left или top не заданы - положение футера задается margin`ом. В соответствии с текущей разметкой HTML по стандартным правилам. Т.е., хоть relative, хоть дефолтный statiс - не имеет значения.
Так что static имхо логичней получается. Или не так?
Средняя часть получается не резиновая???
Пихаю туда материал, он подкладывается под футер и выезжает снизу из под него…
Млин это я что=то нахимичила, в вашем файле резиновый. Пошла мучится. Спасибо за материал!
Спасибо, как раз искал подобное решение.
Действительно, а зачем задавать position: relative?
stellar, Михаил, да вы правы. У блока footer это правило можно смело удалить.
Игорь. Вы нужный человек.
Спасибо за вышепреведенную статью
С Уважением,
Шевельков Иван
Спасибо, Иван, на добром слове! :)
Игорь, попробовал все это проделать, получилось, что ни для блока #container, ни для #footer задавать position: relative не нужно - все и так хорошо работает. А если у #container позиционирование оставить, а у футера убрать, футер провалится. Если задать позиционирование только для футера - тоже все отлично. А так хорошая статья, большое Вам спасибо.
Михаил, а в IE6 пробовали смотреть? Я уже, честно, не помню почему, но на сайте автора, где я нашел данную фишку (http://webmolot.com/prizhimaem-futer-k-nizu/), было про это дело какое-то обсуждение тоже. Там, кстати, в комментах много чего интересного появилось за год. Советую почитать.
Да, в IE 6 тоже смотрел, все работает корректно, как написал выше. За ссылку спасибо, почитаю. Скажите, есть ли способ прижать футер не фиксированной высоты?
Про такое пока не слышал. Если найду - расскажу обязательно.
Вопрос как сие реалиловать чтоб по ширене браузера было и резиновое?
Дмитрий, не пробовали задать центральному блоку ширину в 100%?
вопрос а по высоте? чтоб при малом наполнении контента растянуть на всю область окна браузера прижав колонки к подвалу, а при большем подвал уезжал вниз
Так статья как раз об этом и написана. Другой вопрос: а надо ли при малом количестве контента делать резину? Что получится в результате на мониторе в 22″ и разрешении экрана 1680х1050? Такой сайт там просто потеряется. Имхо, не вижу смысла в подобных упражнениях. Хотя, каждый волен выбирать что ему по душе :)