Центрирование элементов — одна из самых частых задач в веб-вёрстке, которая десятилетиями вызывала головную боль у разработчиков. С появлением Flexbox эта задача превратилась из сложного квеста в элегантное и простое решение. В этой статье мы разберём все тонкости центрирования div по центру экрана — как по горизонтали, так и по вертикали — используя современный CSS.
Почему Flexbox — это революция
До появления Flexbox разработчики использовали хаки: таблицы, абсолютное позиционирование с transform, отрицательные margin и другие методы, которые были неочевидными и хрупкими. Flexbox (Flexible Box Layout) — это специальный модуль CSS, созданный именно для распределения пространства и выравнивания элементов в контейнере, даже когда их размер неизвестен или динамичен.
Flexbox поддерживается всеми современными браузерами, включая IE11 (с некоторыми префиксами). Для старых проектов может потребоваться fallback.
Базовый рецепт: центрирование в одно действие
Вот минимальный код, который центрирует ваш div и по горизонтали, и по вертикали:
.container {
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
}
Разбираем свойства по косточкам
- display: flex — превращает элемент в flex-контейнер.
- justify-content: center — выравнивает flex-элементы по главной оси (по умолчанию — горизонтально).
- align-items: center — выравнивает по поперечной оси (по умолчанию — вертикально).
- min-height: 100vh — гарантирует, что контейнер займёт как минимум всю высоту окна браузера (viewport height).
Продвинутые сценарии и нюансы
1. Центрирование без фиксированной высоты родителя
Если у родительского контейнера нет высоты, flex-элементы не смогут выровняться по вертикали. Решение — задать высоту через vh, % или position: absolute.
2. Центрирование нескольких элементов
Flexbox одинаково хорошо работает с одним или несколькими элементами внутри контейнера. Они все будут выровнены согласно заданным правилам.
.multi-container {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
gap: 20px;
min-height: 100vh;
}
Свойство gap (или row-gap/column-gap) создаёт отступы между flex-элементами — это современная замена margin для таких случаев.
3. Центрирование с учётом отступов и padding
Помните, что padding контейнера не влияет на выравнивание, но может "сдвинуть" визуальный центр. Всегда проверяйте вёрстку с включёнными границами элементов в DevTools.
Альтернативы и когда их использовать
- Grid — для сложных двумерных раскладок.
- position: absolute + transform — если нужна поддержка очень старых браузеров.
- margin: auto — в сочетании с flexbox даёт дополнительный контроль.
FAQ: Часто задаваемые вопросы
Почему мой div не центрируется по вертикали?
Скорее всего, у родительского контейнера нет высоты. Добавьте min-height: 100vh или height: 100% (если у родителя родителя тоже есть высота).
Flexbox или Grid — что выбрать для центрирования?
Для простого центрирования одного элемента Flexbox проще и логичнее. Grid мощнее, но избыточен для этой конкретной задачи.
Работает ли это в мобильных браузерах?
Да, Flexbox полностью поддерживается всеми современными мобильными браузерами уже много лет.
Как центрировать текст внутри div, который уже центрирован?
Используйте text-align: center для горизонтального выравнивания текста и line-height (если одна строка) или flexbox внутри самого div.
Почему justify-content и align-items, а не align-content?
align-content работает только при многострочном flex-контейнере (flex-wrap: wrap). Для однострочного используйте align-items.