Рассмотрим основную ось и поперечную ось гибкого контейнера:
Источник: W3C
Чтобы выровнять элементы flex вдоль основной оси, существует одно свойство:
Чтобы выровнять элементы гибкости вдоль поперечной оси, существует три свойства:
На изображении выше основная ось горизонтальная, а поперечная ось - вертикальная. Это направления по умолчанию для гибкого контейнера.
Однако эти направления могут быть легко взаимозаменяемы с помощью свойства flex-direction
.
/* main axis is horizontal, cross axis is vertical */
flex-direction: row;
flex-direction: row-reverse;
/* main axis is vertical, cross axis is horizontal */
flex-direction: column;
flex-direction: column-reverse;
(поперечная ось всегда перпендикулярна основной оси.)
Моя точка в описании работы осей заключается в том, что в любом направлении нет ничего особенного. Основная ось, поперечная ось, они оба равны по важности, а flex-direction
позволяет легко переключаться назад и вперед.
Так почему же поперечная ось получает два дополнительных свойства выравнивания?
Почему align-content
и align-items
объединены в одно свойство для главной оси?
Почему главная ось не получает свойство justify-self
?
Сценарии, в которых эти свойства были бы полезны:
-
размещение гибкого элемента в углу гибкого контейнера
#box3 { align-self: flex-end; justify-self: flex-end; }
-
создание группы элементов flex align-right (
justify-content: flex-end
), но первый элемент выравнивается влево (justify-self: flex-start
)Рассмотрим раздел заголовка с группой навигационных элементов и логотипом. С
justify-self
логотип можно было бы выровнять влево, в то время как пункты навигации остаются правыми, и все это будет плавно ( "сгибать" ) на разные размеры экрана. -
в строке из трех элементов гибкости привяжите средний элемент к центру контейнера (
justify-content: center
) и выровняйте смежные элементы к краям контейнера (justify-self: flex-start
иjustify-self: flex-end
).Обратите внимание, что значения
space-around
иspace-between
onjustify-content
свойство не будет удерживать средний элемент по центру относительно контейнера, если соседние элементы имеют разную ширину.
#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>note that the middle box will only be truly centered if adjacent boxes are equal width</p>