5. Flexbox
CSS: Flexbox основы
Заголовок раздела «CSS: Flexbox основы»
Что такое Flexbox?
Заголовок раздела «Что такое Flexbox?»Flexbox (Flexible Box Layout module) — это одномерный макетный модуль CSS, предназначенный для эффективного размещения элементов внутри контейнера, распределения пространства между ними и их выравнивания, даже если их размер неизвестен или динамичен. “Одномерный” означает, что Flexbox работает либо вдоль основной оси (горизонтально), либо вдоль поперечной оси (вертикально) за один раз.
В основе Flexbox лежит концепция Flex-контейнера (родительского элемента) и Flex-элементов (его прямых потомков). Большинство свойств Flexbox применяются либо к контейнеру, либо к элементам, но не к обоим сразу.
Свойства Flex-контейнера (родителя)
Заголовок раздела «Свойства Flex-контейнера (родителя)»Эти свойства применяются к элементу, который становится Flex-контейнером.
display: flex;|inline-flex;- Определяет элемент как Flex-контейнер.
flex— блочный,inline-flex— строчно-блочный.
- Определяет элемент как Flex-контейнер.
flex-direction:- Определяет направление основной оси, по которой располагаются Flex-элементы.
- Значения:
row(по умолчанию, слева направо),row-reverse(справа налево),column(сверху вниз),column-reverse(снизу вверх).
justify-content:- Выравнивает Flex-элементы вдоль основной оси текущей строки.
- Значения:
flex-start,flex-end,center,space-between,space-around,space-evenly.
align-items:- Выравнивает Flex-элементы вдоль поперечной оси текущей строки.
- Значения:
flex-start,flex-end,center,baseline,stretch(по умолчанию).
flex-wrap:- Управляет переносом Flex-элементов на новую строку (или столбец), если они не умещаются в одну строку/столбец.
- Значения:
nowrap(по умолчанию),wrap,wrap-reverse.
gap:|row-gap:|column-gap:- Устанавливает промежутки между Flex-элементами (современная альтернатива
margin).
- Устанавливает промежутки между Flex-элементами (современная альтернатива
Свойства Flex-элементов (потомков)
Заголовок раздела «Свойства Flex-элементов (потомков)»Эти свойства применяются к прямым потомкам Flex-контейнера.
flex-grow:- Определяет, насколько Flex-элемент может вырасти относительно других элементов, если есть свободное пространство. По умолчанию
0.
- Определяет, насколько Flex-элемент может вырасти относительно других элементов, если есть свободное пространство. По умолчанию
flex-shrink:- Определяет, насколько Flex-элемент может сжаться относительно других элементов, если не хватает места. По умолчанию
1.
- Определяет, насколько Flex-элемент может сжаться относительно других элементов, если не хватает места. По умолчанию
flex-basis:- Определяет начальный размер элемента перед распределением свободного пространства. Может быть
auto(по умолчанию, основано на ширине/высоте содержимого) или значением длины (например,100px,20%).
- Определяет начальный размер элемента перед распределением свободного пространства. Может быть
flex:- Сокращенная запись для
flex-grow,flex-shrinkиflex-basis. - Пример:
flex: 1 1 auto;
- Сокращенная запись для
align-self:- Переопределяет свойство
align-itemsдля конкретного Flex-элемента. Принимает те же значения, что иalign-items.
- Переопределяет свойство
Примеры использования
Заголовок раздела «Примеры использования»Пример 1: Базовый Flex-контейнер и направление
Заголовок раздела «Пример 1: Базовый Flex-контейнер и направление».container-1 { display: flex; /* Делаем родителя flex-контейнером */ flex-direction: row; /* Элементы располагаются в строку (по умолчанию) */ border: 2px solid #007bff; padding: 10px; gap: 10px; /* Отступ между элементами */}.item-1 { background-color: #e0f7fa; padding: 20px; border: 1px solid #00bcd4;}/* HTML:<div class="container-1"> <div class="item-1">Элемент 1</div> <div class="item-1">Элемент 2</div> <div class="item-1">Элемент 3</div></div>*/Пример 2: Выравнивание элементов по центру
Заголовок раздела «Пример 2: Выравнивание элементов по центру».container-2 { display: flex; justify-content: center; /* Центрирует элементы по горизонтали */ align-items: center; /* Центрирует элементы по вертикали */ height: 150px; /* Важно: для align-items нужна высота */ border: 2px solid #28a745;}.item-2 { width: 60px; height: 60px; background-color: #e8f5e9; margin: 5px;}/* HTML:<div class="container-2"> <div class="item-2"></div> <div class="item-2"></div></div>*/Пример 3: Распределение пространства с space-between и flex-wrap
Заголовок раздела «Пример 3: Распределение пространства с space-between и flex-wrap».container-3 { display: flex; flex-wrap: wrap; /* Разрешаем перенос элементов */ justify-content: space-between; /* Элементы по краям, пространство между ними */ width: 300px; /* Узкий контейнер для демонстрации wrap */ border: 2px solid #ffc107; padding: 5px; gap: 10px;}.item-3 { width: 80px; height: 40px; background-color: #fff8e1;}/* HTML:<div class="container-3"> <div class="item-3"></div> <div class="item-3"></div> <div class="item-3"></div> <div class="item-3"></div></div>*/Пример 4: Гибкие элементы с flex-grow и flex-basis
Заголовок раздела «Пример 4: Гибкие элементы с flex-grow и flex-basis».container-4 { display: flex; width: 400px; border: 2px solid #dc3545; padding: 5px;}.item-4-1 { flex-basis: 100px; /* Начальный размер 100px */ background-color: #ffebee; padding: 10px;}.item-4-2 { flex-grow: 1; /* Займет все оставшееся пространство */ background-color: #ffcdd2; padding: 10px;}.item-4-3 { flex-grow: 2; /* Займет в 2 раза больше пространства, чем item-4-2 */ background-color: #ef9a9a; padding: 10px;}/* HTML:<div class="container-4"> <div class="item-4-1">База 100px</div> <div class="item-4-2">Растем x1</div> <div class="item-4-3">Растем x2</div></div>*/Пример 5: Использование сокращенного свойства flex
Заголовок раздела «Пример 5: Использование сокращенного свойства flex».container-5 { display: flex; width: 350px; border: 2px solid #6f42c1; padding: 5px;}.item-5-1 { flex: 1; /* flex-grow: 1, flex-shrink: 1, flex-basis: 0% */ background-color: #ede7f6; padding: 10px;}.item-5-2 { flex: 2 1 100px; /* grow: 2, shrink: 1, basis: 100px */ background-color: #d1c4e9; padding: 10px;}/* HTML:<div class="container-5"> <div class="item-5-1">Flex: 1</div> <div class="item-5-2">Flex: 2 1 100px</div></div>*/Типичные ошибки
Заголовок раздела «Типичные ошибки»- Забыть
display: flex;: Самая распространенная ошибка — пытаться применять свойства Flexbox к элементам, которые не являются частью Flex-контейнера. Всегда начинайте сdisplay: flex;на родительском элементе. - Неправильная ось: Пытаться выравнивать элементы с помощью
justify-content, когда нужно использоватьalign-items, или наоборот. Помните,justify-contentработает по основной оси (flex-direction), аalign-items— по поперечной. - Отсутствие высоты/ширины контейнера: Для эффективной работы
align-items(выравнивание по поперечной оси), Flex-контейнер должен иметь определенную высоту (или высоту, которая определяется его содержимым). Аналогично дляjustify-contentприcolumnнаправлении. margin: auto;против Flexbox свойств: Хотяmargin: auto;работает внутри Flexbox для центрирования или разделения элементов, чаще всего для распределения пространства лучше использоватьjustify-contentилиalign-self.
🎯 Практика
Заголовок раздела «🎯 Практика»- Создайте
divс классомmy-flex-container. - Внутри него создайте три
divс классомmy-flex-item. - Примените
display: flex;кmy-flex-container. - Расположите первый элемент слева, третий справа, а второй — точно по центру между ними, используя
justify-content. - Сделайте так, чтобы средний элемент занимал в три раза больше ширины, чем два других, используя свойство
flex.
💡 Совет
Заголовок раздела «💡 Совет»Используйте инструменты разработчика браузера (Developer Tools). Большинство современных браузеров (Chrome, Firefox, Edge) имеют специальные инструменты для отладки Flexbox, которые подсвечивают Flex-контейнеры и элементы, показывают их оси и позволяют интерактивно менять Flexbox-свойства, чтобы сразу увидеть результат. Это незаменимый инструмент для изучения и отладки Flexbox макетов.