Menu

justify-content и align-items в CSS: все значения

justify-content размещает flex-элементы вдоль главной оси, а align-items вдоль поперечной. Посмотрите на все значения рядом, с замерами, на кликабельную сетку выравнивания, align-self и причины, по которым justify-content иногда ничего не делает.

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

justify-content и align-items одним предложением

Во flex-контейнере justify-content распределяет элементы вдоль главной оси (вдоль строки), а align-items выравнивает их по поперечной оси (вверх и вниз в строке). Оба задаются контейнеру:

Блок центрирован в обоих направлениях: на одинаковом расстоянии от начального и конечного краев, а также от верха и низа. Уберите height: 140px, и align-items: center будет нечего делать, потому что контейнер сожмется до высоты самого элемента.

Все значения justify-content с замерами

Каждая строка ниже это те же три элемента с разным justify-content. Числа в подписи над каждой строкой это промежутки, которые оставил браузер: перед первым элементом, между элементами и после последнего.

Контейнер шириной 420px, а элементы занимают 180px, значит, свободного пространства 240px. Куда оно уходит:

ЗначениеСвободное пространство уходитПромежутки в примере
flex-start (и start)все после элементов0 / 0 / 0 / 240
centerполовина до, половина после120 / 0 / 0 / 120
flex-end (и end)все перед элементами240 / 0 / 0 / 0
space-betweenтолько между элементами0 / 120 / 120 / 0
space-aroundпоровну с обеих сторон каждого элемента, поэтому краям половина40 / 80 / 80 / 40
space-evenlyвсе промежутки равны, включая края60 / 60 / 60 / 60

flex-start следует направлению flex, а start направлению письма. Они различаются только при row-reverse или column-reverse, где flex-start оказывается на обратном конце.

Все значения align-items

align-items работает поперек строки. У элементов ниже разная высота, чтобы было видно, что с ними делает каждое значение:

ЗначениеЧто происходит на поперечной оси
stretch (по умолчанию)Элементы без заданной высоты растягиваются на весь контейнер
flex-start (и start)Элементы стоят сверху, со своей высотой
centerЭлементы центрированы, со своей высотой
flex-end (и end)Элементы стоят снизу
baselineЭлементы сдвигаются так, чтобы первые строки текста стояли на одной базовой линии

В блоке baseline три подписи «Ag» стоят на одной линии, хотя первая крупнее, а у второй сверху padding. Это значение для строки, где крупный заголовок соседствует с мелким текстом или подпись с полем ввода.

Кликните, чтобы выровнять

Кликните по любой клетке сетки 3 на 3. Блок переместится туда, а ниже появится CSS, который его туда ставит:

Строки выбора меняют align-items, а колонки justify-content. Средняя клетка это классическое «выровнять div по центру».

В колонке они меняются местами

justify-content всегда следует главной оси. При flex-direction: column главная ось вертикальная, поэтому justify-content двигает элементы вверх и вниз, а align-items поперек:

Если перепутали, поменяйте два свойства местами, а не переписывайте раскладку.

align-self и auto-отступы: только один элемент

align-self у элемента переопределяет align-items для этого элемента. justify-self во flexbox нет; чтобы сдвинуть один элемент вдоль главной оси, задайте ему auto-отступ, который забирает все свободное пространство с этой стороны:

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

Когда строк несколько: align-content

align-items выравнивает элементы внутри их строки. Когда контейнер переносит элементы на несколько строк, align-content распределяет сами строки и принимает те же значения, что justify-content. В контейнере nowrap он ничего не делает: единственная строка там всегда заполняет высоту контейнера. Это показано на странице про flex-wrap.

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

  • Путаница осей. justify-content это направление потока, align-items поперек него. В колонке вертикальное центрирование это justify-content: center.
  • Нет свободного пространства. Элемент с flex: 1 забирает все пространство, и justify-content нечего распределять. То же бывает, когда контейнер inline-flex и шириной ровно с элементы.
  • Нет высоты для align-items. Контейнер высотой с содержимое не оставляет места для выравнивания. Задайте height или min-height.
  • Поиск justify-self во flexbox. Там он игнорируется. Используйте у элемента margin-inline-start: auto (или margin-left: auto).
  • align-items: stretch, который не растягивает. Элемент с собственной height ее сохраняет. Уберите высоту (используйте min-height, если нужен минимум).
  • Свойства у элементов. Оба задаются flex-контейнеру. Только align-self задается элементу.

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

Чем justify-content отличается от align-items?

justify-content распределяет элементы вдоль главной оси, в направлении их потока (по горизонтали при flex-direction: row). align-items размещает их вдоль поперечной оси (по вертикали в строке). В колонке оба меняются местами: justify-content становится вертикальным.

Чем отличаются space-between, space-around и space-evenly?

space-between не ставит пространство перед первым элементом и после последнего, а остальное делит между элементами. space-around дает каждому элементу равное пространство с обеих сторон, поэтому края получают половину промежутка. space-evenly делает все промежутки равными, включая края.

Почему не работает justify-content?

Обычно нет свободного пространства для распределения: у элемента flex-grow или flex: 1, или контейнер шириной ровно с элементы (например, display: inline-flex или плавающий контейнер). Также проверьте, что display: flex задан родителю, а не элементам.

Почему align-items center не центрирует по вертикали?

Скорее всего, контейнер ровно такой высоты, как содержимое, и центрировать негде. Задайте flex-контейнеру высоту или min-height, и элементы переместятся в его середину.

Что делает align-self?

align-self переопределяет align-items контейнера для одного элемента. Например, align-self: flex-end у одного дочернего элемента сдвигает только его в конец поперечной оси, а остальные остаются там, куда их поставил align-items.

Есть ли justify-self во flexbox?

Нет. Flexbox игнорирует justify-self, потому что главная ось общая для всех элементов. Чтобы сдвинуть один элемент вдоль главной оси, используйте auto-отступ, например margin-inline-start: auto. justify-self работает в grid.

Coddy programming languages illustration

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

НАЧАТЬ