CSS: #footer {position: absolute; bottom: 0;} // Mash

Вопрос о том, как сделать подвал внизу экрана/страницы возникает достаточно часто. Казалось бы, что может быть проще:

HTML:
<body>
	<p>content</p>
	<p id="footer">footer</p>
</body>
CSS:
#footer {position: absolute; bottom: 0;}

Все счастливы. Правда, счастье длится лишь до тех пор, пока содержимое страницы не вызывает появления вертикальной полосы прокрутки, наползая на подвал (IE, Mozilla).

Решение:

HTML:
<body>
<div id="all">

	C O N T E N T

	<div id="empty">&nbsp;</div>
	<div id="footer">
		F O O T E R
	</div>
</div>
</body>
CSS:
html, body {height: 100%; margin: 0; padding: 0;}

#all {position: relative; height: 100%;}

html>body #all {height: auto; min-height: 100%;}

#empty, #footer {height: _foo_;}
/* или
	#footer {height: _foo_;}
	#empty {height: _foo_ + _bar_;}
*/

#footer {
	position: absolute;
	left: 0;
	bottom: 0;
	width: 100%;
}

Логика: внутри body со стопроцентной высотой и нулевыми отступами расположен блок #all с высотой 100% и более. Его позиция относительно body высчитывается в соответствии с нормальным расположением (position: relative;). #footer расположен внизу относительно высоты содержащего его блока #all. Так как #footer позиционирован абсолютно (изъят из нормального обтекания), то потребуется «пустой» блок (#empty), который будет служить «толкателем».

Недостаткок: предполагается, что значения высоты #footer и #empty известны.

Для случаев графического (px) подвала и/или известном поведении текста (em) внутри него, такое решение проблемы можно считать оптимальным.

В тех случаях, когда невозможно заранее предсказать высоту подвала, в бой вступает javascript:

CSS:
#empty {visibility: hidden;}
#footer, #empty {height: _foo_;}
/* предполагаемая максимальная высота
   (disabled JavaScript) */

JavaScript:
if (document.getElementById){
	var empt = document.getElementById('empty');
	var foot = document.getElementById('footer');
	empt.style.height = foot.style.height = 'auto';
	empt.innerHTML = foot.innerHTML;
}

Посмотреть:

  • #footer: высота известна (CSS);
  • #footer: высота неизвестна (CSS + JavaScript).

14 октября 2003