Справочник · CSS
justify-content: распределение места по главной оси
Свойство justify-content распределяет свободное место между элементами вдоль главной оси flex-контейнера или между колонками grid-сетки: прижимает элементы к началу или концу, ставит по центру, раздвигает по краям. Его пишут контейнеру, и оно заметно, только когда у контейнера есть свободное место.
- Пишут контейнеру с
display: flexилиgrid. center— по центру,space-between— крайние у краёв, остальное поровну.- Во flex работает вдоль главной оси: при
flex-direction: column— вертикально. - Нет свободного места — нет эффекта.
- Для промежутков между элементами надёжнее
gap.
Минимальный пример
.header {
display: flex;
justify-content: space-between;
align-items: center;
}<header class="header">
<a class="logo" href="/">Praktum</a>
<nav>…</nav>
</header>Логотип прижат к левому краю, меню — к правому, свободное место между ними. Это самый частый случай использования justify-content.
Значения justify-content
| Значение | Что происходит |
|---|---|
flex-start / start | все элементы в начале оси (по умолчанию) |
flex-end / end | все элементы в конце оси |
center | группа по центру |
space-between | крайние элементы у краёв, промежутки между остальными равны |
space-around | у каждого элемента равные поля с обеих сторон; по краям вдвое меньше, чем между |
space-evenly | все промежутки, включая края, одинаковые |
stretch | в grid растягивает колонки с размером auto |
start и end учитывают направление письма, а flex-start и flex-end — направление flex-оси. В обычной горизонтальной строке на русском они совпадают.
Главная ось и flex-direction
.stack {
display: flex;
flex-direction: column;
justify-content: center; /* теперь центрирует по вертикали */
min-height: 100dvh; /* нужна высота, иначе свободного места нет */
}Во Flexbox justify-content работает вдоль главной оси. По умолчанию это строка, и выравнивание горизонтальное. Если поставить flex-direction: column, главная ось становится вертикальной, и justify-content выравнивает по высоте. Перпендикулярное направление — забота align-items.
Почему justify-content ничего не делает
Свойство распределяет только свободное место. Если элементы занимают весь контейнер (например, у них flex: 1 или flex-grow), распределять нечего. В колонке без заданной высоты контейнер равен сумме высот детей — вертикальное центрирование тоже не сработает. Проверь в DevTools, есть ли у контейнера лишнее место.
Один элемент к другому краю: margin-left: auto
.header { display: flex; align-items: center; gap: 16px; }
.header .login { margin-left: auto; } /* только кнопка уезжает вправо */justify-content двигает всех сразу. Если нужно прижать вправо только последний элемент (кнопку «Войти»), а остальные оставить слева рядом, используй margin-left: auto на этом элементе: автоматический отступ забирает всё свободное место.
justify-content в Grid
.gallery {
display: grid;
grid-template-columns: repeat(3, 200px);
justify-content: center; /* вся сетка по центру контейнера */
gap: 16px;
}В Grid свойство двигает не отдельные элементы, а все колонки целиком — когда их суммарная ширина меньше контейнера. Чтобы выровнять содержимое внутри ячеек, нужен justify-items, а для одного элемента — justify-self.
space-between или gap
.tags { display: flex; flex-wrap: wrap; gap: 8px; } /* стабильные промежутки */
.tags { display: flex; flex-wrap: wrap; justify-content: space-between; } /* «разбегаются» */space-between хорош, когда первый и последний элемент должны касаться краёв. Для групп кнопок, тегов и карточек с переносом он плох: в последней строке два элемента разъедутся по краям с огромной дырой посередине. Там нужен gap — фиксированный промежуток.
Ключевое слово safe
.row { display: flex; justify-content: safe center; }Если содержимое шире контейнера, center выталкивает его за обе стороны, и левую часть нельзя даже прокрутить. safe center в этом случае прижимает содержимое к началу. Ключевое слово поддерживается в актуальных версиях браузеров.
justify-content или align-items
Вдоль главной оси: распределяет свободное место между элементами. В строке — по горизонтали.
Вдоль поперечной оси: выравнивает элементы внутри строки. В строке — по вертикали.
Частые ошибки
- Пишут justify-content обычному блоку без
display: flexилиgrid. - Ждут эффекта, когда у элементов flex-grow и свободного места нет.
- Путают оси: при flex-direction: column justify-content работает вертикально.
- Используют space-between для тегов с переносом вместо gap.
- Центрируют колонкой без заданной высоты контейнера.
Доступность
justify-content меняет только положение, а не порядок: клавиатура и скринридер идут по HTML. Значения с -reverse в flex-direction и визуальные перестановки могут запутать человека с клавиатурой — держи порядок в HTML логичным.
Поддержка браузерами
justify-content во Flexbox и Grid поддерживается всеми актуальными браузерами. space-evenly во Flexbox, значения start/end и ключевое слово safe работают в современных версиях.
Практика
Сделай шапку: логотип слева, меню посередине, кнопка «Войти» справа. Затем — блок первого экрана высотой во весь экран с заголовком и кнопкой по центру по вертикали. Ряд тегов с переносом сделай с ровными промежутками 8px.
Показать решение
.header { display: flex; align-items: center; justify-content: space-between; gap: 16px; }
.hero {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
min-height: 100dvh;
}
.tags { display: flex; flex-wrap: wrap; gap: 8px; }Частые вопросы
Почему не работает justify-content?
У контейнера нет display: flex или grid, у элементов нет свободного места (flex-grow, flex: 1) или ты выравниваешь не по той оси.
Чем space-between отличается от space-around и space-evenly?
space-between прижимает крайние элементы к краям. space-around даёт каждому элементу равные поля, поэтому по краям места вдвое меньше. space-evenly делает все промежутки, включая края, одинаковыми.
Как отцентровать по вертикали через flex?
Либо align-items: center в строке, либо justify-content: center при flex-direction: column. В обоих случаях у контейнера должна быть высота.
Как прижать вправо только один элемент?
Поставь ему margin-left: auto внутри flex-контейнера.
Чем justify-content отличается от justify-items в Grid?
justify-content двигает всю сетку колонок внутри контейнера, justify-items выравнивает содержимое внутри каждой ячейки.