Html подвал – Как избежать появления пустого места под подвалом, при ширины изменении окна?

Прижимаем подвал(footer) к низу страницы

Довольно часто появляется необходимость прижать подвал к низу страницы, даже если высота контента сайта меньше высоты экрана. В этом нам помогут такие прекрасные свойства, как position и bottom.

На первый взгляд задача очень простая — просто поместить один div внизу страницы. Однако стоит учесть, что наполнение контентом может быть меньше страницы.

Начнем с самого просто, допустим у нас есть <div> подвала с каким-то наполнением:

 

<div>Коппирайт и прочая информация о сайте, в подвале.</div>

 

Этот footer обязательно помещать перед закрывающим тэгом </body>, не помещая дополнительно его внутрь других дивов.

Вот, как будет выглядеть CSS стиль для этого footer, чтобы он был прижат всегда к низу страницы:

 

.footer {position:absolute; /* задаем элементу абсолютное позициониование */
        bottom:0; /* прижимаем нижнюю границу элемента к низу экрана */
        left:0; /* прижимаем левую границу элемента к левому краю экрана */
        /* далее идут остальные свойства */ 
        padding:20px 0; background:#993333; color:#fff; text-align:center; width:100%;}

 

Абсолютное позиционирование заставляет <div> размещаться на странице, полностью игнорируя другие элементы. bottom и left задают координаты этого дива на экране.

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

Чтобы избавиться от этих двух проблема, нужно сделать дописать CSS стиль для <html> тэга, да-да, именно <html>, а не <body>, иначе все не будет работать как надо, вот как будет выглядеть этот стиль:

 

html  {    
            position:relative; /* относительное позиционнирование */
            min-height:100%; /* минимальная высота */
        }

 

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

Проблема с перекрытием контента подвалом решается разными путями, но самый хороший, по моему мнению, добавить тэгу <body> значение padding снизу, равное или чуть больше высоте подвала, чтобы контент не вплотную прилипал к подвалу, примерно такой стиль:

 

body {padding:0 10% 60px 10%;}

 

Теперь все, подвал будет всегда внизу, он не будет заставлять появляться полосу прокрутки, если контента меньше. Проще говоря, это универсальный метод. Теперь я приведу пару примеров использования этого метода, чтобы вы сами убедились в его действии.

У нас есть примерно такой html код:

 

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>Страница</title>
    <link rel="stylesheet" href="/css/template.css" type="text/css" />
</head>
<body>
    <div>Sed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt, explicabo. Nemo enim ipsam voluptatem, quia voluptas sit, aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos, qui ratione voluptatem sequi nesciunt, neque porro quisquam est, qui dolorem ipsum, quia dolor sit, amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt, ut labore et dolore magnam aliquam quaerat </div>
    <div>Sed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt, explicabo. Nemo enim ipsam voluptatem, quia voluptas sit, aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos, qui ratione voluptatem sequi nesciunt, neque porro quisquam est, qui dolorem ipsum, quia dolor sit, amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt, ut labore et dolore magnam aliquam quaerat </div>
    <div>Коппирайт и прочая информация о сайте, в подвале.</div>
</body>
</html>

 

И такой CSS код:

 

html {position:relative; min-height:100%;}
body {margin:0 0 0 0; padding:0 10% 60px 10%; font-size:16px; display:block;}
.footer {position:absolute; 
        bottom:0; 
        left:0; 
        padding:20px 0; background:#993333; color:#fff; text-align:center; width:100%;}

 

Вот как будет выглядеть это все, если контента меньше, чем высота экрана:

А вот пример того, как будет выглядеть сайт, если наполнение сайта больше высоты экрана(отличие только в HTML коде, добавил еще несколько абзацев с текстом):

Как прижать подвал (footer) к низу экрана

Всем привет!

Сайт выглядит эстетично, если все его элементы находятся на своих местах. Однако часто бывают случаи, когда все вроде бы нормально, но что-то все-таки не так… Например, если страница короткая, футер не прижат к низу страницы, а находится там, где ему и положено — после основного блока сайта. Это смотрится не очень красиво.

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


Итак, к подвалу мы выставим следующие требования:

  • подвал прижат к низу экрана при высоте окна браузера больше высоты страницы не зависимо от контента;
  • футер находится на положенном ему месте при объеме контента больше, чем высота окна браузера;
  • работает в во всех популярных браузерах;
  • надежность — не зависит от сложности верстки.

Для примера возьмем простую страницу, состоящую из двух основных блоков: основного (main) и подвала (footer). Сделаем чтобы основной блок занял всю площадь окна браузера независимо от количества контента, при этом футер прижмем к низу экрана так, чтобы в браузере не появилась вертикальная полоса прокрутки. Как делаем:

Шаг 1

Делаем 2 блока: основной (main) и подвал (footer). Основной контейнер растягиваем на всю высоту экрана браузера (min-height), подвалу жестко указываем высоту (height).

При этом общая высота сайта составит высота экрана + высота подвала.

Шаг 2

Отрицательным отступом (margin-top) «въезжаем» в основной блок, чтобы высота сайта составляла только 100% высоты экрана.

При таком расположении блоков и при достаточном количестве контента (например, текста) в основном блоке, возможны накладки контента в основном блоке на подвал:

Шаг 3

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

Теперь, если контента будет много, он будет двигать пустой блок вниз. А это будет опускать и подвал, не давая налезть на него контенту.

Смотрим как это выглядит в коде:

<html>
<head>
    <title>Футер прижат к низу</title>
    <style type="text/css">
        * {margin: 0; padding: 0;} /* обнуляем отступы */
        body {
            background: #fff;}
        html,body {
            height: 100%; /* задаем высоту тела документа */}
        .main { /* основной блок, который должен растянуться до подвала */
            background: #999; /* цвет фона основного блока (для наглядности) */
            min-height: 100%; /* задаем минимальную высоту основного блока */}
        * html .main { /* хак для ie6 */
            height: 100%; /* для ие6, т.к. не понимает min-height */}
        .hFooter { /* это распорка в основном блоке - резервируем место для подвала */
            height: 40px; /* высота нашего подвала */}
        .footer { /* подвал */
            background: #0000CC; /* цвет фона подвала (для наглядности) */
            color: #fff;
            height: 40px; /* высота подвала */
            margin-top: -40px; /* делаем отрицательный отступ по высоте равный высоте подвала, чтобы четко вписаться в размер экрана */}
    </style>
</head>
<body>
    <div>
        Это основной блок
        <div></div>
    </div>
    <div>Это подвал</div>
</body>
</html>

Результат этого примера.

Заметка: при использовании блочной верстки и плавающих основных блоков (колонок) для .hFooter следует добавить clear: both, чтобы подвал расположился под колонками.:

.hFooter {
    clear: both;
    height: 40px;}

Если Вы уже немного освоили CSS, тогда может возникнуть вопрос: «Зачем использовать дополнительный элемент, если можно воспользоваться padding-bottom?».

Ответ — так просто его тут использовать нельзя, так как размер блока равен его размерам + ширина внутренних отступов + ширина границ. Связка min-height: 100% и padding-bottom даст высоту сайта больше высоты экрана. В итоге даже при отсутствии контента вовсе, подвал будет за пределами экрана.

Недостаток данного приема — это использование дополнительного пустого элемента hFooter. В реальных условиях (когда содержимое сайта не пустое и применяется блочная верстка) этого можно избежать применив метод clearfix — этот прием поможет очистить поток без использования дополнительного элемента, а чтобы контент не налез на футер, пропишем в колонках padding-bottom.

Проблемы с z-слоями

В вышеописанном приеме футер поднимали отрицательным отступом вверх. При этом возникает потенциальная проблема с z-слоями. Например, нам нужно показать всплывающее окно (пускай это будет div), которое будет позиционироваться относительно контейнера main.

HTML:

<div>
    [...]
    <div>
        [...]
    </div>
</div>
<div>
    [...]
</div>

CSS:

.main {
    position: relative; /* чтобы дочерние элементы позиционировались относительно этого блока */
    z-index: 1; /* z-index меньше чем у футера, чтобы тот был виден */}
.popup {
    position: absolute;
    z-index: 100;
    [...]}
.footer {
    height: 50px;
    margin-top: -50px;
    position: relative; /* чтобы можно было задать z-index */
    z-index: 2; /* больше, чем у main чтобы быть видимым */}

Все хорошо до тех пор пока у нас не пересекаются всплывающее окно и подвал (а такая ситуация довольно часто возникает) — вот тут начинаются проблемы. Не смотря на то, что у всплывающего окна наибольший z-index, оно будет перекрываться футером, т.к. родитель popup имеет z-index меньший, чем у подвала:

В этом случае нужно искать возможность позиционировать окно не относительно main, а относительно какого-либо другого дочернего элемента, который расположен внутри main. Таким образом, избавимся от указания z-index для main и footer. Но такой вариант не всегда возможен, потому рассмотрим второй вариант прижатия футера.

Решение 2 — абсолютное позиционирование

Идея похожа на решение 1:

  • Растягиваем основной блок на всю высоту экрана;
  • Резервируем место для подвала;
  • Относительно основного блока позиционируем подвал в самый низ абсолютным позиционированием.

HTML:

<div>
    [...]
    <div>
         [...]
    </div>
</div>

CSS:

html, body {
    height: 100%;}
.main {
    min-height: 100%;
    position: relative; /* чтобы дочерние элементы позиционировались относительно этого блока */}
.footer {
    height: 50px;
    position: absolute;
    left: 0;
    bottom: 0;
    width: 100%;}
* html .footer {
    bottomy:expression(parentNode.offsetHeight % 2 ? style.bottom="-1px" : style.bottom="0px"); /* хак для ие6, у которого есть косяк со смещением на 1px */}

Такой подход решит проблему с всплывающими окнами, т.к. и footer и popup будут иметь общего родителя, а значит с z-слоями сюрпризов не будет.

Недостаток обоих методов — оба метода годятся только для фиксированного по высоте подвала.

На сегодня все. Теперь Вы знаете, как прижать футер к низу экрана разными способами и какие при этом могут возникнуть проблемы.

Подписываемся на обновления и ждем новых интересных публикаций. Пока.

 

Как прижимать подвал к нижней части браузера

Когда-то давно я написал простую подробную статью про трёхколоночную вёрстку и про то, как прижимать футер к низу страницы, а если быть точнее — нижнему краю браузера. Давно было дело. А сегодня меня мой друг попросил скинуть ссылку на ту статейку. И я подумал, а почему бы не поделиться ею здесь, даже не смотря на то, что там всё достаточно ясно.

Не так давно я давал код в статье Как сэкономить время! Заготовка для сайта «Стартовый набор». Собственно то, что будет описано ниже — есть часто того, что было сказано в той статье. Только более подробно и обособлено=).

 

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

Прижимаем footer к низу экрана

<div>
     <div>Просто обычный контент</div>
     <div>&nbsp;</div>
</div>
<div>
     Просто подвал сайта
</div>

Выделяется всего два главных контейнера: total и footer. Со вторым всё понятно, там будет контент чисто подвала. А вот первый, тут есть хитрость. Мы разделяем его на два: content и footer_space. В первом будет содержаться вся информация сайта (кроме подвала), а второй — он будет резервировать место для подвала сайта.
Посмотрим код стилей.

<style>
html {
height: 100%;
}
body {
min-height:100%;
height: 100%;
}
#total {
height: auto !important;
min-height:100%;
height: 100%;
}
#footer_space {
height: 25px;
clear: both;
}
#footer {
height: 25px;
clear: both;
margin-top: -25px;
}
</style>

Собственно приведены только обязательные стили. Обратите внимание на параметры высоты и отступа в footer_space и footer — в примере они равны 25px. Эти три параметра всегда должны быть равны одному значению, плюс контент в подвале не должен иметь бОльшей высоты.

 

В завершении

Этот способ был оправдан ни один раз, до сих пор им пользуюсь. Однако есть ещё одна маленькая хитрость, касающаяся кроссбраузерности. Иногда нужен подвал достаточной высоты, чтобы в нём приходилось равнять текст по высоте. Естественно лучше всего делать это через padding. И мы начинаем прописывать для тега футера, к примеру, padding-top: 5px. И при этом, поскольку мы по сути увеличили высоту контейнера на 5px, уменьшаем значение height футера на эти же 5px.

Казалось бы всё теперь должно быть окей. А вот нифига. Кажется шестой ишак показывает нам дулю в кармане и в итоге мы видим не то, что нужно. Выход один. В контейнер footer необходимо вложить ещё один контейнер, с каким-то другим именем и вот уже ему задавать padding. Либо таблицу добавлять с вертикальным выравниванием по центру.

Пример работы данного кода можно увидеть по ссылке.

UPD: В 10 опере есть своя приблуда (спасибо svetkin за то, что заметил). Предложенный способ не работает, но будет работать, если вынести все стили в отдельный CSS файл. Так что будьте внимательны=)

CSS, html, кроссбраузерность

Понравилась статья или журнал? Подписывайся на продолжение!

Похожие записи:

Тег | HTML справочник

HTML теги

Значение и применение

Тег <footer> (нижний колонтитул) содержит информацию, которая обычно помещается в нижнем колонтитуле страницы, например сведения об авторских правах, другую правовую информацию, некоторые ссылки для навигации по сайту и тому подобное.

Обращаю Ваше внимание, что на количество тегов <footer> на одной странице ограничений не накладывается, вы можете, допустим, поместить нижний колонтитул внутри тега <article>, чтобы хранить в нем информацию, относящуюся к статье, например сноски, ссылки или выписки.

<body>
	<h2>Важный заголовок</h2> 
	<article> <!-- начало первой статьи -->
		<h3>Статья о бытие</h3> 
		<p>Информация про бытие...</p>
		<footer>Сноски, ссылки и тому подобное <!-- "подвал" статьи -->
			<address>Информация об авторе статьи</address>
		</footer>
	</article><!-- конец первой статьи -->
	<article> <!-- начало второй статьи -->
		<h3>Статья о бытие 2</h3> 
		<p>Информация про бытие 2...</p>
		<footer>Сноски, ссылки и тому подобное <!-- "подвал" статьи -->
			<address>Информация об авторе статьи</address>
		</footer>
	</article> <!-- конец второй статьи -->
	<footer>сведения об авторских правах, навигация по сайту, счетчики... <!-- "подвал" сайта -->
		<address>Контактные данные автора сайта</address>
	</footer>
</body>
Пример размещения тега <footer> на странице.

Тег <div> имеет довольно общий характер — это просто элемент на уровне блока, используемый для разбиения страницы на разделы. Одна из целей HTML 5 заключается в предоставлении в распоряжение разработчиков широкого выбора из других, семантически более осмысленных тегов.

Рис. 43 Человек, который использует только тег <div>.

HTML 5 включает в себя множество различных тегов, чьи имена отражают тип их содержимого, и эти теги могут использоваться вместо тега <div>. HTML 5 предлагает новые блочные семантические элементы для определения различных частей веб-страницы, вы можете детально с ними познакомиться в статье учебника HTML 5 «Теги разметки страницы».

Поддержка браузерами

Пример использования

Рассмотрим пример в котором сделаем простую разметку для сайта, используя современный стандарт гипертекстовой разметки HTML5.

<!DOCTYPE html>
<html>
	<head>
		<title>Разметка страницы</title>
	</head>
	<body>
		<header style = "background-color:khaki; height:100px">
			<p>Верхний колонтитул (тег <header>)</p>
		</header>
		<nav style = "background-color:coral; height:75px">
			<a href = "#">Ссылка 1</a> |
			<a href = "#">Ссылка 2</a> |
			<a href = "#">Ссылка 3</a> |
		<p>Панель навигации (тег <nav>)</p>
		</nav>
		<aside style  = "float:right; width:200px; height:250px; background-color:tan">
			<p>Справа мы разместили тег <aside></p>
		</aside>
		<main style = "height:250px">
			<h2>Главный заголовок сайта</h2>
			<p>Основное содержимое (тег <main>)</p>
			<section style = "background-color:grey; height:75px">
				<h3>Заголовок второго уровня</h3>
				<p>Раздел 1 (тег <section>)</p>
			</section>
			<section style = "background-color:grey; height:75px">
				<h3>Заголовок второго уровня</h3>
				<p>Раздел 2 (тег <section>)</p>
			</section>
		</main>
		<footer style = "background-color:khaki; height:80px">
			<p>Нижний колонтитул (подвал) тег <footer></p> 
			<address>Пример с сайта basicweb.ru</address>
		</footer>
	</body>
</html>

Обратите внимание, что практически к каждому элементу для демонстрации мы применили встроенный CSS стиль, применение встроенных стилей не является хорошей практикой, научиться грамотно применять стили вы можете после изучения языка HTML 5 в Учебнике CSS 3.

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

  • Для элемента <header> (верхний колонтитул) мы задали цвет заднего фона khaki и установили высоту элемента равную 100 пикселям.
  • Следующим на странице мы разместили элемент <nav> (навигация), для которого задали те же встроенные CSS свойства, но указали цвет заднего фона coral, а высоту элемента 75 пикселей.
  • Далее мы разместили элемент <aside>, который мы сделали плавающим и сместили в правую сторону (CSS свойство float со значением right), задали ему цвет заднего фона (tan), ширину (200 пикселей) и высоту (250 пикселей). Как вы можете заметить другие элементы его обтекают, не смотря на то, что они блочные. Таким образом происходит верстка плавающими элементами. Подробно изучить работу с плавающими элементами вы можете в учебнике CSS в статье «Плавающие элементы».
  • Добавили на страницу элемент <main> в который мы добавили заголовок первого уровня (тег <h2>). Прдеполагается, что внутри этого элемента будет содержаться основной контент.
  • Внутри элемента <main> мы добавили два тематических раздела (тег <section>), поместили внутри этих элементов заголовки второго уровня (тег <h3>), задали им цвет заднего фона grey и высоту блоков по 75 пикселей.
  • После основного содержимого мы разместили элемент <footer> (нижний колонтитул), по аналогии с предыдущими элементами задали ему цвет заднего фона (khaki) и высоту (80 пикселей). Внутри него разместили тег <address>, в котором указали контактные данные, которые по умолчанию отображаются курсивом.

Результат нашего примера:

Разметка страницы на HTML 5.

Значение CSS по умолчанию

footer {
display: block;
}

Поддержка глобальных атрибутов

Элемент поддерживает «глобальные атрибуты».

Атрибуты событий

Элемент поддерживает «атрибуты событий».

HTML теги

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *