Как правильно прижать плавающий футер к низу страницы. Прибитый к низу футер своими руками Негативное пространство – достаточность визуальной дистанции




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

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

В процессе практики я выделил для себя 5 способов прижимания футера к низу окна браузера с помощью CSS .

HTML-код всех представленных способов имеет следующую структуру (отличие лишь в CSS-коде):

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

Первый способ

Footer прижимается вниз путем его абсолютного позиционирования и вытягивания высоты родительских блоков (html , body и.wrapper) на 100%. При этом контентному блоку.content нужно указать нижний отступ, который равен или больше высоты подвала, иначе последний закроет часть контента.

* { margin: 0; padding: 0; } html, body { height: 100%; } .wrapper { position: relative; min-height: 100%; } .content { padding-bottom: 90px; } .footer { position: absolute; left: 0; bottom: 0; width: 100%; height: 80px; }

Второй способ

Footer прижимается вниз за счет вытягивания блока контента и его «родителей» на всю высоту окна браузера и подъема футера вверх через отрицательный отступ (margin-top) для избавления от появляющегося при этом вертикального скролла. В данном случае необходимо обязательно указать высоту подвала, и она должна быть равна величине отступа.

* { margin: 0; padding: 0; } html, body, .wrapper { height: 100%; } .content { box-sizing: border-box; min-height: 100%; padding-bottom: 90px; } .footer { height: 80px; margin-top: -80px; }

Благодаря свойству box-sizing: border-box , мы не позволяем блоку с классом.content превысить высоту 100%. То есть в данном случае min-height: 100% + padding-bottom: 90px равняется 100% высоты окна браузера.

Третий способ

Он хорош тем, что, в отличие от остальных способов (кроме 5-го), высота футера значения не имеет.

* { margin: 0; padding: 0; } html, body { height: 100%; } .wrapper { display: table; height: 100%; } .content { display: table-row; height: 100%; }

Здесь мы эмулируем поведение таблицы, превратив блок.wrapper в таблицу, а блок.content в строку таблицы (свойства display: table и display: table-row соответственно). Благодаря этому, а также тому, что блоку.content и всем его родительским контейнерам задана высота 100%, контент растягивается на всю высоту, но за минусом высоты футера, которая определяется автоматически — эмуляция таблицы не дает подвалу вылезть за пределы высоты окна браузера.

В результате footer прижат к низу.

Четвертый способ

Данный способ не похож ни на один из предыдущих, и его особенность заключается в использовании CSS-функции calc() и единицы измерения vh , которые поддерживаются только современными браузерами. Здесь необходимо знать точную высоту подвала.

* { margin: 0; padding: 0; } .content { min-height: calc(100vh - 80px); }

100vh — это высота окна браузера, а 80px — это высота футера. И с помощью функции calc() мы вычитаем вторую величину из первой, тем самым прижимая футер к низу.

Узнать, какие браузеры поддерживают calc() и vh , вы можете на сайте caniuse.com по следующим ссылкам: поддержка функции calc() , поддержка единицы измерения vh .

Пятый способ (самый актуальный)

Это лучший способ из всех представленных, однако работает он только в современных браузерах. Как и в третьем способе, высота футера значения не имеет.

* { margin: 0; padding: 0; } html, body { height: 100%; } .wrapper { display: flex; flex-direction: column; min-height: 100%; } .content { flex: 1 0 auto; } .footer { flex: 0 0 auto; }

Узнать про поддержку браузерами свойства flex можно .

В HTML5 для структуры кода введено несколько новых тегов: , , , , , которые заменяют в некоторых случаях привычный . Хотя кажется, что особой разницы между тегами и нет, между ними лежит огромная пропасть. Теги ориентированы не на людей, которым нет смысла заглядывать в исходный код страницы, а на машины, интерпретирующих код. Машины или роботы не понимают , для них это типовой тег разметки - замени его на и смысл не поменяется. Другое дело , робот, обнаружив этот тег, воспринимает его именно как шапку сайта или раздела.

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

Давайте для начала сделаем шапку сайта с помощью тега (пример 6.2).

Пример 6.2. Использование

Попытка добавить в стилях фон к тегу ни к чему не привела, фон в некоторых браузерах отображаться не желает. Все новые теги следует сделать вначале блочными через свойство display , тогда они начнут корректно выводиться (пример 6.3).

Пример 6.3. Шапка сайта

HTML5 CSS 2.1 IE 7+ IE 9+ Cr Op Sa Fx

header { display: block; background: #00B0D8 url(images/header-gradient.png) repeat-x; }

Данный пример будет работать во всех браузерах, кроме IE7 и IE8. Internet Explorer не добавляет стиль к элементам, которые не понимает. Это недоразумение можно исправить, если создать фиктивный элемент с помощью JavaScript. Для этого включим в такой код.

document.createElement("header");

Если на странице встречается один тег, этот скрипт вполне подойдёт для работы. Но не хочется повторять строку десять раз для десяти разных тегов, поэтому автоматизируем этот процесс через цикл. Сами теги указываются списком, разделяясь запятой (пример 6.4).

Пример 6.4. Скрипт для IE

var e = ("article,aside,figcaption,figure,footer,header,hgroup,nav,section,time").split(","); for (var i = 0; i < e.length; i++) { document.createElement(e[i]); }

Сам скрипт заключается в условные комментарии, чтобы выполнялся только для IE версии 8.0 и ниже. В IE9 поддержка новых тегов HTML5 уже включена.

Пример выше не обязательно вставлять к себе на сайт, можно воспользоваться общедоступным скриптом написанным Реми Шарпом и распространяемым по лицензии MIT. Для этого достаточно указать на него ссылку, как показано в примере 6.5.

Пример 6.5. Скрипт для IE

Все указанные скрипты должны располагаться в коде перед CSS.

Таким образом, для полноценного использования тегов HTML5 во всех браузерах достаточно выполнить три условия:

  • установить доктайп ;
  • включить скрипт из примера 6.4 или 6.5;
  • в стилях для новых тегов установить display : block .
  • Теперь рассмотрим некоторые теги HTML5 более подробно, чтобы понять область их применения.

    Пример 6.6. Использование тега

    HTML5 IE Cr Op Sa Fx

    article Следы невиданных зверей История о том, как возле столовой появились загадочные розовые следы с шестью пальцами, и почему это случилось.

    Определяет блок, который не относится к основному контенту, для размещения рубрик, ссылок на архив, меток и другой информации (пример 6.7). Такой блок, если он располагается сбоку, называется, как правило, «сайдбар» или «боковая панель».

    Пример 6.7. Использование

    HTML5 IE Cr Op Sa Fx

    aside document.createElement("aside"); document.createElement("article"); aside { background: #f0f0f0; /* Цвет фона */ padding: 10px; /* Поля */ width: 200px; /* Ширина сайдбара */ float: right; /* Обтекание слева */ } article { margin-right: 240px; /* Отступ справа */ display: block; /* Блочный элемент */ }

    Экономьте электричество

    Хороший язык

    Чья палка больше

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

    Используется для группирования любых элементов, например, изображений и подписей к ним (пример 6.8).

    Пример 6.8. Использование

    HTML5 IE Cr Op Sa Fx

    figure document.createElement("figure"); document.createElement("figcaption"); figure { background: #5f6a72; /* Цвет фона */ padding: 10px; /* Поля вокруг */ display: block; /* Блочный элемент */ width: 150px; /* Ширина */ float: left; /* Блоки выстраиваются по горизонтали */ margin: 0 10px 10px 0; /* Отступы */ text-align: center; /* Выравнивание по центру */ } figcaption { color: #fff; /* Цвет текста */ }

    Софийский собор

    Польский костёл

    Содержит описание для тега . Тег должен быть первым или последним элементом в группе.

    Задаёт «подвал» сайта или раздела, в нем обычно располагается имя автора, дата документа, контактная и правовая информация (пример 6.9).

    Пример 6.9. Использование

    HTML5 IE Cr Op Sa Fx

    footer Персональный сайт Кристины Ветровой Добро пожаловать!

    Рада приветствовать вас на своем сайте.

    Copyright Кристина Ветрова

    Определяет «шапку» сайта или раздела.

    Используется для группирования заголовков веб-страницы или раздела (пример 6.10).

    Пример 6.10. Использование

    HTML5 IE Cr Op Sa Fx

    hgroup Кристина Ветрова Персональный сайт

    Задаёт навигацию по сайту (пример 6.11). Если на странице несколько блоков ссылок, то в обычно помещают приоритетные ссылки. Также допустимо использовать несколько тегов в документе. Запрещается вкладывать внутрь .

    Пример 6.11. Использование

    HTML5 IE Cr Op Sa Fx

    nav Чебурашка и крокодил Гена Чебурашка | Гена | Шапокляк | Лариска Добро пожаловать!

    Определяет раздел документа, который может включать в себя заголовки, шапку, подвал и текст (пример 6.12). Допускается вкладывать один тег внутрь другого.

    Пример 6.12. Использование

    HTML5 IE Cr Op Sa Fx

    section Съёмки фильма Полипропилен

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

    Хороший язык

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

    Помечает текст внутри тега как дата, время или одновременно дата и время. Может указываться непосредственно внутри контейнера , либо задаваться через атрибут datetime (пример 6.13).

    Дата и время задается в международном формате ISO 8601. Примеры оформления приведены в табл. 6.1.

    Для каждой единицы существует своя заданная форма и ограничения.

    • Год — задается четырьмя цифрами (1860).
    • Месяц — две цифры (01 — январь, 02 — февраль, 12 — декабрь).
    • День — две цифры от 01 до 31.
    • Час — две цифры от 00 до 23.
    • Минуты — две цифры от 00 до 59.
    • Секунды — две цифры от 00 до 59.
    • Часовой пояс — часы и минуты с указанием знака плюс или минус.

    Дата и время разделяются между собой заглавной латинской буквой T. Часовой пояс при необходимости пишется после времени со знаком плюс или минус. К примеру, для Москвы часовой пояс будет +03:00.

    Пример 6.13. Использование

    HTML5 IE Cr Op Sa Fx

    time

    1957-10-04 запущен первый искусственный спутник Земли.

    1960-08-19 первый полёт собак в космос.

    1961-04-12 первый полёт человека в космос.

    1963-06-16 первый полёт женщины-космонавта.

    1969-07-21 высадка человека на Луну.

    Часто при установке , кнопок, баннеров и т.п. возникает необходимость вставки html, css и JavaScript кодов в в тело тегов body и head. Некорректное выполнение этой операции вручную, может повредить сайт и даже полностью нарушить его работоспособность.

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

    Чтобы увеличить картинку щелкните по ней кнопкой мышки. Чтобы уменьшить щелкните ещё раз.

    1. Page Head and Footer (Заголовок и подвал страницы) . Добавление кода в главной страницы сайта.

    Code to be added on HEAD section of the home (код, который надо вставить в заголовок домашней (главной) страницы). Позволяет вставить мета теги, коды рекламных баннеров, кнопок и т.п. в тело тега . Чаще это невидимая часть кода для отсутствия на сайте визуального показа. Результат работы видимой части кода появится над шапкой на главной странице.

    Code to be added on HEAD section of every page (код, который надо вставить в заголовок каждой страницы). Добавление кода в тело тега в раздел HEAD. Результат работы видимой части кода появится над шапкой на всех страницах, в том числе и на главной.

    Code to be added before the end of the page (код, который надо вставить в конец (подвал) страницы). Добавление кода в подвал на всех страницах перед закрывающим тегом . Это работает только для тем, имеющих подвал и файл footer.php.

    Практически все счетчики состоят из двух частей – это коды невидимой и видимой (информер) частей счетчика. Код невидимой части вставляется после открывающегося тега , как можно выше к началу страницы. Для этого можно использовать плагин или внести коррекцию непосредственно в файл header.php, . Код видимой части (информер) вставляется в подвал сайта с помощью плагина Header and Footer перед закрывающимся тегом или в сайдбар с помощью виджета.

    2. Post content (содержимое записи) . Добавление кода в начало и конец поста на всех страницах категорий, при полном показе поста.

    Code to be inserted before each post (код, который надо вставить перед каждой записью). Вставка кода в начале каждого поста (статьи) категории после заголовка, только в том случае, если статья показана полностью.

    Code to be inserted after each post (код, который надо вставить после каждой записи). Вставка кода после каждого поста категории.

    3. Page content. Добавление кода в начало и конец поста всех статических страниц, при полном показе поста.

    Code to be inserted before each page. Вставка кода в начале каждого поста (статьи) статической страницы после заголовка, только в том случае, если статья показана полностью.

    Code to be inserted after each page. Код будет вставлен после поста на каждой статической странице.

    4. Faceboock . Если добавить метапризнак og:image (протокол Open Graph, с помощью которого можно ввести метаданные в формате Social Graph на страницы ресурса), например список контактов Faceboock, то при нажатии кнопки Faceboock в начале или конце постов, на всех страницах можно управлять выборкой изображения, которое отправится на стену пользователя.

    5. Snippets . Имеется возможность задавать отрывки, которые отсылаются на стену пользователя при нажатии кнопки социальных сетей, расположенных в начале или в конце поста. Отрывки отсылаются как , где N – номер отрывка от 1 до 5.

    6. Notes and parked codes. Примечания.

    Все, кто привык к полноценно оформленным страницам сайтов, предпочитает вид «прибитого» (прилипающего, sticky) к низу футера страницы. Но есть в интернете две беды: нерастущие вниз поля ввода и неприбитые (к низу окна) футеры. Например, когда открываем короткие по высоте страницы типа habrahabr.ru/settings/social - сразу бросается в глаза, что информация, призванная быть в нижней части окна просмотра, прилипает к содержанию и находится где-то посередине, а то и в верхней части окна, когда внизу - пусто.

    Так, вместо того, чтобы .
    Данное пособие для начинающих верстальщиков покажет, как за 45 минут сделать «прибитый» футер, исправив недоработки даже такого уважаемого издания, как Хабр, потягаться с ним в качестве исполнения своего перспективного проекта.

    Посмотрим на реализацию одного вида прибитого футера, взятого из сети, и попробуем разобраться в происходящем. css-tricks.com/snippets/css/sticky-footer
    CSS:
    * { margin:0; padding:0; } html, body, #wrap { height: 100%; } body > #wrap {height: auto; min-height: 100%;} #main { padding-bottom: 150px; } /* must be same height as the footer */ #footer { position: relative; margin-top: -150px; /* negative value of footer height */ height: 150px; clear:both;} /* CLEAR FIX*/ .clearfix:after {content: "."; display: block; height: 0; clear: both; visibility: hidden;} .clearfix {display: inline-block;} /* Hides from IE-mac \*/ * html .clearfix { height: 1%;} .clearfix {display: block;} /* End hide from IE-mac */
    HTML:
    Вряд ли каждый, даже знающий CSS, глядя на этот код, разберётся в принципах и будет уверенно править сложный проект. Любой шаг в сторону приведёт к побочным эффектам. Рассуждения и изготовление футера ниже призваны дать больше понимания правилам CSS.

    Начнём с теории Обычная реализация прибитого футера основывается на том уникальном для CSS2 свойстве, что элементы - непосредственные потомки BODY - поддерживают процентную высоту (height:100% или другую) относительно окна, если все их родители имеют тоже процентную высоту, начиная с тега HTML . Раньше, без доктайпов, а сейчас в Quirks Mode процентные высоты элементов поддерживаются на любом уровне, а в современных доктайпах - только внутри процентно заданных элементов. Поэтому, если мы сделаем блок контента (назовём его #layout ), имеющий 100% высоты, он будет иметь скролл, как будто это - окно. В него помещают всё (потоковое) содержание, кроме футера и, может быть, хедера.

    Футер помещают вслед за этим блоком и делают ему 0 пикселей высоты. Вообще, можно вслед за #layout поставить сколько угодно блоков, но все они должны быть или с 0 пикселей высоты, или вне потока документа (не position: static ). И есть ещё один важный фокус, которым обычно пользуются. Не обязательно делать высоту, равную 0. Можно сделать высоту фиксированной, но из основного блока вычесть её за счёт свойства margin-bottom: -(высота); .

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

    Поскольку низ блока #layout - это карман, он для футера должен быть пустым, не отображающим объекты страницы. И тут встречаемся с ещё одним ограничением - мы не можем делать пустой карман за счёт padding в #layout , потому что тогда он станет больше 100%. Не спасёт и margin - пустоту нужно делать за счёт свойств вложенных элементов. Плюс ко всему, надо обеспечить невылезание под границу блока плавающих элементов, что делается, например, блоком
    , где .clear{clear:both} . Важно, чтобы или эта "высота " была фиксированной, или в тех же относительных единицах, или мы её вычисляли бы в процессе изменений страницы. Обычно удобно совместить этот выравнивающий блок с установкой для него требуемой высоты.

    Посмотрим на строение страниц нашего подопытного. Для этого проще всего раскрыть окно Firebug или подобное окно («Инструменты разработчика» (Ctrl-F12)) в Chrome.
    ...Верхний блок рекламы... ...===Содержимое страницы===... ...Правый сайдбар... ...Блок .. ... ... ... ... ...

    Перейдём к рабочему примеру Какие видим недостатки вёрстки в плане реализации эффекта прибитого футера? Видим, что
    1) футер на сайте находится внутри блока с id=layout, который не имеет процентной высоты. По теории, ему, родителям и блоку содержания.content-left требуется поставить высоту 100%. С последним возникают проблемы - он для такого не приспособлен. Следовательно, не хватает одного прослоечного блока или футер находится не на том уровне. Кроме того,
    2) высота футера переменная (зависит от числа элементов в списке и от размера шрифта, это видно не из HTML, а из CSS). И
    3) над #layout имеется рекламный блок фиксированной высоты 90px;
    4) выравнивающих блоков нет ни в футере, ни (вообще говоря) в блоке #layout (есть, но над блоком .rotated_posts ; впрочем, возможно, его надо отнести к футеру).

    Пункт 4 - придётся прорисовывать скриптом.
    C третьим пунктом разобраться, казалось бы, просто, добавив #layout{margin-top:-90px;} Но вспомним, что этого блока может не быть - он подавляется баннерорезкой, или рекламщики его вдруг решат не показывать. Есть ряд страниц сайта, где его нет. Поэтому зависимость margin-top от рекламного блока - плохая идея. Гораздо лучше - разместить его внутри #layout - тогда он ничем не будет мешать.

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

    Поскольку мы не можем быть сильнее самого последнего верстальщика сайта, «влепившего» футер внутрь содержания, отложим идею правильного размещения футера на свой будущий сайт (который, стало быть, будет «круче» Хабра!), а Хабр препарируем джаваскриптом (юзерскриптом) до правильного состояния. (Сразу скажем, виноват не верстальщик, не стрелочник, а вид сайта, конечно, определяет стратегическое решение руководства проекта.) Так мы не достигнем идеала, потому что в первую секунду-две в процессе загрузки страница будет с неправильной вёрсткой. Но для нас важен концепт и возможность превзойти по качеству самый популярный сайт мира айтишников.

    Поэтому в нужном месте скрипта (пораньше, в конце загрузки страницы) напишем переносы DOM-блоков рекламы и футера на нужные места. (Приготовимся к тому, что за счёт юзерскриптов решение будет сложнее чистого.)
    var dQ = function(q){return document.querySelector(q);} //для сокращения var topL = dQ("#topline"), lay = dQ("#layout"), foot = dQ("#footer"); if(topL && lay) //баннер - внутрь блока контента lay.insertBefore(topL, lay.firstChild); if(lay && foot && lay.nextSibling) //перенос футера lay.parentNode.insertBefore(footer, lay.nextSibling);
    Расставили блоки по местам - теперь осталось приписать элементам нужные свойства. Высоту футера придётся задавать точно, просто потому что мы её уже знаем к моменту действия юзерскрипта (конец загрузки страницы). Из-за точки срабатывания юзерскрипта, как уже говорилось выше, прыжок отображения футера на странице неизбежен. Можно пытаться делать «хорошее лицо», но при «плохой игре»? Зачем? «Плохая игра» сайта позволяет сделать без сверхусилий концепт, которого будет достаточно для оценки качества и не понадобится при «правильной игре» на своём проекте.
    if(foot){ //блок-выравниватель в футере h.apnd_el({clss:"clear", appendTo: footer}); var footH = foot.offsetHeight; //...и измеряем высоту футера } if(topL && lay && footer && lay.nextSibling){ //выравнивающий блок нужной высоты в контенте ("лейауте") h.apnd_el({clss:"clear", css:{height: (footH ||0) +"px"}, appendTo: lay}); lay.style.minHeight ="100%"; h.addRules("#layout{margin-bottom:-"+ footH +"px!important}html, body {height:100%}"); }
    Здесь позволили себе применить самописную функцию h.apnd_el , делающую примерно то же, что и в jQuery -
    $("").css({height: footH ||0}).appendTo($(footer))
    И далее - ещё одна типичная функция внедрения правил CSS - h.addRules . Здесь без неё не обойтись, потому что нужно объявить правило с "!important " - как раз из-за особенностей приоритетов стилей из юзерскрипта.

    С этими кусочками кода мы сможем увидеть в юзерскрипте прибитый футер (после прыжка его вниз) и полностью осознать, как надо строить вёрстку страниц. Использовать прыгающий дизайн повседневно - неприятно, поэтому рекомендуется его сделать исключительно для демонстрации и тестирования. В юзерскрипте HabrAjax я установил аналогичный скрипт, закрыв его настройкой «underFooter» (установить «галочку» в списке настроек перед «прибитый к низу футер»), начиная с версии 0.883_2012-09-12.

    Затрагивает ли прибитый футер необходимость обновления стилей ZenComment , если они установлены? Да, затрагивает. Из-за сложной цепочки приоритетов стилей, в которых стили, вставляемые юзерскриптом, имеют низший приоритет, пришлось немного подкорректировать юзерстили для возможности работы с прибитым футером. Если вы не обновите юзерстили (до 2.66_2012-09-12 +) - футер будет работать неточно.

    Блок rotated_post (три популярных поста из прошлого) логичнее смотрится при футере, поэтому в реальном скрипте он тоже перенесён в футер.

    Второй пункт (из списка недостатков вёрстки) - рассуждения чисто для Хабра (к юзерскрипту не относятся и частично повторяют прежние).

    У страниц имеется проблема, мешающая сделать прибитый футер на чистом CSS - неопределённая высота футера, зависящая от размеров шрифта по умолчанию в браузере. Для реализации футера на CSS требуется подобрать относительные высоты шрифтов, но и они могут не сработать, если на компьютере пользователя не будет предусмотренных шрифтов. Поэтому решение должно включать джаваскрипт, который может подгонять переходами (transitions) приблизительное положение футера до точного. Или, посмотрев на приемлемость сделанного решения на юзерскрипте на разных платформах, сделать вычисляемую установку прибитого футера - первые наблюдения показывают, что решение практично.

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

    Реализация Если включить HabrAjax 0.883+, то увидим работу «прибитого футера». Он адаптируется по высоте с помощью скриптов. Он позволяет оценить, насколько лучше выглядят страницы с прибитым футером по сравнению с обычными. Юзерстили ZenComment совместимы со скриптами, но для правильной работы прибитого футера с ними нужно установить версию ZenComment 2.66_2012-09-12 +.Факты о поведении реализации Шаманство с футером, стилями и скриптами - это шаманство (лишь подкрепляемое теорией). В разных браузерах немного разное поведение, но кое-где - неожиданное. Без юзерскриптов и переставления блоков результаты будут другие. Вот что дали эксперименты с реализацией на юзерскрипте.

    1) Firefox - неожиданное отсутствие прыжков футера. Странно, что их нет - отрисовка происходит после размещения футера внизу.

    2) Chrome - он удивил «блуждающим скроллом» - к странице с периодом раз в секунду добавляются пустые пространства внизу - что-то неправильное происходит с расчётом высот. Лечится прописыванием html,body{height:100%} в юзерстили, но без гарантий, что всегда будет работать. Надёжнее - проверять, не превышает ли документ окно по высоте, и если не превышает, то двигать футер, иначе - ничего. С прыганием - всё в порядке, оно есть.

    3) Опера - без прыжков (v. 12.02) при первой загрузке страницы, но поспешная перезагрузка может показать прыжок футера. В остальном ведёт не менее корректно, чем Fx.

    Что же, придётся специально приучить Хром вести себя правильно (скриптом) и в таком виде выкатить версию на обозрение. Поэтому участок в юзерскрипте немного сложнее, чем приведённый в статье.

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

    В итоге, получилась вполне работоспособная схема работы, по крайней мере, для быстрых стационарных компьютеров. Если обнаружится неправильное поведение футера, настройку «underFooter» нужно отключить.

    Для каких страниц это полезно? На стандартном сайте, без юзерстилей даже короткие страницы вопросов-ответов оказываются длиннее 1500px, что в большинстве случаев незаметно при горизонтально расположенных мониторах. Но даже при обычных мониторах часто попадаются персональные страницы пользователей высотой порядка 1300 пикселей, где неприбитый футер предстаёт во всей красе. Не очень длинен и ряд страниц в настройках пользователя.

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

    Будет ли поддержка?

    Поведение сайта за последний год показывает, что разработчики (а значит, руководство) начали внедрять возможности, ранее существовавшие только в юзерскриптах и юзерстилях. Например, в начале года я написал , где собрал множество небольших пожеланий. Через полгода я вернулся к ней и с удовлетворением пометил (прямо в тексте; можно ознакомиться с «UPD» и датами), что целый ряд возможностей, описанных как пожелания, уже были внедрены в сайт.

    Далее, посмотрим на «стрелочки» вместо квадратиков для оценивания комментариев. Они появились в юзерсилях almalexa («Prettifier») года 3 назад и переняты в ZenComment года 2 назад. Месяца 2-3 назад они появились на сайте. Начинает вериться в то, что через некоторое время стрелки разнесут на некоторое расстояние, как это сделано в ZenComment (одна стрелка слева от числа, вторая справа), чтобы меньше промахиваться.

    Поэтому, возможно, и «прибитый футер» на Хабре - это не такая фантастика, какой могла показаться года 3 назад.

    Другие возможности в скрипте HabrAjax, появившиеся за последние 3 месяца (отключаемы в настройках):
    * авторост полей ввода (в Опере может тормозить на больших текстах);
    * дни недели при датах, кроме «сегодня» и «вчера»;
    * события в Ленте, сворачиваемые до 1 строки и 2 символов ;
    * сокращение слов «хабр*» до "χ·" и "χα";
    * подсказки дат по номерам статей - сообщается, какого месяца и года статья до её загрузки, по номеру в URL;
    * свёрнуты «Похожие посты» до 2 слов. Скриншот всплывающих «похожих постов» (показывает 12 ссылок, а не 4).

    Этот тег может использоваться, как и предыдущие теги несколько раз на странице. Вы, наверное уже догадались из названия, что он является подвалом страницы. В нём можно располагать счетчики, текст об авторских правах на сайт, контактные данные и т.п. Возможно также вставить панель навигации () в подвал страницы. Никто не запрещает вставлять и такие новые элементы, как aside и section, но я бы на вашем месте все-таки этого не делал.

    и используем на полную!

    Новая разметка body>header { background:#FFEAD5 } article{ background:#CFCFCF; margin:10px; padding-top:5px; } article p{ padding-left:25px } article, article>header hgroup { -moz-border-radius:5px; /* Радиус скругления */ -webkit-border-radius:5px; -khtml-border-radius:5px; border-radius:5px;} article header hgroup { text-align:right; width:40%; color:#CCC; background:#000; margin-left:55%; } article footer { background:#5c6183; -moz-border-radius:0px 0px 5px 5px; /* Радиус скругления */ -webkit-border-radius:0px 0px 5px 5px; -khtml-border-radius:0px 0px 5px 5px; border-radius:0px 0px 5px 5px; padding-left:15px; color:#FFF } header hgroup p { background:#FFF; color:#006; -moz-border-radius:0px 0px 5px 5px; /* Радиус скругления */ -webkit-border-radius:0px 0px 5px 5px; -khtml-border-radius:0px 0px 5px 5px; border-radius:0px 0px 5px 5px; padding-right:10px; } footer {clear:both; background:#DDECE9} footer p{ font-size:14px; text-align:center} Шапка сайта Пост №1

    Здесь мы будем писать текст первого поста.

    Пост №2

    Здесь мы будем писать текст второго поста.

    Автор поста (статьи): Александр Побединский

    Здесь обычно пишут, что права защищены. Год и.т.п. Копирование запрещено))

    В результате должен получиться следующий результат:

    Из этого примера следует, что каждая отдельная статья или пост могут иметь свои элементы и не зависимо от шапки и подвала (футера) страницы документа. Именно в таких случаях эти элементы могут использовать несколько раз. Хотя я уверен, что их можно применять и в боковой панели aside.

    Ну вот вы и познакомились с основными структурными элементами HTML5, а следующих уроках мы с вами рассмотрим ещё больше новых элементов, различные формы, которых не было в других спецификациях HTML!