Вертикальное центрирование

Горизонтальное центрирование выполняется очень просто и легко. Когда центрируемый элемент является строчным, используем свойство выравнивания относительно родительского элемента (text-align: center). Когда элемент блочный — задаем ему ширину и автоматическую установку левого и правого полей (margin: auto).

Логично, было бы использовать аналогичное свойство vertical-align. Но, к сожалению, vertical-align не действует в блочных элементах (например, параграфах внутри элемента div).

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

Метод line-height

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

По умолчанию свободное пространство будет распределено равномерно сверху и снизу текста. И строка будет отцентрирована вертикально. Часто высоту строки делают равной высоте элемента.

  1. <div id="parent">
  2.         <div id="child">Нужный текст</div>
  3. </div>
  1. #child {
  2.         line-height: 100px;
  3. }

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

Центрирование изображения с помощью line-height

А что если содержание представляет собой картинку? Будет ли выше описанный метод работать? Ответ заключается в еще одной строчке кода CSS.

  1. <div id="parent">
  2.         <img src="image.png">
  3. </div>
  1. #parent {
  2.         line-height: 100px;
  3. }
  4. #parent img {
  5.         vertical-align: middle;
  6. }

Значение свойства line-height должно быть больше высоты изображения.

Метод таблиц CSS

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

Примечание: Таблица CSS не является тем же, что и HTML таблица.

  1. <div id="parent">
  2.         <div id="child">Содержание</div>
  3. </div>
  1. #parent {display: table;}
  2. #child {
  3.         display: table-cell;
  4.         vertical-align: middle;
  5. }

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

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

Недостатком данного метода является то, что он не работает в старых версиях IE. Приходится использовать свойство display: inline-block для вложенного контейнера.

Абсолютное позиционирование и отрицательные поля

Данный метод также работает во всех браузерах. Но он требует, чтобы центрируемому элементу задавалась высота.

В коде примера выполняется одновременное центрирование по горизонтали и вертикали:

  1. <div id="parent">
  2.         <div id="child">Содержание</div>
  3. </div>
  1. #parent {position: relative;}
  2. #child {
  3.         position: absolute;
  4.         top: 50%;
  5.         left: 50%;
  6.         height: 30%;
  7.         width: 50%;
  8.         margin: -15% 0 0 -25%;
  9. }

Сначала устанавливаем тип позиционирования элементов. Затем для вложенного элемента div устанавливаем значения свойств top и left  равными 50%, что соответствует центру родительского элемента. Но в центр попадает левый верхний угол вложенного элемента. Поэтому нужно поднять его вверх (на половину высоты) и сдвинуть влево (на половину ширины), и тогда центр совпадет с центром родительского элемента. Так что знание высоты элемента в данном случае необходимо. Затем задаем элементу отрицательные значения верхнего и левого полей равными половине высоты и ширины соответственно.

Данный метод работает не во всех браузерах.

Абсолютное позиционирование и растягивание

  1. <div id="parent">
  2.         <div id="child">Содержание</div>
  3. </div>
  1. #parent {position: relative;}
  2. #child {
  3.         position: absolute;
  4.         top: 0;
  5.         bottom: 0;
  6.         left: 0;
  7.         right: 0;
  8.         width: 50%;
  9.         height: 30%;
  10.         margin: auto;
  11. }

Идея данного метода заключается в том, чтобы растянуть вложенный элемент до всех 4 границ родительского элемента с помощью установки свойствам top, bottom, right, и left значения 0.

Установка автоматического формирования полей по всем сторонам приведет к заданию равных значений по всем 4 сторонам и выведет наш вложенный элемент div по центру родительского элемента.

К сожалению, данный метод не работает в IE7 и ниже.

Равные отступы сверху и снизу

В данном методе явно задаются равные отступы сверху и снизу от родительского элемента.

  1. <div id="parent">
  2.         <div id="child">Содержание</div>
  3. </div>
  1. #parent {
  2.         padding: 5% 0;
  3. }
  4. #child {
  5.         padding: 10% 0;
  6. }

В коде CSS примера отступы сверху и снизу задаются для обоих элементов. Для вложенного элемента установка отступов будет служить для вертикального центрирования. А отступы родительского элемента будут центрировать вложенный элемент в нём.

Для динамического изменения размеров элементов используются относительные единицы измерения.  А для абсолютных единиц измерения придется проделать расчеты.

Например, если родительский элемент имеет высоту 400 px, а вложенный элемент — 100px, то необходимы отступы 150px сверху и снизу.

150 + 150 + 100 = 400

Использование % позволяет расчеты оставить браузеру.

Данный метод работает везде. Обратной стороной является необходимость в расчетах.

Примечание: Данный метод работает за счет установки внешних отступов элемента. Вы можете также использовать поля внутри элемента. Решение о применении полей или отступов нужно принимать в зависимости от специфики проекта.

Плавающий div

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

  1. <div id="parent">
  2.         <div id="floater"></div>
  3.         <div id="child">Содержание</div>
  4. </div>
  1. #parent {height: 250px;}
  2. #floater {
  3.         float: left;
  4.         height: 50%;
  5.         width: 100%;
  6.         margin-bottom: -50px;
  7. }
  8. #child {
  9.         clear: both;
  10.         height: 100px;
  11. }

Мы смещаем пустой div влево или вправо и задаем для него высоту 50% родительского элемента. Таким образом, он будет заполнять верхнюю половину родительского элемента.

Так как данный div является плавающим, то он удаляется из обычного потока документа, и нам нужно отменить обтекание текстом для вложенного элемента. В примере используется clear: both, но вполне достаточно использовать тоже направление, что и смещение плавающего пустого элемента div.

Верхняя граница вложенного элемента div находится непосредственно под нижней границей пустого элемента div. Нам нужно сместить вложенный элемент вверх на половину высоты плавающего пустого элемента. Для решения задачи используется отрицательное значение свойства margin-bottom для плавающего пустого элемента div.

Данный метод также работает во всех браузерах. Однако его использование требует дополнительного пустого элемента div и знаний о высоте вложенного элемента.