Кирилл Мыльников

Frontend разработчик в Usetech

Всем привет, с вами Кирилл Мыльников, frontend разработчик компании Usetech.

Сегодня я хочу рассказать о вертикальном и горизонтальном центрировании CSS (Cascading Style Sheets). В сети есть много статей на эту тему, но я хочу выделить все виды горизонтального и вертикального центрирования с примерами.

Тема довольно популярная для тех, кто просто верстает или занимается полноценной frontend-разработкой (ведь нам всегда нужно что-то центрировать).

Существует множество способов, как нужно отцентрировать элемент, в тех или иных ситуациях, каждый способ по своему хорош.

В этой статье я разберу следующие виды центрирования:

— Горизонтальное центрирование;
— Вертикальное центрирование;
— Горизонтальное и вертикальное центрирование.

Начнём.

Горизонтальное центрирование

1. Данное свойство подходит только для инлайновыйх (inline) элементов, достаточно указать text-align: center родителю.

Пример.

2. Для центрирования блочных элементов свойство text-align: center уже не подойдет. Есть простое распространённое свойство margin: 0 auto. Всё, что нам нужно, это знать ширину блока, а свойство margin 0 auto задаст следующие значения: сверху и снизу будет 0, а по бокам размеры будут заданы автоматически и блочный элемент встанет по центру.

Пример.

3. Центрирование через margin это, конечно, хорошо, но есть ещё гибкое свойство display: flex. Нам нужно задать данное свойство родителю display: flex и justify-content: center и justify-content: center — выравнивает элемент по центру.

Пример.

4. Следующее свойство — это display: grid.

Алгоритм действий как с display: flex: задать данное свойство родителю и указать justify-content: center. 

Сегодня свойства grid и flexbox очень популярны в web разработке. Далее я покажу, как при помощи этих свойств можно центрировать элементы по горизонтальной и вертикальной осям.

Пример.

5. Сейчас я покажу необычное сочетание свойств text-align + display: inline-block.
Да, так тоже можно отцентрировать блочный элемент или элементы, если вам это необходимо. В самом первом примере я говорил, что свойство text-align применяется только для инлайновых элементов, но если мы укажем свойство блочному элементу display: inline-block, то он станет блочно-строчным. Это означает, что свойство text-align станет доступным и элемент встанет по центру.  

Небольшая подсказка: display: inline-block нужно будет задавать не родительскому блоку, а каждому из блоков, к которым мы хотим применить данное свойство. И вновь показываю на примере

Мы разобрались с горизонтальным центрированием, теперь перейдём к вертикальному.

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

1. Данное свойство подходит для таблиц — это vertical-align: middle.

При использовании этого типа центрирования нужно учитывать следующие условия

  • Прописываем display: table родителю;

  • Дочернему элементу должны прописать display: table-cell, чтобы элемент стал ячейкой;

  • Прописываем ячейке свойство vertical-align: middle и всё, элемент становится по центру.

Пример.

2. Есть такой случай, когда высота центрируемого элемента известна, а высота родителя может быть любой. Здесь мы можем применить абсолютное позиционирование. Сейчас по пунктам разберём, что конкретно нужно сделать.

  • Задать дочернему элементу position: absolute и опустить top: 50%;

  • Так как у дочернего элемента высота может быть любая, мы должны эту высоту разделить на 2 и результат прописать в margin-top в отрицательном значении.

Пример.

3. Когда нам нужно центрировать строку уже с известной высотой, мы просто можем указать line-height и указать ту же высоту.

Пример.

4. Центрируем с помощью внутренних отступов (padding):

  • Элемент должен быть строчным;

  •  Элемент должен помещаться в одну строку.

Пример.

5. Ещё один способ вертикального центрирования с помощью vertical-align. Я рассматривал это свойство выше, но на примере с таблицами. Помимо этого, свойство ещё работает с display: inline/inline-block. Проще говоря, с инлайновыми элементами.

Вы должны учесть следующие условия:

  • Высота родителя должна быть известна, а центрируемого элемента нет;

  • Свойство line-height наследуется, поэтому надо знать корректную высоту строки.

Пример.

6. Разберём еще один случай, когда высота центрируемого элемента неизвестна. Здесь нам снова поможет абсолютное позиционирование. Давайте подробно опишем, что мы должны сделать.

  • Указываем дочернему элементу position: absolute и элемент опускаем в top: 50%;

  • Затем в нашем элементе мы прописываем свойство transform: translate (-50%) и всё, наш элемент находится на центре.

Пример.

7. Способ вертикального центрирования с помощью свойства display: flex. С этим свойством можно отцентровать элементы по вертикали. Для этого необходимо задать  родителю следующие свойства: display: flex, flex-direction: column, align-items: center.

Пример.

8. Способ вертикального центрирования с помощью display: grid. В случае с вертикальным центрированием тут всё намного проще, чем с flexbox. Нам нужно указать родителю следующие свойства: display: grid и align-items: center

Пример.

9. Следующий случай, когда высота дочернего элемента неизвестна и родитель неизвестен. Чтобы задать центрирование, нам нужно:

  • Дочернему элементу задать position: absolute, top: 0, bottom: 0, в результате чего он растянется на всю высоту внешнего блока;

  • Задаем значение margin: auto 0 дочернему элементу для вертикальных отступов внутреннего блока.

Пример

10. Заключительный способ в вертикальном центрировании: если неизвестна высота родителя и дочернего элемента, то нам поможет псевдоэлемент before.

  • Родителю указываем псевдоэлемент before, прописываем display: inline-block и указываем высоту в 100%. Таким образом мы занимаем всю допустимую высоту;

  • Центрируемый блок выравниваем по центру с помощью vertical-align: middle.

Пример.

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

Пришло время для центрирования элементов по вертикали и горизонтали. Давайте рассмотрим на конкретных примерах.

1. Если есть случаи, когда высота и ширина элемента неизвестны, нужно сделать следующее: указать дочернему элементу свойства position: absolute, top: 50%, left: 50% и transform: translate(-50%, -50%).

Пример.

2. Мы возвращаемся к flexbox, который выручает нас как никто другой. Нам нужно знать высоту и задать такие свойства: display flex; justify-content: center, align-items: center.

Пример.

3. Grid тоже не сидит на месте: свойства почти идентичны, но мы задаем display: grid вместо flex соответственно. Перед использованием grid посмотрите поддержку данного свойства в браузерах.

Пример.

4. Бывают ситуации, когда ширина и высота элемента фиксированные, а для этого нам нужно:

  • Сделать отступы с отрицательными значениями;

  • Задать position: absolute со значениями top: 50%, left: 50% это и отцентрирует элемент родителя.

Пример.

5. Если мы хотим центрировать инлайновый элемент (inline, inline-block), то нам нужно свойство vertical-align. Для этого надо указать родителю псевдоэлемент before (этот пример я показывал выше), но в данном случае мы должны центрировать элементы по обе оси — вертикальной и горизонтальной. Для этого мы должны указать родителю text-align: center.

Пример.

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

Пример.

Итак, мы разобрали все способы центрирования в CSS. Каждый способ уникален по своему и выбирать их нужно по ситуации. А каким из способов пользуетесь вы? 

Комментарии (7)


  1. CKAMmanager
    02.08.2022 09:37

    Добрый день, опечатка в примере с выравниванием флексами, второй раз указано justify-content: center вместо align-items: center


    1. UseTech Автор
      02.08.2022 09:38

      Добрый день, спасибо, поправили.


  1. Ge_5
    02.08.2022 13:39
    +1

    Спасибо за труд, как раз нужно было


    1. UseTech Автор
      02.08.2022 13:39

      Спасибо за обратную связь!


  1. Fess_blaga
    02.08.2022 15:06
    -1

    margin: 0 auto

    Зачем тут вертикальные отступы, которые равны 0?
    Это про горизонтальное выравнивание, и правильно будет:

    margin-left: auto;
    margin-right: auto;


  1. juwon22
    02.08.2022 18:19

    Добрый день, зачем дублировать свойство margin,если мы короче можем записать)


  1. vgglow
    02.08.2022 18:20
    +1

    Помню, как в своё время мучился с выравниванием, не понимал почему в одном случае работает, а в другом, вроде бы похожем, нет. Жаль, что тогда мне не попалась подобная статья. Всё кратко, чётко и по делу. Спасибо!