Введение в Flexbox
На прошлой неделе мы изучили CSS Grid и узнали, как с его помощью создать универсальную систему сеток.
Сегодня хотелось бы поговорить о Flexbox. Давайте разбираться!
Что такое Flexbox
Flexbox — способ создания гибких макетов, расположенных в виде столбцов или строк.
В CSS Grid вы задаёте макет, а содержимое (текст, изображения и т. д.) оборачивается сеткой и изменяет размер, чтобы вместить его в контейнеры. При использовании Flexbox вы задаёте макет, а контейнеры подстраиваются и изменяют размер под содержимое, которое вы в них помещаете.
Именно поэтому он называется Flexbox.
Создание макета Flexbox
Например, представьте, что есть div с классом .grid-flex, а в него вложены два элемента.
<div class="grid-flex">
<div>1</div>
<div>2</div>
</div>Мы хотим, чтобы вложенные элементы располагались рядом друг с другом в ряд.
Для начала определим свойство display для класса .grid-flex со значением flex.
.grid-flex {
display: flex;
}С помощью всего одной строки CSS элементы отображаются бок о бок, а родительские контейнеры автоматически изменяет размер под размер содержимого.
Flexbox автоматически растягивается
Основная особенность Flexbox заключается в том, что элементы контейнера автоматически изменяют размер в соответствии с содержимым внутри них.
Представим, что в одном из элементов текст длиннее, чем в другом...
<div class="grid-flex">
<div>1</div>
<div>234567890</div>
</div>Flexbox автоматически увеличит размер второго div, чтобы вместить более длинный текст.
Добавление gap
Как и в CSS Grid, можно использовать свойство gap, чтобы определить расстояние между каждым элементом Flexbox.
.grid-flex {
display: flex;
gap: 1rem;
}Строки и столбцы
По умолчанию flexbox выравнивает элементы в строке/row. Это можно изменить, установив flex-direction на column.
.grid-flex {
flex-direction: column;
}flex-direction определяет первичную и вторичную оси (это важно, когда мы начинаем выравнивать объекты).
Для flex-direction: row первичная ось — левая и правая (или горизонтальная), а вторичная — верхняя и нижняя (или вертикальная). Для flex-direction: column всё наоборот.
Выравнивание
Flexbox предлагает несколько способов выравнивания контента…
Первичная ось
Свойство justify-content указывает Flexbox, как выровнять контейнеры по первичной оси, и имеет несколько возможных значений...
flex-start— Размещает элементы с начала (по умолчанию)flex-end— Размещает элементы с концаcenter— Размещает элементы вокруг центраspace-between— Равномерное распределение элементов. Первый элемент — вровень с началом. Последний — вровень с концом.space-around— Равномерное распределение элементов. Начальный и конечный промежутки в два раза меньше, чем промежуток между элементами.space-evenly— Равномерное распределение элементов. Начальный, промежуточный и конечный промежутки имеют одинаковый размер.
Наличие всех этих возможностей очень мощно, но в то же время немного запутывает.
Я считаю, что наличие демонстрации, позволяющей наглядно увидеть различия, очень полезно.
Вторичная ось
Аналогично, свойство align-items указывает flexbox, как выровнять контейнеры по вторичной оси.
У него также есть несколько значений. Некоторые из них совпадают со значениями для justify-content, а некоторые нет…
stretch— Растянуть контейнеры до размера самого большого (по умолчанию).flex-start— Выравнивание элементов по началу осиflex-end— Выравнивание элементов по концу осиcenter— Выравнивание элементов по оси
И снова демонстрация этих свойств в действии.
Перенос
По умолчанию Flexbox будет располагать весь контент на одной линии вдоль первичной оси.
Хотя он подстраивает контейнеры под содержимое, иногда содержимого оказывается слишком много для имеющегося пространства. В таких ситуациях содержимое выходит за пределы родительского контейнера и приводит к горизонтальной или вертикальной прокрутке.
Вы можете использовать свойство flex-wrap со значением wrap, чтобы указать Flexbox на необходимость переноса контента на другую строку.
.grid-flex {
display: flex;
flex-wrap: wrap;
}Демонстрация flex-wrap в действии.
Расширенные возможности
Как видите, Flexbox умеет очень много!
Один момент, который не был рассмотрен в этой статье, — определение того, как содержимое Flexbox увеличивается и уменьшается. С помощью свойств flex-basis, flex-grow и flex-shrink можно сделать много интересного.
Но это также быстро становится очень сложным. И, честно говоря, именно в таких ситуациях я предпочитаю использовать CSS Grid.
Позже мы рассмотрим несколько практических применений Flexbox и то, как я использую его в своих проектах.