Вертикальное выравнивание всегда было проблемным местом в CSS, так как свойство vertical-align действует только на inline-элементы (состоящие из одной строки) и не работает с блочными элементами. Однако вертикальное выравнивание можно применить к ячейкам таблицы, таким образом мы можем использовать это в наших интересах в браузерах, которые поддерживают свойство display:table;, например в Mozilla и Opera.
Мы также можем приручить IE5-IE7 с помощью условных комментариев, написав для него отдельные правила вертикального центрирования.
Я сделал пример страницы, содержимое которой центрируется по вертикали и горизонтали.
Для начала я покажу что нужно сделать для Мозиллы. Вот листинг основной таблицы стилей:
* {margin:0;padding:0}
/* mac hide \*/
html,body{height:100%;width:100%;}
/* end hide */
body {
background-color: #cccccc;
text-align:center;
min-height:468px;/* для правильных браузеров*/
min-width:552px;/* для правильных браузеров*/
}
#outer{
height:100%;
width:100%;
display:table;
vertical-align:middle;
}
#container {
text-align: center;
position:relative;
vertical-align:middle;
display:table-cell;
height: 468px;
}
#inner {
width: 552px;
background:red;
height: 468px;
text-align: center;
margin:0 auto;
border:1px solid #000;
}
Наш HTML код будет выглядеть так:
<body>
<div id="outer">
<div id="container">
<div id="inner">
<h1>Отцентрированно по вертикали и горизонтали</h1>
</div>
</div>
</div>
</body>
Большинство из вышеупомянутого должно быть Вам знакомо, но нас интересует сейчас свойство display:table; в контейнере #outer. Именно оно говорит браузеру что надо отобразить блочный элемент с характеристиками, присущими таблицам. Это позволит нам использовать свойство vertical-align:center;. Далее мы обьявляем контейнер #container ячейкой таблицы (display:table-cell) и он отцентрируется вертикально относительно #outer.
Внутренний элемент #inner мы центрируем горизонтально с помощью свойства margin:0 auto;. Теперь Mozilla и Opera, отображают все так, как мы задумали. Конечно плохо что мы нуждаемся в дополнительных обертках, но это - самый безопасный способ решения задачи вертикального центрирования. Описанный мной метод всегда оставляет контент во вьюпорте, в отличие от других методов.
IE не понимает свойства display:table; и игнорирует его. Для того чтобы заставить его центрировать страницу по вертикали добавим на страницу код:
<!--[if IE ]>
<style type="text/css">
#container{top:50%}
#inner{top:-50%;position:relative;}
</style>
<![endif]-->
Вертикальное центрирование элементов неизвестной ширины и высоты
Два вышеописанных метода настолько хороши, что немного модифицировав наш код, мы получим решение для вертикального центрирования элементов с неизвестной шириной и высотой. Я не буду описывать модификации, а сразу приведу пример. Появились вопросы? Пишите комментарии!
@ 14 Декабря 2007 в 09:15
А если высота известна, то можно ещё проще делать :)
body,html {height: 100%;}
#example {position: absolute; top: 50%; left: 0; height: 200px; margin-top: -100px;}
P.S. Сделайте нормальную кнопку "отправить", а то её без картинок не видно нифига.
@ 14 Декабря 2007 в 10:15
А Вы уверены что контент не вылезет из вьюпорта если страница развернута не на весь экран? Мне вот кажется, что он уедет за пределы видимой области, хотя можно поробовать поставить свойство min-height и хак для IE 6 ;-)
P.S.: Кнопку поправил, спасибо!
@ 14 Декабря 2007 в 16:18
Ну естественно вылезет, если высота окна будет меньше 200 пикселей :) А вообще, пример оттестирован, работает на нескольких сайтах.
@ 15 Декабря 2007 в 12:09
html, body{
padding: 0; margin: 0;
width:100%; height:100%;
}
#container{
position: absolute;
top: 50%; left: 50%;
width: 400px; height: 300px;
margin-left: -200px; margin-top: -150px;
}
Делаем так и не паримся. И ничего никуда не вылезет.
Если нужна динамическая высота -- паримся.
@ 15 Декабря 2007 в 20:09
Для динамической высоты не надо париться, я все уже расписал!
@ 13 Марта 2008 в 19:32
Какого банана по ссылке на прим с центрированием элементов с нефиксированной высотой пароль требует?
@ 06 Мая 2008 в 19:21
2 tweakker: там не требует пароль, это пример такой))) Ну вот, например, авторизацию отцентрировать.
@ 01 Июня 2008 в 22:33
Спасибо! Очень помогло!
@ 28 Июня 2008 в 20:58
А как быть если внутри блока inner нужно вставить еще один блок, допустим inner2. И в inner2 вставить inner3, и все их центрировать по вертикали?
@ 08 Июля 2008 в 00:00
Народ! Эти примеры оч.сильно глючат в злосчастном IE7.
Выходил из положения элементарно с помощью одной таблицы
_Содержимое_
Проверял в FF, Opera, IE 6-7 везьде работало
По моему и кода меньше
Разве не так?
@ 08 Июля 2008 в 00:02
Код не отобразился... кому оч надо можете в исходнике глянуть ))
@ 28 Июля 2008 в 19:59
@ 28 Июля 2008 в 20:09
Отцентрированно
@ 28 Июля 2008 в 20:10
@ 28 Июля 2008 в 20:19