Flexbox (гибкая блочная модель) – это модуль CSS, который позволяет легко управлять размещением и выравниванием элементов внутри контейнера. Он предоставляет мощные инструменты для создания гибких макетов, которые адаптируются под разные размеры экранов.
Основные понятия Flexbox
- Контейнер Flexbox: Это элемент, к которому применяется свойство
display: flex
. Внутри этого элемента находятся дочерние элементы, называемые флекс-элементами..container { display: flex; }
- Флекс-элемент: Любой дочерний элемент контейнера Flexbox становится флекс-элементом и может быть позиционирован с помощью свойств Flexbox.
<div class="container"> <div class="item">Элемент 1</div> <div class="item">Элемент 2</div> <div class="item">Элемент 3</div> </div>
- Основная ось (main axis): Направление, вдоль которого располагаются флекс-элементы. По умолчанию основная ось идет слева направо.
/* Основная ось по умолчанию */ .container { display: flex; }
- Перекрестная ось (cross axis): Ось, перпендикулярная основной оси. Обычно она направлена сверху вниз.
/* Перекрестная ось по умолчанию */ .container { display: flex; }
- Гибкость (flexibility): Способность флекс-элементов изменять свои размеры, чтобы заполнить доступное пространство или наоборот сжиматься при необходимости.
.item { flex: 1; /* Элемент занимает всё доступное пространство */ }
Свойства Flex-контейнера
1. display
display: flex;
: Устанавливает контейнер как флекс-контейнер..container { display: flex; }
display: inline-flex;
: То же самое, что иflex
, но делает контейнер строчным элементом..inline-container { display: inline-flex; }
2. flex-direction
Определяет направление основной оси:
row
: Элементы располагаются горизонтально слева направо (по умолчанию)..container { flex-direction: row; }
row-reverse
: Элементы располагаются справа налево..container { flex-direction: row-reverse; }
column
: Элементы располагаются вертикально сверху вниз..container { flex-direction: column; }
column-reverse
: Элементы располагаются снизу вверх..container { flex-direction: column-reverse; }
3. justify-content
Выравнивание элементов по главной оси:
flex-start
: Выровнять элементы по началу основной оси (слева/верху)..container { justify-content: flex-start; }
flex-end
: Выровнять элементы по концу основной оси (справа/внизу)..container { justify-content: flex-end; }
center
: Центрировать элементы по основной оси..container { justify-content: center; }
space-between
: Равномерно распределить элементы, оставляя промежутки только между ними..container { justify-content: space-between; }
space-around
: Распределять элементы равномерно, включая равные промежутки до начала и конца строки..container { justify-content: space-around; }
space-evenly
: Делит свободное пространство поровну между всеми элементами, включая начало и конец строки..container { justify-content: space-evenly; }
4. align-items
Выравнивание элементов по перекрестной оси:
stretch
: Растягивает элементы, заполняя всю высоту родительского контейнера (значение по умолчанию)..container { align-items: stretch; }
flex-start
: Выровнять элементы по верхнему краю контейнера..container { align-items: flex-start; }
flex-end
: Выровнять элементы по нижнему краю контейнера..container { align-items: flex-end; }
center
: Центрировать элементы по вертикали..container { align-items: center; }
baseline
: Выровнять элементы по базовой линии текста..container { align-items: baseline; }
5. align-content
Управление расположением строк в многострочном флексе:
stretch
: Строки растягиваются, занимая все доступное пространство..container { align-content: stretch; }
flex-start
: Все строки смещаются к началу контейнера..container { align-content: flex-start; }
flex-end
: Все строки смещаются к концу контейнера..container { align-content: flex-end; }
center
: Центрирует строки относительно контейнера..container { align-content: center; }
space-between
: Промежутки распределяются так, чтобы первая строка была у верхнего края, последняя — у нижнего, а остальные равномерно располагались между ними..container { align-content: space-between; }
space-around
: Промежутки распределяются вокруг каждой строки, делая их одинаковыми..container { align-content: space-around; }
6. flex-wrap
Определение поведения флекс-элементов при переполнении контейнера:
nowrap
: Не переносить элементы на новую строку (значение по умолчанию)..container { flex-wrap: nowrap; }
wrap
: Переносить элементы на новые строки, если они не помещаются в одну линию..container { flex-wrap: wrap; }
wrap-reverse
: То же, что иwrap
, но строки идут в обратном порядке..container { flex-wrap: wrap-reverse; }
7. gap
Добавляет пробелы между флекс-элементами:
gap: 10px;
: Добавляет промежуток в 10 пикселей между элементами..container { gap: 10px; }
row-gap: 20px; column-gap: 30px;
: Можно отдельно задать промежутки по строкам и столбцам..container { row-gap: 20px; column-gap: 30px; }
Свойства флекс-элемента
1. order
Позволяет изменить порядок отображения элемента среди других флекс-элементов:
order: 1;
: Перемещает элемент ближе к концу..item { order: 1; }
order: -1;
: Перемещает элемент ближе к началу..item { order: -1; }
2. flex-grow
Определяет способность элемента увеличиваться, чтобы занять оставшееся место:
flex-grow: 1;
: Элемент будет расти пропорционально другим элементам с таким же значением..item { flex-grow: 1; }
flex-grow: 0;
: Элемент не будет увеличивать свой размер..item { flex-grow: 0; }
3. flex-shrink
Определяет способность элемента уменьшаться, когда места недостаточно:
flex-shrink: 1;
: Элемент будет пропорционально уменьшаться вместе с другими элементами..item { flex-shrink: 1; }
flex-shrink: 0;
: Элемент не будет уменьшать свой размер..item { flex
4. flex-basis
Задает начальный размер элемента перед тем, как он начнет изменяться согласно свойствам flex-grow
и flex-shrink
:
flex-basis: auto;
: Использует ширину/высоту элемента по умолчанию..item { flex-basis: auto; }
flex-basis: 200px;
: Начальная ширина элемента равна 200 пикселям..item { flex-basis: 200px; }
5. align-self
Позволяет переопределить выравнивание отдельного элемента по перекрестной оси:
auto
: Наследуется от родителя (align-items
)..item { align-self: auto; }
flex-start
,flex-end
,center
,stretch
,baseline
: Те же значения, что и у свойстваalign-items
..item { align-self: flex-start; }
6. flex
Сокращенная запись для всех трех свойств: flex-grow
, flex-shrink
, flex-basis
:
flex: 1 1 auto;
: Эквивалентноflex-grow: 1; flex-shrink: 1; flex-basis: auto;
..item { flex: 1 1 auto; }
flex: none;
: Убирает возможность изменения размера элемента..item { flex: none; }
Пример
Вот полный пример HTML-документа с использованием Flexbox:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Пример Flexbox</title>
<style> body { margin: 0; font-family: Arial, sans-serif; } .container { display: flex; justify-content: space-between; align-items: center; height: 100vh; background-color: #f9f9f9; gap: 20px; } .item { padding: 20px; background-color: #eaeaea; border-radius: 5px; text-align: center; flex: 1; } </style>
</head>
<body>
<div class="container">
<div class="item">Элемент 1</div>
<div class="item">Элемент 2</div>
<div class="item">Элемент 3</div>
</div>
</body>
</html>
Этот пример демонстрирует использование Flexbox для создания простого адаптивного макета с тремя элементами, которые автоматически занимают доступное пространство и центрируются по высоте экрана.