DevSkillRoad

Flexbox. Часть 2

🤸 flex-wrap, gap, align-self, flex-grow, flex-shrink, order

В прошлой лекции мы разобрали основы Flexbox. Теперь переходим к более гибким настройкам: перенос строк, расстояния между элементами, управление размером и порядком.

1. flex-wrap — перенос на новую строку

По умолчанию все флекс-элементы сжимаются, чтобы поместиться в одну строку. flex-wrap позволяет переносить их на следующую строку, если не хватает места.

Возможные значения:

flex-wrap: nowrap (по умолчанию)

.container {
    display: flex;
    flex-wrap: nowrap;
}
1 (120px)
2 (120px)
3 (120px)

⚠️ Элементы сжались, чтобы поместиться (не поместились по ширине)

flex-wrap: wrap

.container {
    display: flex;
    flex-wrap: wrap;
}
1 (120px)
2 (120px)
3 (120px)

✅ Третий элемент перенёсся на новую строку

2. gap — расстояние между элементами

Задаёт отступы между флекс-элементами (работает и в Grid). Не добавляет отступы по краям.

.container {
    display: flex;
    gap: 20px;
}
1
2
3

✅ Между элементами расстояние 20px, по краям — нет

3. align-self — выравнивание одного элемента

Позволяет переопределить align-items для конкретного элемента. Применяется к самому элементу, а не к контейнеру.

Возможные значения:

align-self: stretch (по умолчанию)

.container {
    display: flex;
    align-items: flex-start;
}
.special {
    align-self: stretch;
}
1
2 (stretch)
3

✅ Второй элемент растянулся на всю высоту

align-self: center

.container {
    display: flex;
    align-items: flex-start;
}
.special {
    align-self: center;
}
1
2 (center)
3

✅ Второй элемент выровнялся по центру

4. flex-grow — как элемент занимает лишнее место

Определяет, как элемент будет растягиваться, если есть свободное место. Значение — число (0, 1, 2...). По умолчанию 0 — элемент не растягивается.

.container {
    display: flex;
}
.item1 {
    flex-grow: 1;
}
.item2 {
    flex-grow: 2;
}
.item3 {
    flex-grow: 0;
}
flex-grow: 1
flex-grow: 2
flex-grow: 0

✅ Второй элемент занял в 2 раза больше лишнего места, чем первый. Третий не растянулся.

5. flex-shrink — как элемент сжимается при нехватке места

Определяет, как элемент будет сжиматься, если места недостаточно. По умолчанию 1 — все сжимаются равномерно. 0 — не сжимается.

.container {
    display: flex;
    width: 300px;
}
.item1 {
    width: 150px;
    flex-shrink: 0;
}
.item2 {
    width: 150px;
    flex-shrink: 1;
}
150px (не сжимается)
150px (сжимается)

✅ Первый элемент сохранил 150px, второй сжался

6. order — изменение порядка элементов

Позволяет менять порядок элементов без изменения HTML. По умолчанию все элементы имеют order: 0. Чем меньше число, тем элемент выше.

.container {
    display: flex;
}
.item1 {
    order: 3;
}
.item2 {
    order: 1;
}
.item3 {
    order: 2;
}
1 (order: 3)
2 (order: 1)
3 (order: 2)

✅ Порядок в HTML: 1, 2, 3. Порядок на экране: 2, 3, 1

7. Сокращённая запись flex

Свойство flex объединяет три свойства в одном: flex-grow, flex-shrink и flex-basis (базовый размер элемента).

Синтаксис:

.item {
    flex: 1;           /* займёт всё доступное место */
}
.item2 {
    flex: 0 1 auto;    /* поведение по умолчанию */
}
.item3 {
    flex: 2 0 150px;   /* растянется в 2 раза больше, минимальная ширина 150px */
}
flex: 1
flex: 2
flex: 0

✅ Первый и второй растянулись пропорционально, третий не растянулся

📌 Совет: Самое частое использование — flex: 1 на элементе, чтобы он занял всё доступное место в контейнере.
📓 Из тетради: «Flexbox — это не магия, а набор правил. flex-grow для растяжения, flex-shrink для сжатия, order для порядка. Освоите — сможете собрать любой макет».