Центрирование в CSS: Полное руководство
Вещи, связанные с центрированием в CSS, это, пожалуй, олицетворение того, на что чаще всего жалуются пользователи. Это на самом деле должно быть так сложно? — иронично интересуются они.
Я думаю, что проблема заключается не в том, что центрирование трудно осуществить, а в том, что, в зависимости от ситуации, существует так много различных способов сделать это, что их трудно охватить все.
Поэтому давайте создадим дерево решений и, надеюсь, теперь этот вопрос станет для вас проще. Мне нужно отцентрировать элементы…
Горизонтально
Это элементы inline или inline-* (например, текст или ссылки)?
Вы можете отцентрировать элементы inline горизонтально, в родительском элементе block-level с помощью:
.center-children {
text-align: center;HTML:
<header>
Этот текст отцентрирован.
</header>
<nav role='navigation'>
<a href="#0">Один</a>
<a href="#0">Два</a>
<a href="#0">Три</a>
<a href="#0">Четыре</a>
</nav>CSS:
Это будет работать для inline, inline-block, inline-table, inline-flex и т.д.
Это элемент уровня блока?
Вы можете отцентрировать элемент block-level, придав ему margin-left и margin-right или auto (при этом также нужно задатьwidth, в противном случае это будет полная ширина, и центрирование не потребуется). Это часто делается в подобных сокращениях:
HTML:
CSS:
Это будет работать независимо от ширины элемента block-level или родительского элемента. Обратите внимание, что вы не можете использовать привязку к центру float.
У вас есть более чем один элемент block-level?
Если у вас есть два или более элемента block-level, которые должны быть отцентрированы горизонтально в ряд, скорее всего вам лучше применить для них разные типы display. Вот примеры, как сделать из них inline-block и flexbox:
HTML:
CSS:
Если только вы не хотите расположить несколько элементов block-level друг над другом. В этом случае по-прежнему прекрасно работает техника автоматического отступа:
HTML:
CSS:
Вертикально
Вертикальное центрирование в CSS немного сложнее
Это элементы inline или inline-* (например, текст или ссылки)?
Это одиночная строка?
Иногда линейные / текстовые элементы могут центрироваться по вертикали, просто потому, что отступ снизу и сверху равны:
HTML:
CSS:
Если отступ по некоторым причинам для вас это не вариант, и вы хотите отцентрировать текст, который не будет оборачивать, существует прием, аналогичный тому, что мы делали с line-height:
HTML:
CSS
Это несколько строк?
Аналогично отступ сверху и снизу может задать эффект центрирования для нескольких строк текста. Но иногда это не будет работать, если элемент текста представляет собой ячейку таблицы или для него с помощью CSS задано такое поведение. В этом случае применяется свойство vertical-align, в отличие от общих случаев выравнивания элементов:
HTML:
CSS:
Если выравнивание в формате таблицы неприменимо для вас, возможно, вы могли бы использовать flexbox? Один дочерний элемент flex может легко быть отцентрирован внутри родительского элемента flex:
HTML:
CSS:
Имейте в виду, что это актуально только для тех случаев, когда контейнер имеет фиксированную высоту (в пикселях, процентах и т.д.), поэтому для контейнера здесь задана высота.
Если оба этих метода неприменимы, вы могли бы использовать технику “призрачного элемента”, в которой внутри контейнера по всей высоте размещается псевдо-элемент и текст вертикально выравнивается с помощью этого элемента:
HTML:
CSS:
Это элемент block-level?
Вы знаете высоту элемента?
Довольно часто вы можете не знать высоту в макете веб-страницы по многим причинам: если ширина изменяется, текст адаптивный и может изменять высоту. Высота текста может меняться в зависимости от различных применяемых к нему стилей.
Элементы с фиксированным соотношением сторон, например, изображения, могут изменять свою высоту при изменении ширины. И т.д.
Но если вы знаете высоту, вы можете выровнять элемент по центру следующим образом:
HTML:
CSS:
Высота элемента неизвестна?
Его все равно можно отцентрировать, сдвинув его вниз на половину экрана, а затем подвинув вверх на половину высоты элемента:
HTML:
CSS:
Можем ли мы использовать flexbox.
В самом деле, с помощью flexbox это делается намного проще:
HTML:
CSS:
Горизонтально и вертикально
Вы можете комбинировать методы, приведенные выше, любым способом, чтобы получить полное центрирование элементов. Но я, как правило, выделяю три основных частных случая.
Это элементы с фиксированной шириной и высотой?
Использование отрицательных полей, равных половине ширины и высоты элемента, после того, как вы абсолютно позиционировали их на 50% / 50% от размеров родительского элемента, будет поддерживаться большинством браузеров:
HTML:
CSS:
Это элемент с неизвестными шириной и высотой?
Если вы не знаете, ширину или высоту элемента, вы можете использовать свойство преобразования и отрицательный перевод на 50% в обеих плоскостях (этот метод основан на текущей ширине / высоте элемента) в центр:
HTML:
CSS:
Можем мы использовать flexbox?
Чтобы отцентрировать элемент в двух плоскостях с помощью flexbox, нам нужно использовать два свойства центрирования:
HTML:
CSS:
Заключение
Теперь вы можете центрировать любые элементы с помощью CSS.
Last updated