Как стать автором
Обновить

Комментарии 43

Боюсь, большинство будет со мной не согласно, но я предпочитаю не прибегать к использованию JavaScript при верстке, особенно в подобных случаях.
Согласен, в верстке этот подход мало применим.
Присоединяюсь
Да и средствами css прижимается футер к низу на раз-два.
Случаи бывают разные, иногда это полезно. Но явно не в прижатии футера.
Поддерживаю.

Я сам долго искал хороший способ прижать футер к низу страницы, в итоге пришлось дорабатывать самому, но работает отлично. Хотя, лишних элементов в коде прибавилось.
А для футера произвольной высоты? Вот-вот…
Для футера произвольный высоты я пожалуй воздержусь от js ^_^"
Зачем решать на JS то, что можно спокойно сделать средствами css?
Пример вы дали не очень хороший, надо бы текста побольше, чтобы было видно, что при высоте страницы > высоты окна браузера футер ведет себя нормально, а не как в LiveJournal панелька LJTimes «приклеивается» к низу браузера.
вот и оно, решение.

<div class="wrap">
<div class="empty"></div>
</div>
<div class="footer">
</div>

.wrap {
height:auto !important;
height:100%;
min-height:100%;
position:relative;
}
.empty {
height:100px; /* равняется высоте футера */
}
.footer {
height:100px;
margin-top:-100px;
position:relative;
}
А может убрать div.empty и прописать div.wrap'у padding-bottom?
у wrap высота 100%
Не, нельзя.
Лучше использовать empty как контейнер для контента и прописать нижний паддинг(высоту конечно убрать)
чем вас не устраивает использовать слой wrap для контента? Он для него и предназначен
Не люблю лишние пустые элементы. Если уж нужен дополнительный элемент, то, на мой взгляд, лучше в него засунуть контент и задать отступ? использовать с пользой :)
<div class=«wrap»>
<div class=«content» style=«padding-bottom: 100px;»>
some content
</div>
</div>
А вот внутри wrap можно еще обертку типа .content сделать с padding-bottom
зачем? .wrap стыкуется с .footer
Неужели я туплю?
Бессонная ночь дает о себе знать)
Никого не смутило, что пример не работает как надо?
я на этой основе сверстал уже не один десяток сайтов и везде все работает ;)
хотя извиняюсь, забыл указать, что для body и html тоже нужно указать 100% высоту
<code>html, body {
	width:100%;
	height:100%;
}
</code>
JavaScript да ещё при базовой верстке? у меня нет слов…
Видели бы вы, какой код генерируется GWT… Наверное, вы бы возненавидели гугл.
1. На хабре (да и в Рунете в общем) есть over 9000 статей по оптимизации JS и, в частности, jQuery. рекомендую почитать их. В вашем коде используется неоптимальная выборка по классу (даже без указания тега), причем многократно. Хотя можно было бы закешировать этот элемент в какой-нибудь локальной переменной нашей анонимной функции (Здравствуйте, замыкания!) и обращаться к этому элементу практически бесплатно.

2. Решения на чистом CSS (хоть и с хаками) предпочтительнее. Хотя бы тем, что работает у мифических пользователей с отключенным JS и соответствует концепции разделения разметки, оформления и функционала.
Касаемо кучи мусора: я обычно использую решение с растягиванием основного контейнера на всю высоту и оставление некоторого отступа по размеру футера, на расстояние которого он потом подтягивается отрицательным magin'ом. Это буквально пара строчек в CSS (многая часть из которых нужна не только для прижатия футера), в то время как Ваше решение занимает 20 строк JS кода.
Вы забыли упомянуть, что нужно подключать jQuery, и я бы сделал так:

$('div.middler').css('min-height',$(window).height()-$('div.top').height()-$('div.bottom').height()+'px');

По моему короче.
Вопрос на засыпку:
— Почему все советуют не использовать js для прижатия футера к низу?
Ответ:
— В случае использования js при загрузке футер «плавает» по странице.

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

Если бы задача была в том, чтобы футер всегда был прикреплен к низу, то всё было бы намного проще, но зануднее для пользователя.
Так и надо было. Просто автор плохо сформулировал задачу.
Проблема подобных решений на скриптах — в использовании .ready(), которое в мало-мальски сложных страницах возникает через секунду-две после начала открывания. Футер вначале не невидимый? Отлично. На сложной странице вы увидите его «прыгание» вниз.

Решить частично можно, сделав невидимый футер. Но визуальный эффект пост-срабатывания останется (отвлекая от чтения содержания страницы). Ещё лучше решить — делая невидимой основную часть страницы до .ready(). Но тоже понятно, в каком месте минус этого решения.
НЛО прилетело и опубликовало эту надпись здесь
Очень «экзотическое» решение вызвать функцию каждую секунду.
Хех, использовать JS для такой простой операции — пипец.

Напишите просто:
#footer {position:absolute; bottom:0;}

Всё, больше ничкго не нужно для того, чтобы футер фсегда находился внизу страницы.
Мало кто понял, чего хотел автор, поэтому многие предлагают неверные варианты. Впрочем, реализация автора тоже не самая лучшая (я имею в виду поведение футера; про JS вообще молчу).

На мой взгляд, идеальный футер должен соответствовать требованиям:
1) не являться абсолютно позиционированным (то есть не преследовать посетителя), а вместо этого просто располагаться в конце страницы
2) в то же время, если страница будет слишком короткой, футер не должен оказаться в середине окна, а должен прикрепиться в нижнюю ее часть
3) футер должен быть резиновым, то есть по ширине футер должен влезать при ширине окна 100x100, а высота футера должна соответствовать высоте контента (как известно, уменьшении ширины блока с текстом увеличит его высоту из-за увеличения кол-ва строк).
4) нужно воздержаться от JS и от нарушения семантики HTML

Еще ни один из предложенных вариантов не соответствует таким, вполне адекватным, кстати, требованиям. У автора только первые 2 пункта в норме. В самых лучших вариантах 3-й пункт не соблюдался.
Простите, но обычно футер должен быть ровно настолько же резиновым, насколько резинова сама страница. Если при уменьшении окна меньше #px основной контент перестает помещаться и в браузере появляется прокрутка — футер не должен продолжать сжиматься. И в адекватных css-вариантах (например в приведенном выше под номером [2]) это правило соблюдается.
Чиорт, всего 1:40, а я уже невнимательно читаю каменты=(
Забираю свои слова обратно, понял о чем вы, действительно не соблюдается, но я лично не сталкивался с футерами, в которых бы это было актуально)
Кстати, интересно, решается ли эта задача с использованием старых, несемантишных таблиц?)
Awjeez! Какой отвратительный способ. Заменить CSS JS-м может только очень плохой верстальщик. Либо очень ленивый.
А почему нельзя использовать «position:fixed»?
Вопрос снимается… Недопонял проблему.
после слов «предлагаю простое решение на базе JavaScript...» читать расхотелось
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации