Всё, что нужно знать о выравнивании во Flexbox / Хабр
Об авторе: Рэйчел Эндрю — не только главный редактор журнала Smashing Magazine, но и веб-разработчик, писатель и спикер. Она автор ряда книг, в том числе The New CSS Layout, один из разработчиков системы управления контентом Perch. Пишет о бизнесе и технологиях на своём сайте rachelandrew.co.uk.Краткое содержание: в этой статье мы рассмотрим свойства выравнивания во Flexbox и некоторые основные правила, как работает выравнивание по основной и поперечной осям.
В первой статье этого цикла я рассказала, что происходит при объявлении свойства display: flex
для элемента. Сейчас рассмотрим свойства выравнивания и как они работают с Flexbox. Если вы когда-либо приходили в замешательство, применить align
или justify
, надеюсь, эта статья многое прояснит!
История выравнивания во Flexbox
За всю историю CSS правильное выравнивание по обеим осям казалось самой сложной проблемой.
Свойства выравнивания теперь полностью определены в спецификации Box Alignment. Она детализирует, как работает выравнивание в различных макетах. Это означает, что в CSS Grid можно использовать те же свойства, что и в Flexbox — а в будущем в других макетах тоже. Поэтому любая новая функция выравнивания Flexbox будет подробно описана в спецификации Box Alignment, а не в следующей версии Flexbox.
Свойства
Многим трудно запомнить, следует ли использовать свойства, которые начинаются сalign-
или с justify-
. Важно помнить следующее:justify-
выполняет выравнивание по главной оси в том же направлении, что иflex-direction
;
выполняет выравнивание по оси поперёк направлениюflex-direction
.

Выравнивание главной оси с помощью
justify-content
Начнём с выравнивания по главной оси. Оно осуществляется с помощью свойства justify-content
. Данное свойство обрабатывает все элементы как группу и управляет распределением пространства между ними.Изначальное значение justify-content
равняется flex-start
. Вот почему при объявлении display: flex
все элементы flex выстраиваются в начале строки. В письменности слева направо элементы группируются слева.
Обратите внимание, что свойство justify-content
производит видимый эффект только при наличии свободного места
justify-content
ничего не даст.
Если указать для justify-content
значение flex-end
, то все элементы переместятся в конец строки. Свободное место теперь находится в начале.
С этим пространством можно делать и другие вещи. Например, распределить его между нашими элементами, используя justify-content: space-between
. В этом случае первый и последний элемент разместятся на концах контейнера, а всё пространство поровну поделится между элементами.
Мы можем распределить пространство с помощью justify-content: space-around
. В этом случае доступное пространство делится на равные части и помещается с каждой стороны элемента.
Новое значение justify-content
можно найти в спецификации Box Alignment; оно не указано в спецификации Flexbox. Это значение
. В этом случае элементы равномерно распределяются в контейнере, а дополнительное пространство поровну распределяется между элементами и с обеих сторон.
Вы можете поиграться со всеми значениями в демо.
Значения точно так же работают по вертикали, то есть если flex-direction
применяется для column
. Правда, у вас в столбце может не оказаться свободного места для распределения, если не добавить высоту или block-size контейнера, как в этом демо.
Выравнивание по осям с помощью
align-content
Если в контейнере несколько осей и указано flex-wrap: wrap
, то можно использовать align-content
для выравнивания строк на поперечной оси. Но требуется дополнительное пространство. В этой демонстрации поперечная ось работает в направлении колонки, и я указала высоту контейнера 60vh
. Поскольку это больше, чем необходимо для отображения всех элементов, то появляется свободное пространство по вертикали.Затем я могу применить align-content
с любым из значений.
Если в качестве flex-direction
указано column
, то align-content
работает как в следующем примере.
Как и в случае с justify-content
, мы работаем с группой строк и распределяем свободное пространство.
Свойство по
place-content
В спецификации Box Alignment можно найти свойство place-content
. Использование этого свойства означает, что вы одновременно устанавливаете justify-content
и align-content
. Первое значение — для align-content
, второе для justify-content
. Если задано только одно значение, то оно применяется к обоим свойствам:.container { place-content: space-between stretch; }Соответствует этому:
.container { align-content: space-between; justify-content: stretch; }А такой код:
.container { place-content: space-between; }Равноценен следующему:
.container { align-content: space-between; justify-content: space-between; }
Выравнивание по осям с помощью
align-items
Теперь мы знаем, что можно выровнять набор элементов или строки как группу. Тем не менее, есть ещё один способ выровнять элементы по отношению друг к другу на поперечной оси.
Как вариант, её можно определить свойством height
в контейнере:
Почему элементы растягиваются до размера самого высокого элемента — это потому что начальным значением параметра align-items
является stretch
. Элементы растягиваются по поперечной оси до размера контейнера в этом направлении.
Обратите внимание, что в многострочном контейнере каждая строка действует как новый контейнер. Самый высокий элемент в этой строке будет определять размер всех элементов в этой строке.
Кроме начального значения stretch
, можно присвоить элементам align-items
значение flex-start
, в этом случае они выравниваются по началу контейнера и больше не растягиваются по высоте.
Значение flex-end
перемещает их в конец контейнера по поперечной оси.
Если вы используете значение center
, то элементы центрируются относительно друг друга:
Мы также можем выровнять их по базовой линии. Это гарантирует выравнивание текста по одному основанию, в отличие от выравнивания полей вокруг текста.
Все эти варианты можно попробовать в демо.
Индивидуальное выравнивание с помощью
align-self
Свойство align-items
задаёт выравнивание всех элементов одновременно. В действительности оно устанавливает значения align-self
для всех элементов группы. Можно также использовать свойство align-self
для любого отдельного элемента, чтобы выровнять его внутри строки и относительно других элементов.В следующем примере в контейнере используется align-items
для выравнивания всей группы по центру, но также align-self
для первого и последнего элементов.
Почему нет
justify-self
?
Часто возникает вопрос, почему невозможно выровнять один элемент или группу элементов по главной оси. Почему во Flexbox нет свойства -self
для выравнивания по главной оси? Если вы представите justify-content
и align-content
как способ распределения пространства, то ответ становится более очевидным.
Также может быть полезно подумать, как justify-content
и align-content
работают в CSS Grid Layout. В Grid эти свойства используются для распределения свободного пространства в grid-контейнере между grid-дорожками. Здесь тоже мы берём группу дорожек — и с помощью этих свойств распределяем между ними свободное пространство. Поскольку мы оперируем в группе и в Grid, и во Flexbox, то не можем взять отдельный элемент и сделать с ним что-то другое. Тем не менее, есть способ получить оформление макета, которое хотят верстальщики, когда говорят о свойстве self
на главной оси. Это использование автоматических полей.
Использование автоматических полей на основной оси
Если вы когда-нибудь центрировали блок в CSS (например, враппер для контента главной страницы, установив поля слева и справа вauto
), то у вас уже есть некоторый опыт работы с автоматическими полями.
auto
для полей заполняет максимальное пространство в установленном направлении. Для центрирования блока мы устанавливаем и левое, и правое поля в auto
: каждое из них пытается занять как можно больше места, и поэтому помещает наш блок в центр.Автоматические поля очень хорошо работают во Flexbox для выравнивания отдельных элементов или групп элементов на главной оси. В следующем примере показан типичный случай. Есть панель навигации, элементы отображаются в виде строки и используют начальное значение justify-content: start
. Я хочу, чтобы последний пункт отображался отдельно от других в конце строки — при условии, что в строке достаточно места для этого.
Берём этот элемент и указываем для свойства margin-left
значение auto
. Это значит, что поле пытается получить как можно больше места слева от элемента, то есть элемент выталкивается к правой границе.
Если вы используете автоматические поля на главной оси, то justify-content
перестанет действовать, так как автоматические поля займут всё пространство, которое в противном случае распределялось бы с помощью justify-content
.
Запасное выравнивание
Для каждого метода выравнивания описан запасной вариант — что произойдёт, если заданное выравнивание невозможно. Например, если у вас есть только один элемент в контейнере, а вы указалиjustify-content: space-between
, что должно произойти? В этом случае применяется запасное выравнивание flex-start
— один элемент будет выровнен по началу контейнера. В случае justify-content: space-around
используется запасное выравнивание center
.В текущей спецификации вы не можете изменить запасное выравнивание. Есть примечание к спецификациям, которое допускает возможность указания произвольного запасного варианта в будущих версиях.
Безопасное и небезопасное выравнивание
Недавним дополнением к спецификации Box Alignment стала концепция безопасного и небезопасного выравнивания с использованием ключевых слов safe и unsafe.В следующем коде последний элемент слишком широк для контейнера, а при небезопасном выравнивании и гибком контейнере в левой части страницы элемент обрезается, поскольку переполнение выходит за границы страницы.
.container { display: flex; flex-direction: column; width: 100px; align-items: unsafe center; } .item:last-child { width: 200px; }
Безопасное выравнивание предотвращает потерю данных, перемещая переполнение на другую сторону.
.container { display: flex; flex-direction: column; width: 100px; align-items: safe center; } .item:last-child { width: 200px; }
Эти ключевые слова пока поддерживаются не всеми браузерами, однако демонстрируют, как спецификации Box Alignment добавляют контроля во Flexbox.
Заключение
Свойства выравнивания начинались со списка в Flexbox, но теперь обзавелись собственной спецификацией и применяются к другим контекстам макетирования. Вот несколько ключевых фактов, которые помогут запомнить их использование во Flexbox:justify-
для основных осей, аalign-
для поперечных;- для
align-content
иjustify-content
требуется свободное пространство; - свойства
align-content
иjustify-content
применяются к элементам в группе, распределяя пространство между ними.Нельзя указывать выравнивание отдельного элемента, потому что свойство
-self
отсутствует; - если хотите выровнять один элемент или разбить группу по основной оси, используйте автоматические поля;
align-items
устанавливает одинаковые свойстваalign-self
для всей группы. Используйтеalign-self
для дочернего элемента группы, чтобы установить ему значение индивидуально.
justify-content — CSS — Дока
- Кратко
- Пример
- Как понять
- Как пишется
- На практике
- Алёна Батицкая советует
Кратко
СкопированоСвойство выравнивает флекс-элементы внутри флекс-контейнера по основной оси.
При расположении флекс-элементов в ряд свойство управляет выравниванием по горизонтали. При расположении в колонку — выравниванием по вертикали.
Пример
СкопированоКод ниже заставит флекс-элементы распределиться по всей ширине родителя, разделив свободное пространство поровну.
.container { display: flex; justify-content: space-between;}
.container {
display: flex;
justify-content: space-between;
}
Как понять
СкопированоЭто свойство определяет, как распределяется свободное пространство между элементами вдоль главной оси (для флексбоксов), и по горизонтали (для гридов).
Как пишется
Скопированоstart
— элементы прижимаются к тому краю, откуда начинается чтение на том языке, на котором отображается сайт.end
— элементы прижимаются к краю, противоположному началу направления чтения на языке сайта.flex
— элементы прижимаются к краю, от которого начинается основная ось.- start flex
— элементы прижимаются к краю, у которого основная ось заканчивается.- end left
— элементы прижмутся к левому краю родителя.right
— элементы прижмутся к правому краю родителя.center
— элементы выстраиваются по центру родителя.space
— крайние элементы прижимаются к краям родителя, оставшиеся выстраиваются внутри контейнера равномерно, так, чтобы между ними были одинаковые отступы.- between space
— свободное пространство делится поровну между элементами и по половине от этой доли размещается по бокам от каждого элемента. Таким образом, между соседними элементами будет равное расстояние, а снаружи крайних элементов — по половине этого расстояния.- around space
— свободное место будет распределено так, чтобы расстояние между любыми двумя элементами было одинаковым и расстояние от крайних элементов до края было таким же.- evenly
Если основная ось идёт горизонтально, то для сайта с направлением письма слева направо (LTR) значение start
прижмёт элементы к левому краю, а значение end
прижмёт элементы к правому краю. Для сайтов с направлением письма справа налево (RTL) элементы будут прижиматься к противоположным краям для аналогичных значений.
В случае, если указано свойство flex
, то значения left
и right
срабатывают как start
.
📝
Полный список свойств флексбоксов можно посмотреть в гайде по flexbox. А свойства гридов описаны в гайде по grid
Поддержка в браузерах- Chrome 57, Поддерживается 57
- Edge 79, Поддерживается 79
- Firefox 81, Поддерживается 81
- Safari 9, Поддерживается 9
На практике
СкопированоАлёна Батицкая советует
Скопировано🛠 Если внутри флекс-контейнера всего два элемента, то удобно использовать justify
, чтобы прижать их к противоположным краям родителя. Это имитирует поведение свойства
float
, но без последствий.
Если вы нашли ошибку, отправьте нам пулреквест!
Во время отправки формы что-то пошло не так. Попробуйте ещё раз?
Предыдущий материал←
grid-template-rows
ctrl + alt + ←
Следующий материал→
justify-items
ctrl + alt + →
выравнивание контента | CSS-трюки — CSS-трюки
DigitalOcean предоставляет облачные продукты для каждого этапа вашего путешествия. Начните с бесплатного кредита в размере 200 долларов США!
Свойство justify-content
является подсвойством модуля Flexible Box Layout.
Определяет выравнивание по главной оси. Это помогает распределять дополнительное свободное пространство, когда либо все гибкие элементы в строке негибкие, либо гибкие, но достигли своего максимального размера. Он также осуществляет некоторый контроль над выравниванием элементов, когда они выходят за пределы строки.
Свойство justify-content
принимает пять разных значений:
-
flex-start
( по умолчанию ): элементы упаковываются по направлению к начальной линии -
flex-end
: предметы упакованы ближе к конечной строке -
центр
: элементы располагаются по центру линии -
пробел между
: элементы равномерно распределяются по линии; первый элемент находится в начальной строке, последний элемент в конечной строке -
пробел-вокруг
: элементы равномерно распределены в строке с равным пространством вокруг них -
пространственно-равномерно
: элементы распределены таким образом, что расстояние между любыми двумя соседними элементами выравнивания, перед первым элементом выравнивания и после последнего элемента выравнивания равно же
Следующий рисунок помогает понять, что на самом деле делает свойство justify-content
:
Синтаксис
justify-content: flex-start | гибкий конец | центр | пространство между | пространство вокруг | пространственно-равномерно .flex-элемент { выравнивание содержимого: по центру; }
Demo
Следующая демонстрация показывает, как ведут себя flex-элементы в зависимости от значения justify-content
:
- Красный список установлен на
flex-start
- Желтый установлен на
flex-end 9 0006
- Синий установлен на
центр
- Зеленый установлен на
пробел-между
- Розовый установлен на
пробел-вокруг
- Светло-зеленый настроен на
пробел-равномерно
900 20
Поддержка браузера
Рабочий стол
Chrome | Firefox | IE | Edge | Safari | 901 00
---|---|---|---|---|
21* | 28 | 11 | 12 | 6.1* |
Мобильный телефон/планшет
Android Chrome | Android Firefox | Android | iOS Safari |
---|---|---|---|
113 | 4.![]() | 7.0-7.1* |
Браузер Blackberry 10+ поддерживает новый синтаксис.
В нашем последнем обновлении от декабря 2018 г. justify-content: space-evenly;
получает поддержку. На него есть рабочая спецификация проекта.
Рабочий стол
Chrome | Firefox | IE | Edge | Safari |
---|---|---|---|---|
60 | 52 | № | 79 | 11 |
Мобильный телефон/планшет
Android Chrome | Android Firefox | Android | iOS Safari |
---|---|---|---|
114 | 113 | 114 | 11.0-11.2 |
Для получения дополнительной информации о том, как смешивать синтаксис для получения наилучшей поддержки браузера, обратитесь к нашей статье «Использование Flexbox».
Дополнительная информация
- Модуль CSS Flexible Box Layout Уровень 1
- Как использовать сетку CSS для выравнивания содержимого и элементов
- Полное руководство по Flexbox 30 Статья на
5 апреля 2018 г.
Быстрый способ запомнить разницу между `justify-content` и `align-items`
Создание расписания конференции с помощью CSS Grid
Центрирование: самый новый и самый крутой способ против самого старого и самого крутого способа
Управление макетом на многонаправленном веб-сайте
Время веселья с элементами сетки размеров
Пожалуйста, дайте мне немного места
выравнивание содержимого
.element { align-content: space-around; }
выравнивание содержимого flexbox
выравнивание элементов
.element { align-items: flex-start; }
выровнять себя
.box { align-self: flex-end; }
отображать
.element { display: inline-block; }
дисплей
flex-направление
.element { flex-direction: column-reverse; }
гибкий поток
.element { flex-flow: перенос строк; }
гибкая упаковка
.example { flex-wrap: wrap; }
выравнивание-элементы
.element { выравнивание элементов: центр; }
оправдываться
.element { justify-self: stretch; }
место-контент
место-предметы
.element { элементы места: центр; }
место для себя
Как установить пространство между элементами Flexbox
Flexbox — это одномерный макет, который размещает элементы в одном измерении за раз (либо в виде строки, либо в виде столбца).
Основное назначение Flexbox Layout — распределить пространство между элементами контейнера. Это работает даже в тех случаях, когда размер элемента неизвестен или динамичен.
Вы можете легко установить расстояние между элементами flexbox, используя свойство CSS justify-content.
В этом фрагменте мы покажем, как это сделать.
- Создайте три элементас именем класса "flex-items":
<голова>
Название документа <тело>Пробел между флексбоксами
выравнивание содержимого: вокруг пробела
<дел> <дел>1 <дел>2 <дел>3выравнивание содержимого: пробел между
<дел> <дел>1 <дел>2 <дел>3
- Создайте три элемента
Попробуй сам "
- Задайте для свойства justify-content значение "space-around" для элемента .flex2.
- Задайте для свойства justify-content значение «пробел между» для элемента .flex3.
- Установите для свойства display значение «flex» для обоих элементов.
- Добавьте стиль, используя ширину, высоту, фоновый цвет, поля и другие свойства.
.flex { дисплей: гибкий; размер шрифта: 30px; выравнивание текста: по центру; цвет фона: #7d7d7d; цвет: #000000; вес шрифта: полужирный; } .flex2 { выравнивание содержимого: пространство вокруг; } .flex3 { выравнивание содержимого: пробел между; } .flex-элементы { цвет фона: #cccaca; ширина: 90 пикселей; высота: 60 пикселей; поле: 10 пикселей; выравнивание текста: по центру; размер шрифта: 40px; высота строки: 1,5; }
Давайте посмотрим на результат нашего кода.
Пример установки расстояния между элементами flexbox:
<голова>Название документа <стиль> .flex { дисплей: гибкий; размер шрифта: 30px; выравнивание текста: по центру; цвет фона: #7d7d7d; цвет: #000000; вес шрифта: полужирный; } .flex2 { выравнивание содержимого: пространство вокруг; } .flex3 { выравнивание содержимого: пробел между; } .flex-элементы { цвет фона: #cccaca; ширина: 90 пикселей; высота: 60 пикселей; поле: 10 пикселей; выравнивание текста: по центру; размер шрифта: 40px; высота строки: 1,5; } <тело>Пробел между флексбоксами
выравнивание содержимого: вокруг пробела
<дел> <дел>1 <дел>2 <дел>3