Ответ 1
Как вы уже упоминали, position: fixed
позиционирует нижний колонтитул относительно области просмотра, а не самой страницы. Поэтому мы должны поддерживать элемент в нормальном потоке и как-то позиционировать его в нижней части страницы.
Существует несколько подходов к достижению этого, которые в свое время обсуждались в дикой природе.
Например:
- A List Apart статья Изучение нижних колонтитулов - by Бобби Van Der Sluis, 2004
- footerStickAlt - Крейг Эрскин, 2005
- Липкий нижний колонтитул - Шелли Коул, 2006
- Как сохранить нижние колонтитулы внизу страницы - Мэтью Джеймс Тейлор, 2007
- Сделать нижний колонтитул снизу страницы - Райан Файт, 2007
- Уточненная версия липкого нижнего колонтитула Ryan Fait - Chris Coyier, 2009
- Липкие нижние колонтитулы CSS: гибкий способ (который использует CSS-таблицы) - Torben Haase, 2011
- Отзывчивый липкий нижний колонтитул (уточненная версия подхода Торбена) - Джошуа Кук, 2013
- Решено Flexbox Липкий нижний колонтитул - Филип Уолтон, 2013 г.
Липкий нижний колонтитул
В этом ответе я бы пошел с методом Райана Файта, поскольку он прост и понятен, а также он отвечает вашим потребностям (ситуации, в которых и верхний и нижний колонтитулы имеют фиксированные высоты).
Учитывая структуру ниже:
<div id="content"> <!-- content goes here. It may (not) include the header --> </div>
<div id="footer">Footer</div>
Необходимы следующие шаги:
-
Настройка
height
элементов<html>
и<body>
на100%
, которая требуется для следующего шага 1. -
Самое главное, что нам нужно сделать, это убедиться, что
#content
достаточно высок, чтобы нажать#footer
вниз по странице. Поэтому мы даем#content
amin-height
of100%
. -
Пока,
#content
взял100%
высоты окна просмотра, поэтому мы должны потянуть нижний колонтитул, чтобы поместить его на внизу страницы. Для этого мы могли бы дать#content
отрицательныйmargin-bottom
эквивалент нижнего колонтитулаheight
. Кроме того, чтобы нижний колонтитул отображался поверх содержимого, мы должныposition
нижний колонтитулrelative
ly. Демо здесь. -
Как видно, когда
#content
растет по своему содержанию, часть содержимого выходит за нижний колонтитул. Мы могли бы избежать этого либо путем добавления разделительного элемента в конце#content
, либо использовать комбинациюpadding-bottom
иbox-sizing: border-box
2 который предположительно будет поддерживаемый в IE8.
4.1 Добавление разделителя
<div id="content">
<!-- content goes here -->
<div class="spacer"></div>
</div>
<div id="footer">Footer</div>
.spacer, #footer { height: 100px; }
4.2 Комбинация padding-bottom
и box-sizing
#content {
min-height: 100%;
margin-bottom: -100px; /* Equivalent to footer height */
padding-bottom: 100px; /* Equivalent to footer height */
box-sizing: border-box;
}
(Обратите внимание, что префиксы поставщиков опущены из-за краткости)
Добавление заголовка
-
Если заголовок должен оставаться в нормальном потоке, вы можете просто добавить его в
#content
следующим образом:
(Пример здесь)<div id="content"> <div id="header">Header</div> ...
-
Но если он должен быть позиционирован абсолютно 3 нам нужно нажать содержимое элемента
#content
вниз, чтобы чтобы предотвратить перекрытие.
Поэтому снова мы могли бы добавить спейсер в начале #content
(Пример здесь):
<div id="header">Header</div>
<div id="content">
<div class="header-spacer"></div>
<!-- content goes here -->
<div class="footer-spacer"></div>
</div>
<div id="footer">Footer</div>
Или используйте комбинацию padding-top
и box-sizing
следующим образом:
<div id="header">Header</div>
<div id="content"> <!-- content goes here. --> </div>
<div id="footer">Footer</div>
#content {
min-height: 100%;
margin-bottom: -100px; /* Equivalent to footer height */
padding-top : 50px; /* Equivalent to header height */
padding-bottom: 100px; /* Equivalent to footer height */
box-sizing: border-box;
}
Обновленный пример (обратите внимание, что префиксы поставщиков опущены из-за краткости)
Наконец, но не менее!
В настоящее время все основные современные веб-браузеры поддерживают box-sizing: border-box
объявление (включая IE8). Однако, если вы ищете традиционный способ, который имеет более широкую поддержку браузера, придерживайтесь использования разделительных элементов.
1. Это необходимо сделать min-height: 100%
для работы с элементом #content
(поскольку процентное значение относится к height
окна, содержащего установленный блок по <body>
). Кроме того, <html>
должен иметь явный height
, чтобы сделать height: 100%
работать с <body>
.
2. box-sizing: border-box
делает UAs вычисляет width
/height
поля, включая отступы и границы.
3. Согласно спецификации, абсолютно позиционированные элементы представляют собой элементы, имеющие position
of absolute
или fixed
.