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.