Расположить нижний колонтитул в нижней части страницы с фиксированным заголовком
Я хочу поместить нижний колонтитул в нижней части страницы, которая также имеет фиксированный заголовок...
Только не с ним
position: fixed- я не хочу, чтобы он оставался на экране, он должен просто быть в конце страницы и вести себя нормально при прокрутке.
Не в нижней части видимого экрана - в нижней части страницы , т. е. после всего остального контента.
Вот схема, чтобы объяснить лучше:

Вот код:
- я подготовил демо-версию: JSFiddle
- или смотрите ниже
<div id="header">Header</div>
<div id="content">
<p>Some content...</p>
</div>
<div id="footer">Footer</div>
body{
/* Just to enable scrolling in JSFiddle */
height: 1000px;
}
#header{
width: 100%;
height: 100px;
position: fixed;
top: 0px;
z-index: 1;
}
#content{
width: 100%;
position: absolute;
top: 100px; /*Height of header*/
z-index: 0;
}
#footer{
width: 100%;
height: 100px;
position: absolute;
bottom: 0px;
}
/*For demo only*/
#header, #footer{
border: 3px dashed #333333;
background: #FFFFFF;
}
#content{
background: #CCCCCC;
height: 200px;
}
5 ответов:
Как вы уже упомянули,
position: fixedрасположит нижний колонтитул относительно окна просмотра, а не самой страницы. Поэтому мы должны держать элемент в нормальном потоке и каким-то образом расположить его в нижней части страницы.Есть несколько подходов для достижения этого, которые были обсуждены в дикой природе в течение времени.
Например:
- A List Apart 's article Exploring Footers - by Бобби Ван дер Слуис, 2004
- footerStickAlt - by Крейг Эрскин, 2005
- липкий нижний колонтитул - by Шелли Коул, 2006
- Как сохранить нижние колонтитулы в нижней части страницы - by Мэтью Джеймс Тейлор, 2007
- заставьте нижний колонтитул прилипнуть к нижней части страницы - by Райан Фейт, 2007
- уточненная версия Райана Фейта Липкий нижний колонтитул - by Крис Койер, 2009
- липкие нижние колонтитулы CSS: гибкий путь (который использует таблицы CSS ) - мимо Торбен Хаасе, 2011
- отзывчивый липкий футер (уточненная версия подхода Торбена) - по Джошуа Кук, 2013
- решается Flexbox ' s Sticky Footer - by Филип Уолтон , 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вниз по странице. Следовательно, мы даем#contentamin-heightиз100%.До сих пор ,
#contentзанял100%высоты окна просмотра, таким образом, мы должны подтянуть нижний колонтитул вверх, чтобы поместить его в нижней части страницы. Для этого мы могли бы дать#contentотрицательныйmargin-bottomэквивалентheightнижнего колонтитула. Также сделать конечно, что нижний колонтитул появляется поверх содержимого, мы должныpositionнижний колонтитулrelatively. Демо Здесь.Как можно видеть, когда
#contentрастет по своему содержанию, часть содержимого уходит за нижний колонтитул. Мы могли бы избежать этого, либо добавив разделительный элемент в конце#content, либо используя комбинациюpadding-bottomиbox-sizing: border-box2 который, как предполагается, также поддерживается на 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's height */ padding-bottom: 100px; /* Equivalent to footer's 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's height */ padding-top : 50px; /* Equivalent to header's height */ padding-bottom: 100px; /* Equivalent to footer's height */ box-sizing: border-box; }Обновлено Пример (обратите внимание, что префиксы поставщиков опущены из-за краткости)
Наконец-то, но не в последнюю очередь!В настоящее время все основные современные веб-браузеры поддерживают
box-sizing: border-boxдекларация (включая IE8). Однако если вы ищете традиционный способ, который имеет более широкую поддержку браузера, придерживайтесь использования элементов spacer.
1. Это необходимо, чтобы сделать
min-height: 100%для работы с элементом#content(Поскольку процентное значение относительноheightблока, содержащего коробку, который устанавливается<body>). Также<html>должно иметь явноеheightзаставитьheight: 100%работать над<body>.2.
box-sizing: border-boxделает UAs вычислитьwidth/heightкоробки, включая обивку и бордюры.3. согласно спецификации, абсолютно расположенными элементами являются элементы, имеющие
positionизabsoluteилиfixed.
У тебя почти получилось. То, что вам нужно, - это контейнер.
Вот мой исправленный бит: Jsfiddle Update
Добавьте контейнер div:
<div id="container"> <div id="header"></div> <div id="page"></div> <div id="footer"></div> </div>Затем сделайте положение относительным, а высоту 100%:
#container { height: 100%; position: relative; }И убедитесь, что положение нижнего колонтитула является абсолютным.
Или для тех, кто нашел этот пост в гугле и хочет получить еще более короткий ответ, без оберток (потому что они вам не нужны):
html { height: 100%; } body { min-height: 100%; position: relative; padding-bottom: 3em; } .footer { height: 3em; position: absolute; bottom: 0; }Сделано, страница теперь по крайней мере 100% высоты экрана, и нижний колонтитул находится в нижней части страницы, а не в нижней части "экрана". Если страница длиннее экрана, она все равно будет внизу, и мы сделали это без искусственных "оберточных элементов" или подобных: элемент
bodyуже является оберткой, которая нам нужна=)Единственное предостережение: что поле тела должно быть таким же, как высота нижнего колонтитула, но тогда как отрицательное значение, так как правило "bottom: 0" заставит нижний колонтитул начинаться в нижней части вместо привязки к базовой линии. Затем снова, как CSS, .меньше или .Стил, это тривиально обеспечено.
Сделать это просто:
#header { position: fixed; width:100%; height:100px; top:0px; z-index:2; } #content, #footer { position: relative; /* or leave it static as by default */ z-index:1; } body,div { margin:0; padding:0; /* http://jsfiddle.net/css/normalize.css */ } #content { margin-top: 100px; /* the same value as header's height */ }
But if you want the footer to take full size of the screen while #wrapper is 1000px and centered you would do: <body> <div id="wrapper"> <div id="wrapper-inner"> <div id="header"></div> <div id="content"></div> <div id="footer"></div> </div> </div> </body> html, body { margin:0; padding:0; height:100%; } #wrapper { min-height:100%; position:relative; } #wrapper-inner { margin: 0 auto; width: 1000px; } #content { padding:10px; padding-bottom:80px; /* Height of the footer element */ } #footer { width:100%; height:80px; position:absolute; bottom:0; left:0; }
Comments