При изучении стилизации HTML-страниц и механизмов выравнивания элементов средствами CSS, начинающий разработчик, как правило, сначала знакомится со способами горизонтального выравнивания элементов. В их числе, например, text-align: center;
и margin: 0 auto;
. С выравниванием по вертикали возникает больше вопросов. В этой статье разберем пять способов выравнивания элементов в HTML и CSS по вертикали.
У каждого описанного способа есть свои преимущества и недостатки, поэтому подходить к их использованию стоит критически. В определенной ситуации один способ может подходить идеально, а другой — оказаться совершенно бесполезным.
1. У правила для горизонтального выравнивания текста text-align: center;
, которое уже упоминалось выше, есть собрат, который называется vertical-align
. Как и text-align
, vertical-align
выравнивает элементы со строчным или строчно-блочным типом бокса. Отличие в том, что свойство text-align
применяется к родительскому блоку, а vertical-align
необходимо применять непосредственно к выравниваемому элементу.
Свойство vertical-align
удобно применять, когда необходимо, например, выровнять иконку внутри строки или два рядом стоящих строчно-блочных элемента. Важно понимать, что vertical-align
выравнивает элемент относительно содержащей строки, а не относительно ближайших элементов.
Кроме того, свойство vertical-align
можно использовать для того, чтобы выравнивать контент в ячейке таблицы.
2. Для тех, кто не знаком с принципами работы интерлиньяжа и свойством line-height
, может стать откровением, что текст располагается посередине содержащей его строки. Этим можно пользоваться при выравнивании. Предположим, что у вас есть элементарный footer, в котором нужно расположить по центру копирайт:
<div class="footer">
<p class="footer__text">
Copyright - ThriveTalk 2017
</p>
</div>
Допустим, что высота футера равна 80px. Для того, чтобы текст вертикально встал ровно по центру, достаточно написать в CSS следующее:
.footer__text {
line-height: 80px;
}
У этого способа есть недостаток. Его удобно применять, когда вы уверены, что выравниваемый элемент не будет переполняться. В противном случае при переносе строки между текстом появятся большие вертикальные отступы, что почти наверняка станет нежелаемым поведением.
Читайте также: Зачем изучать HTML и CSS, или Когда роботы заменят верстальщиков на рынке труда
3. Для предотвращения нежелаемного поведения, описанного в примере выше, можно использовать метод выравнивания: padding
. Значения padding-top
и padding-bottom
помогут вам не только центрировать по вертикали, но и застраховаться от переполнения. Рассмотрим пример:
<a class="link">
<span>Заказать</span>
</a>
Предположим, вы верстаете кнопку, при нажатии на которую происходит переход на страницу заказа товара. Высота кнопки не должна превышать 50px. Из макета вы выгрузили следующие стили:
.button {
font-size: 16px;
line-height: 20px;
}
Высота контента внутри кнопки равна высоте строки и составляет 20px. Чтобы текст кнопки встал по центру, необходимо распределить по свойствам padding-top
и padding-bottom
оставшееся пространство следующим образом: (50px - 20px) / 2.
В результате получаем следующее:
.button {
padding-top: 15px;
padding-bottom: 15px;
font-size: 16px;
line-height: 20px;
}
Если текст кнопки измениться с «Заказать» на «Заказать товар онлайн» и перестанет помещаться на одной строке, кнопка сохранит нужный вид, а текст внутри неё по-прежнему будет находиться по центру.
Выравнивание при помощи padding
универсально и подходит как для фразовых элементов, так и для выравнивания элементов с блочным типом бокса (но только в некоторых случаях).
4. Еще один инструмент — Flexbox. Внутри flex-контейнера любой элемент, будь то блочный, строчный или даже псевдоэлемент, становится flex-элементом, с которым можно производить любые манипуляции. В этой статье мы не будем подробно останавливаться на flex-свойств, почитать о них можно, например, тут.
У Flexbox есть ряд преимуществ перед обыкновенным выравниванием - в первую очередь это создание крупных сеточных структур и макросеток.
5. А что, если элемент абсолютно спозиционирован? Предположим, что вы сверстали модальное окно, которое нужно спозиционировать не относительно другого элемента, а относительно окна браузера. В этом случае можно использоватьposition: fixed;
.
Стоит отметить, что все описываемые далее действия применимы и в случаях, когда нужно выполнить абсолютное позиционирование внутри другого элемента.
Положением спозиционированных элементов управляют свойства top
, right
, bottom
, left
. Попробуем следующее:
.modal-window {
position: fixed;
top: 50%;
left: 50%;
width: 300px;
height: 200px;
}
В данном случае модальное окно расположено не верно: ровно по центру находится левый верхний угол модального окна, а не его физический центр. Для того, чтобы выполнить его абсолютное позиционирование, изменим положение модального окна с помощью отрицательного margin
:
.modal-window {
position: fixed;
top: 50%;
left: 50%;
width: 300px;
height: 200px;
margin-left: -150px;
margin-top: -100px;
}
У применения свойства margin
в этой ситуации существует один недостаток. При изменении свойств width
и/или height
модального окна вам придется вручную «подкручивать» значения отрицательного margin
, чтобы добиться половины размера его ширины и высоты. Этого можно избежать, используя вместо margin
свойство transform
. А transform: translate(X, Y)
позволяет регулировать смещение элемента относительно исходного положение. Например, так:
.modal-window {
position: fixed;
top: 50%;
left: 50%;
width: 300px;
height: 200px;
transform: translate(-50%, -50%);
В отличие от свойства margin
, значения которого вычисляются от ширины родительского элемента, transform: translate(X, Y)
берет за основу габариты самого элемента — в данном случае, модального окна. А это то, что нам и нужно. В результате, модальное окно будет всегда находиться в центре. Независимо от своих размеров.