CSS Flexbox: Полное руководство с практическими примерами
Дмитрий Борисенко
Flexbox (Flexible Box Layout) — это одномерный метод компоновки, который превосходно справляется с распределением пространства и выравниванием элементов в контейнере. Он идеален для макетов компонентов, навигационных панелей и любых сценариев, где нужны гибкие, адаптивные расположения.
Основы Flex-контейнера
Чтобы создать flex-контейнер, примените display: flex:
.container {
display: flex;
/* или display: inline-flex; для инлайн-контейнеров */
}
Главная ось и поперечная ось
Понимание осей критически важно для Flexbox:
.container {
display: flex;
flex-direction: row; /* Главная ось: горизонтальная, Поперечная ось: вертикальная */
/* Другие значения: row-reverse, column, column-reverse */
}
Свойства Flex-контейнера
1. justify-content (Выравнивание по главной оси)
.container {
display: flex;
justify-content: flex-start; /* По умолчанию */
/* Другие значения: flex-end, center, space-between, space-around, space-evenly */
}
/* Практический пример: Навигация */
.nav {
display: flex;
justify-content: space-between;
padding: 1rem;
background: #2c3e50;
}
.nav-logo {
font-weight: bold;
color: white;
}
.nav-links {
display: flex;
gap: 2rem;
list-style: none;
}
2. align-items (Выравнивание по поперечной оси)
.container {
display: flex;
align-items: stretch; /* По умолчанию */
/* Другие значения: flex-start, flex-end, center, baseline */
}
/* Практический пример: Карточка с иконкой */
.card {
display: flex;
align-items: center;
padding: 1rem;
background: white;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
.card-icon {
width: 48px;
height: 48px;
margin-right: 1rem;
}
Интерактивный пример Flexbox
Попробуйте этот интерактивный flexbox макет карточек:
Демо Flexbox карточек
3. flex-wrap
.container {
display: flex;
flex-wrap: nowrap; /* По умолчанию */
/* Другие значения: wrap, wrap-reverse */
}
/* Практический пример: Список тегов */
.tag-list {
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
}
.tag {
padding: 0.25rem 0.75rem;
background: #3498db;
color: white;
border-radius: 20px;
font-size: 0.875rem;
}
4. align-content (Многострочная поперечная ось)
.container {
display: flex;
flex-wrap: wrap;
align-content: flex-start;
/* Другие значения: flex-end, center, space-between, space-around, stretch */
height: 300px;
}
5. gap (Расстояние между элементами)
.container {
display: flex;
gap: 20px; /* Промежуток между рядами и колонками */
/* Или отдельно: row-gap: 10px; column-gap: 20px; */
}
Свойства Flex-элементов
1. flex-grow, flex-shrink, flex-basis
.item {
flex-grow: 0; /* Не растет */
flex-shrink: 1; /* Может сжиматься */
flex-basis: auto; /* Начальный размер */
/* Сокращенная запись */
flex: 1; /* Эквивалентно: flex: 1 1 0 */
}
/* Практический пример: Макет с боковой панелью */
.layout {
display: flex;
gap: 2rem;
min-height: 100vh;
}
.sidebar {
flex: 0 0 250px; /* Не растет и не сжимается, фиксированные 250px */
background: #ecf0f1;
padding: 1rem;
}
.main-content {
flex: 1; /* Занимает оставшееся пространство */
padding: 1rem;
}
2. align-self (Индивидуальное выравнивание по поперечной оси)
.item {
align-self: auto; /* По умолчанию - использует значение align-items */
/* Другие значения: flex-start, flex-end, center, baseline, stretch */
}
/* Практический пример: Hero-секция */
.hero {
display: flex;
align-items: center;
min-height: 400px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
.hero-content {
flex: 1;
padding: 2rem;
color: white;
}
.hero-image {
flex: 1;
align-self: stretch;
object-fit: cover;
}
3. order (Визуальный порядок)
.item {
order: 0; /* По умолчанию */
/* Отрицательные значения идут первыми, положительные - последними */
}
/* Практический пример: Mobile-first макет */
.article {
display: flex;
flex-direction: column;
}
.article-content { order: 2; }
.article-sidebar { order: 1; }
.article-related { order: 3; }
@media (min-width: 768px) {
.article {
flex-direction: row;
}
.article-content { order: 1; flex: 2; }
.article-sidebar { order: 2; flex: 1; }
.article-related { order: 3; flex: 1; }
}
Распространенные паттерны Flexbox
1. Центрирование контента
/* Идеальное центрирование */
.center-container {
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
}
/* Только горизонтальное центрирование */
.h-center {
display: flex;
justify-content: center;
}
/* Только вертикальное центрирование */
.v-center {
display: flex;
align-items: center;
}
2. Колонки одинаковой высоты
.columns {
display: flex;
gap: 2rem;
}
.column {
flex: 1;
padding: 1.5rem;
background: #f8f9fa;
border-radius: 8px;
/* Все колонки автоматически будут одинаковой высоты */
}
3. Прилипающий футер
body {
display: flex;
flex-direction: column;
min-height: 100vh;
margin: 0;
}
main {
flex: 1; /* Занимает все доступное пространство */
}
footer {
background: #2c3e50;
color: white;
padding: 2rem;
/* Всегда прилипает к низу */
}
4. Медиа-объект
.media {
display: flex;
align-items: flex-start;
gap: 1rem;
}
.media-image {
flex-shrink: 0;
width: 100px;
height: 100px;
object-fit: cover;
border-radius: 8px;
}
.media-content {
flex: 1;
}
5. Адаптивная навигация
.navbar {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem 2rem;
background: #2c3e50;
}
.nav-menu {
display: flex;
gap: 2rem;
list-style: none;
margin: 0;
padding: 0;
}
.nav-item a {
color: white;
text-decoration: none;
transition: opacity 0.3s;
}
.nav-item a:hover {
opacity: 0.8;
}
/* Мобильное меню */
@media (max-width: 768px) {
.nav-menu {
position: fixed;
left: -100%;
top: 70px;
flex-direction: column;
background-color: #2c3e50;
width: 100%;
text-align: center;
transition: 0.3s;
padding: 2rem 0;
}
.nav-menu.active {
left: 0;
}
}
6. Сетка карточек с Flexbox
.card-grid {
display: flex;
flex-wrap: wrap;
gap: 1.5rem;
padding: 2rem;
}
.card {
flex: 1 1 300px; /* Растет, сжимается, минимальная ширина 300px */
display: flex;
flex-direction: column;
background: white;
border-radius: 12px;
overflow: hidden;
box-shadow: 0 4px 6px rgba(0,0,0,0.1);
transition: transform 0.3s;
}
.card:hover {
transform: translateY(-4px);
}
.card-image {
height: 200px;
object-fit: cover;
}
.card-content {
flex: 1;
display: flex;
flex-direction: column;
padding: 1.5rem;
}
.card-title {
margin: 0 0 0.5rem;
font-size: 1.25rem;
}
.card-description {
flex: 1;
color: #666;
line-height: 1.6;
}
.card-footer {
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 1rem;
padding-top: 1rem;
border-top: 1px solid #eee;
}
Flexbox vs Grid
Используйте Flexbox когда:
- Работаете с одномерными макетами
- Размер контента должен определять макет
- Нужно выравнивание и распределение пространства
- Создаете навигационные панели, тулбары или небольшие компоненты
Используйте Grid когда:
- Работаете с двумерными макетами
- Нужен точный контроль над рядами и колонками
- Создаете сложные макеты страниц
- Хотите накладывать элементы друг на друга
Поддержка браузерами и префиксы
Современные браузеры полностью поддерживают Flexbox, но для старых браузеров:
.container {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-box-pack: center;
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center;
}
Flexbox стал незаменимым инструментом для современной веб-разработки. Освойте эти концепции, и вы сможете создавать гибкие, адаптивные макеты с легкостью!