Menu

Как выровнять div по центру в CSS: все способы с замером

Все способы выровнять div по центру по горизонтали, по вертикали или сразу по обеим осям: flexbox, grid, margin auto, абсолютное позиционирование с transform, inset с margin auto и align-content. Каждый работает вживую и сам измеряет свое центрирование, а таблица подскажет, когда какой использовать.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

Короткий ответ

Чтобы выровнять div по центру внутри родителя сразу по горизонтали и по вертикали, сделайте родителя сеткой и центрируйте ее содержимое:

.parent {
  display: grid;
  place-items: center;
  min-height: 200px; /* the parent needs room to center in */
}

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

Все шесть показывают 0px по обеим осям (рамка сцены 1px одинакова со всех сторон, поэтому центр не сдвигает). Измените ширину или текст блока и запустите снова: способы, которые не зависят от фиксированного размера, остаются на 0.

Какой способ выбрать

СпособЦентрируетНужен ли дочернему элементу фиксированный размер?Лучше всего для
Grid place-items: centerОбе осиНетВыбор по умолчанию: один дочерний элемент в блоке
Flexbox justify-content + align-itemsОбе осиНетРяд или колонка элементов, центрированных группой
margin: auto во flex- или grid-родителеОбе осиНетЦентрирование одного элемента, когда соседи размещены иначе
margin: 0 autoТолько по горизонталиwidth или max-widthКонтейнеры страницы, статьи, формы в обычном потоке
Absolute + translate(-50%, -50%)Обе осиНетНаложения, бейджи и модальные окна поверх другого содержимого
Absolute + inset: 0; margin: autoОбе осиДа, ширина и высотаДиалоги фиксированного размера
align-content: center у блокаПо вертикалиНетВертикальное центрирование без смены display у родителя

Способ 1: flexbox

Flexbox центрирует по двум осям двумя свойствами. justify-content отвечает за главную ось (горизонталь в строке), а align-items за поперечную:

С несколькими дочерними элементами flexbox центрирует их группой, оставляя в строке. Здесь он выигрывает у grid, который выстроил бы три элемента в одну центрированную колонку. Все значения выравнивания разобраны на странице про justify-content.

Способ 2: grid

place-items: center это сокращение для align-items: center плюс justify-items: center. У grid-контейнера с одним дочерним элементом оно центрирует этот элемент в обоих направлениях:

min-height вместо height позволяет родителю вырасти, если карточка станет выше 180px, вместо того чтобы карточка переполнила его.

Способ 3: margin: 0 auto (по горизонтали)

Блочный элемент шириной меньше контейнера можно выровнять по центру по горизонтали автоматическими боковыми отступами. Браузер делит свободное пространство поровну между двумя сторонами:

Второй блок заполняет всю ширину, поэтому свободного пространства нет и ничего не сдвигается. Это обычная причина, по которой margin: 0 auto «не работает». Кроме того, в обычном потоке он центрирует только по горизонтали; вертикальные auto-отступы там становятся 0. Зато внутри flex- или grid-родителя margin: auto центрирует в обоих направлениях, это третий блок в сравнении выше.

Способ 4: абсолютное позиционирование и transform

Когда элемент должен лежать поверх другого содержимого (бейдж на фотографии, модальное окно над страницей), спозиционируйте его абсолютно на 50% и сдвиньте назад на половину собственного размера:

top: 50%; left: 50% ставит левый верхний угол элемента в центр. Проценты в translate() считаются от собственного размера элемента, поэтому -50% сдвигает его назад на половину ширины и высоты, какими бы они ни были. Родитель должен быть позиционирован (position: relative), иначе элемент центрируется по странице. Позиционирование разобрано на странице про position.

Вариант для элементов известного размера: position: absolute; inset: 0; margin: auto; плюс width и height. Автоматические отступы делят пространство со всех четырех сторон.

Способ 5: align-content у обычного блока

align-content: center теперь работает и у обычных блочных контейнеров, а не только у flex и grid. Он центрирует содержимое по вертикали, не меняя раскладку дочерних элементов:

.parent {
  min-height: 200px;
  align-content: center;   /* vertical centering, still display: block */
}
.child {
  max-width: 300px;
  margin-inline: auto;     /* horizontal centering */
}

Поддерживается в актуальных Chrome, Firefox и Safari. Старые браузеры его игнорируют, поэтому если их нужно поддерживать, используйте grid.

Центрирование на весь экран

Чтобы выровнять диалог по центру окна просмотра независимо от прокрутки, объедините фиксированный полноэкранный слой с grid:

.overlay {
  position: fixed;
  inset: 0;                     /* covers the viewport */
  display: grid;
  place-items: center;
  background: rgb(0 0 0 / 50%);
}

Чтобы центрировать содержимое всей страницы по вертикали, задайте родителю min-height: 100dvh, а не 100vh: на телефонах 100vh включает область под панелями браузера, и «центр» оказывается слишком низко.

Центрирование текста это другая задача

Все выше центрирует блок. Чтобы выровнять по центру текст внутри блока, задайте ему text-align: center, как показано на странице выравнивание текста по центру в HTML. Часто нужно и то и другое: grid, чтобы центрировать карточку, и text-align, чтобы центрировать строки внутри нее.

Частые ошибки

  • Родитель без высоты. Для вертикального центрирования нужно свободное пространство; у родителя, который сжимается по содержимому, его нет.
  • margin: 0 auto у блока во всю ширину. Сначала задайте width или max-width.
  • margin: auto для вертикального центрирования в обычном потоке. Вертикальные auto-отступы там равны 0; используйте flex или grid.
  • Абсолютное центрирование без позиционированного родителя. Элемент центрируется по странице, а не по блоку.
  • align-items: center у дочернего элемента. Свойства выравнивания задаются родителю (flex- или grid-контейнеру), кроме margin: auto и align-self.
  • text-align: center, чтобы центрировать блок. Он центрирует строчное содержимое (текст, изображения, дочерние inline-block), а не блочный дочерний элемент.

Часто задаваемые вопросы

Как выровнять div по центру по горизонтали и вертикали?

Сделайте родителя сеткой и центрируйте ее содержимое: .parent { display: grid; place-items: center; }. Вариант на flexbox: display: flex; justify-content: center; align-items: center;. В обоих случаях родителю нужна высота больше, чем у div.

Как выровнять div по центру только по горизонтали?

Задайте ему ширину и автоматические боковые отступы: .box { width: 300px; margin: 0 auto; } (или max-width для адаптивного блока). margin-inline: auto это то же самое в логических свойствах.

Почему margin: 0 auto не центрирует div?

У div нет ширины меньше контейнера, поэтому нет свободного пространства, которое можно поделить (блок по умолчанию заполняет всю ширину). Задайте width или max-width. Кроме того, он не действует на строчные элементы и никогда не центрирует по вертикали в обычном потоке.

Почему div не выравнивается по центру по вертикали?

Родитель высотой только в свое содержимое, поэтому лишнего пространства для центрирования нет. Задайте родителю высоту (или min-height), а затем используйте центрирование через grid или flexbox.

Какой самый простой способ выровнять div по центру?

display: grid; place-items: center; у родителя: два объявления, обе оси, дочерний элемент любого размера. Flexbox используйте, когда родитель заодно выстраивает в ряд другие элементы.

Как выровнять текст по центру внутри div?

Задайте div text-align: center для текста и строчного содержимого. Центрирование самого div и центрирование текста внутри него это две разные задачи.

Coddy programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ