Методы выравнивания гибких элементов вдоль главной оси
Как указано в вопросе:
Для выравнивания гибких элементов вдоль главной оси есть одно свойство: justify-content
Чтобы выровнять нежесткие элементы вдоль поперечной оси есть три свойства: align-content
, align-items
иalign-self
.
Затем возникает вопрос:
Почему нет justify-items
иjustify-self
свойств?
Один ответ может быть: потому что они не нужны.
Спецификация flexbox предоставляет два метода выравнивания элементов flex вдоль главной оси:
- Свойство
justify-content
ключевого слова и
auto
поля
обосновывать-контент
В justify-content
совмещается собственности сгибать элементы вдоль главной оси гибкого контейнера.
Он применяется к гибкому контейнеру, но влияет только на гибкие элементы.
Есть пять вариантов выравнивания:
flex-start
Гибкие элементы упакованы в начале линии.
flex-end
Гибкие элементы упакованы в конце линии.
center
Гибкие элементы упакованы по направлению к центру линии.
space-between
Элементы Flex расположены равномерно, первый элемент выровнен по одному краю контейнера, а последний элемент - по противоположному краю. Края , используемые первыми и последние пункты зависят flex-direction
и режим записи ( ltr
или rtl
).
space-around
~ То же самое, что и space-between
с половинными пробелами на обоих концах.
Авто наценки
С auto
полями , гибкие элементы могут быть отцентрированы, разнесены или упакованы в подгруппы.
В отличие от того justify-content
, что применяется к гибкому контейнеру, auto
поля относятся к гибким элементам.
Они работают, потребляя все свободное пространство в указанном направлении.
Выровняйте группу изгибаемых элементов справа, но первый элемент слева
Сценарий из вопроса:
сделать группу из flex-элементов align-right ( justify-content: flex-end
), но первый элемент выровнять по левому краю ( justify-self: flex-start
)
Рассмотрим заголовок раздела с группой элементов навигации и логотипом. С
justify-self
логотипом можно было выровнять влево, в то время как навигационные элементы остаются далеко вправо, и все это плавно регулируется («сгибается») к разным размерам экрана.
Другие полезные сценарии:
Поместите гибкий элемент в угол
Сценарий из вопроса:
- размещение гибкого элемента в углу
.box { align-self: flex-end; justify-self: flex-end; }
Центрируйте гибкий элемент по вертикали и горизонтали
margin: auto
является альтернативой justify-content: center
и align-items: center
.
Вместо этого кода в контейнере flex:
.container {
justify-content: center;
align-items: center;
}
Вы можете использовать это на элементе flex:
.box56 {
margin: auto;
}
Эта альтернатива полезна при центрировании гибкого элемента, который переполняет контейнер .
Отцентрируйте гибкий элемент и отцентрируйте второй гибкий элемент между первым и краем
Гибкий контейнер выравнивает гибкие элементы, распределяя свободное пространство.
Следовательно, чтобы создать равный баланс , чтобы средний элемент мог быть центрирован в контейнере с одним элементом рядом, необходимо ввести противовес.
В приведенных ниже примерах невидимые третьи гибкие элементы (вставки 61 и 68) представлены для уравновешивания «реальных» предметов (вставки 63 и 66).
Конечно, этот метод не является чем-то большим с точки зрения семантики.
В качестве альтернативы вы можете использовать псевдоэлемент вместо фактического элемента DOM. Или вы можете использовать абсолютное позиционирование. Здесь рассматриваются все три метода: гибкие элементы по центру и снизу.
ПРИМЕЧАНИЕ. Приведенные выше примеры будут работать - с точки зрения истинного центрирования - только когда самые внешние элементы равны высоте / ширине. Когда гибкие элементы имеют разную длину, см. Следующий пример.
Центрируйте гибкий элемент, когда соседние элементы различаются по размеру
Сценарий из вопроса:
в ряду из трех гибких элементов прикрепите средний элемент к центру контейнера ( justify-content: center
) и выровняйте соседние элементы по краям контейнера ( justify-self: flex-start
и
justify-self: flex-end
).
Обратите внимание, что значения space-around
и свойство space-between
on justify-content
не будут сохранять средний элемент по центру относительно контейнера, если смежные элементы имеют разную ширину ( см. Демонстрацию ).
Как уже отмечалось, если все гибкие элементы не имеют одинаковую ширину или высоту (в зависимости от flex-direction
), средний элемент не может быть действительно центрирован. Эта проблема дает веские основания для justify-self
свойства (конечно, для решения задачи).
#container {
display: flex;
justify-content: space-between;
background-color: lightyellow;
}
.box {
height: 50px;
width: 75px;
background-color: springgreen;
}
.box1 {
width: 100px;
}
.box3 {
width: 200px;
}
#center {
text-align: center;
margin-bottom: 5px;
}
#center > span {
background-color: aqua;
padding: 2px;
}
<div id="center">
<span>TRUE CENTER</span>
</div>
<div id="container">
<div class="box box1"></div>
<div class="box box2"></div>
<div class="box box3"></div>
</div>
<p>The middle box will be truly centered only if adjacent boxes are equal width.</p>
Вот два метода решения этой проблемы:
Решение № 1: Абсолютное позиционирование
Спецификация flexbox обеспечивает абсолютное позиционирование элементов flex . Это позволяет среднему предмету быть идеально отцентрированным независимо от размера его родных братьев.
Просто имейте в виду, что, как и все абсолютно позиционированные элементы, элементы удаляются из потока документов . Это означает, что они не занимают места в контейнере и могут перекрывать своих братьев и сестер.
В приведенных ниже примерах средний элемент центрируется с абсолютным позиционированием, а внешние элементы остаются в потоке. Но та же схема может быть достигнута и в обратном порядке: отцентрируйте средний элемент по центру justify-content: center
и расположите абсолютно все внешние элементы.
Решение № 2: Вложенные Flex-контейнеры (без абсолютного позиционирования)
.container {
display: flex;
}
.box {
flex: 1;
display: flex;
justify-content: center;
}
.box71 > span { margin-right: auto; }
.box73 > span { margin-left: auto; }
/* non-essential */
.box {
align-items: center;
border: 1px solid #ccc;
background-color: lightgreen;
height: 40px;
}
<div class="container">
<div class="box box71"><span>71 short</span></div>
<div class="box box72"><span>72 centered</span></div>
<div class="box box73"><span>73 loooooooooooooooong</span></div>
</div>
Вот как это работает:
- Div верхнего уровня (
.container
) - это гибкий контейнер.
- Каждый дочерний
.box
элемент div ( ) теперь является гибким элементом.
- Каждый
.box
элемент дан flex: 1
для того, чтобы распределить контейнерное пространство одинаково.
- Теперь элементы занимают все пространство в строке и имеют одинаковую ширину.
- Сделайте каждый элемент (вложенным) гибким контейнером и добавьте
justify-content: center
.
- Теперь каждый
span
элемент представляет собой центрированный гибкий элемент.
- Используйте гибкие
auto
поля, чтобы сместить внешние span
s влево и вправо.
Вы также можете отказаться justify-content
и использовать auto
поля исключительно.
Но justify-content
может работать здесь, потому что auto
поля всегда имеют приоритет. Из спецификации:
8.1. Выравнивание по auto
полям
До выравнивания через justify-content
и align-self
любое положительное свободное пространство распределяется по автоматическим полям в этом измерении.
justify-content: space-same (концепция)
Возвращаясь к justify-content
минутке, вот идея еще одного варианта.
space-same
~ Гибрид space-between
и space-around
. Гибкие элементы расположены равномерно (как space-between
), за исключением того, что вместо полусегментных пробелов на обоих концах space-around
есть полноразмерные пробелы на обоих концах.
Это расположение может быть достигнуто с ::before
и ::after
псевдо-элементов на гибком контейнере.
(кредит: @oriol для кода и @crl для метки)
ОБНОВЛЕНИЕ: Браузеры начали реализацию space-evenly
, которая выполняет вышеуказанное. Смотрите этот пост для деталей: Равное пространство между гибкими элементами
PLAYGROUND (включает код для всех примеров выше)
justify-self
работать на гибкий элемент? Предположим, у вас есть элементы a, b, c, d с дополнительным пространством для распределения вокруг них, а контейнер flex имеет ихjustify-content: space-between
, поэтому они заканчиваются как | abcd |. Что бы это значило добавить, например,justify-self: center
или «justify-self: flex-end» просто к пункту «b» там? Где вы ожидаете, что это пойдет? (Я вижу некоторые демонстрации в одном из ответов здесь, но я не вижу четкого способа, как это будет работать в целом.)