Как выровнять по центру в CSS
Способ зависит от того, что центрировать: текст внутри блока или сам блок, и нужно ли ещё и по вертикали.
Как выровнять
Текст, ссылка или кнопка в строкеtext-align
h1 {
text-align: center;
}text-align: center центрирует строки текста и строчные элементы (ссылки, <span>, картинки, кнопки) внутри блока. Свойство пишут родителю: чтобы поставить по центру кнопку, text-align: center задают блоку, в котором она лежит.
Блок по горизонталиmargin: 0 auto
.page {
max-width: 800px;
margin: 0 auto;
}Автоматические отступы слева и справа делят свободное место поровну. Два условия: у блока задана ширина (width или max-width) меньше родителя, и это блочный элемент. Картинке для этого нужен display: block:
.photo {
display: block;
margin: 0 auto;
}По горизонтали и вертикалиFlexbox или Grid
Подойдёт любой из двух способов. Свойства пишут контейнеру — блоку, внутри которого лежит то, что нужно поставить в центр.
Flexbox
.box {
display: flex;
justify-content: center;
align-items: center;
min-height: 300px;
}Всё, что внутри .box, встанет точно в центр. justify-content центрирует по горизонтали, align-items — по вертикали. Без высоты контейнера вертикально центрировать некуда: блок высотой с содержимое.
Центр всего окна — та же запись с min-height: 100vh (вся высота окна). У body при этом уберите стандартный отступ: margin: 0.
Grid
.box {
display: grid;
place-items: center;
min-height: 300px;
}Самая короткая запись: place-items: center центрирует по обеим осям сразу.
Окно поверх страницыposition: fixed
Окно-сообщение, которое висит в центре экрана над содержимым:
.modal {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}top и left по 50 % ставят в центр левый верхний угол блока, а transform сдвигает блок назад на половину его собственного размера.
Какой способ выбрать
| Что нужно отцентрировать | Способ |
|---|---|
| текст, ссылку, кнопку в строке | text-align: center у родителя |
| колонку сайта, картинку | margin: 0 auto и ширина (картинке — display: block) |
| что угодно в центр блока | Flexbox или Grid у родителя и высота |
| окно поверх страницы | position: fixed и transform |
Подводные камни
text-align: centerне двигает блок — он центрирует только содержимое строк. Блок<div>с шириной так не сдвинуть, нуженmargin: 0 auto.margin: autoне центрирует по вертикали в обычном потоке. По вертикали работают Flexbox и Grid (внутри флекс- и грид-контейнераmargin: autoцентрирует и по вертикали).align-items: centerничего не меняет — у контейнера нет высоты, или свойство написано элементу, а не контейнеру.vertical-align: middleработает только для строчных элементов и ячеек таблицы, обычный блок им не отцентрировать.- Устаревший тег
<center>не используйте: браузеры его ещё понимают, но в стандарте HTML он отменён.