CSS-свойство `flex`
Базовая поддержка Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и в разных версиях браузеров. Она доступна во всех браузерах с сентября 2015 года.
flex — это CSS-сокращённое свойство, которое задаёт, как флекс-элемент будет увеличиваться или уменьшаться, чтобы занять доступное пространство во флекс-контейнере.
Попробуйте
flex: 1;
flex: 2;
flex: 1 30px;
flex: 1 1 100px;
<section class="default-example" id="default-example"> <div class="transition-all" id="example-element">Change me</div> <div>flex: 1</div> <div>flex: 1</div> </section>
.default-example {
border: 1px solid #c5c5c5;
width: auto;
max-height: 300px;
display: flex;
}
.default-example > div {
background-color: rgb(0 0 255 / 0.2);
border: 3px solid blue;
margin: 10px;
flex-grow: 1;
flex-shrink: 1;
flex-basis: 0;
}
#example-element {
background-color: rgb(255 0 200 / 0.2);
border: 3px solid rebeccapurple;
}
Составляющие свойства
Это свойство является сокращённой записью следующих CSS-свойств:
Синтаксис
/* Keyword value */ flex: none; /* 0 0 auto */ /* One value, unitless number: flex-grow flex-basis is then equal to 0%. */ flex: 2; /* 2 1 0% */ /* One value, width/height: flex-basis */ flex: auto; /* 1 1 auto */ flex: 10em; /* 1 1 10em */ flex: 30%; flex: min-content; /* Two values: flex-grow | flex-basis */ flex: 1 30px; /* 1 1 30px */ /* Two values: flex-grow | flex-shrink */ flex: 2 2; /* 2 2 0% */ /* Three values: flex-grow | flex-shrink | flex-basis */ flex: 2 2 10%; /* Global values */ flex: inherit; flex: initial; /* 0 1 auto */ flex: revert; flex: revert-layer; flex: unset;
Свойство flex можно задать одним, двумя или тремя значениями.
-
Синтаксис с одним значением: значение должно быть одним из следующих:
- допустимое значение для
flex-grow: в этом случае сокращённая запись раскрывается вflex: <flex-grow> 1 0%. - допустимое значение для
flex-basis: в этом случае сокращённая запись раскрывается вflex: 1 1 <flex-basis>. - ключевое слово
noneили одно из глобальных ключевых слов.
- допустимое значение для
-
Синтаксис с двумя значениями:
-
Первое значение должно быть допустимым значением для
flex-grow. -
Второе значение должно быть одним из следующих:
- допустимое значение для
flex-shrink: в этом случае сокращённая запись раскрывается вflex: <flex-grow> <flex-shrink> 0%. - допустимое значение для
flex-basis: в этом случае сокращённая запись раскрывается вflex: <flex-grow> 1 <flex-basis>.
- допустимое значение для
-
-
Синтаксис с тремя значениями: значения должны идти в следующем порядке:
- допустимое значение для
flex-grow. - допустимое значение для
flex-shrink. - допустимое значение для
flex-basis.
- допустимое значение для
Значения
-
<'flex-grow'> - Задаёт значение
flex-growфлекс-элемента. Отрицательные значения считаются недопустимыми. Если значение не указано, по умолчанию используется1. (Начальное значение —0) -
<'flex-shrink'> - Задаёт значение
flex-shrinkфлекс-элемента. Отрицательные значения считаются недопустимыми. Если значение не указано, по умолчанию используется1. (Начальное значение —1) -
<'flex-basis'> - Задаёт значение
flex-basisфлекс-элемента. Если значение не указано, по умолчанию используется0%. Начальное значение —auto. -
none - Размер элемента определяется его свойствами
widthиheight. Элемент полностью негибкий: он не уменьшается и не увеличивается относительно флекс-контейнера. Это эквивалентно заданиюflex: 0 0 auto.
Распространённых эффектов флексбокса можно добиться с помощью следующих значений flex:
-
initial: флекс-элемент не увеличивается, но может уменьшаться. Это значение по умолчанию раскрывается вflex: 0 1 auto. Размер элемента определяется его свойствамиwidthилиheightв зависимости отflex-direction. Если доступного пространства не хватает, элемент уменьшается до своего минимального размера, чтобы уместиться в контейнере, но не увеличивается, чтобы занять доступное положительное пространство во флекс-контейнере. -
auto: флекс-элемент может увеличиваться и уменьшаться. Это значение раскрывается вflex: 1 1 auto. Размер элемента определяется его свойствамиwidthилиheightв зависимости отflex-direction, но элемент увеличивается, чтобы занять доступное положительное пространство во флекс-контейнере, или уменьшается до минимального размера, чтобы уместиться в контейнере при нехватке места. Флекс-элемент полностью гибкий. -
none: флекс-элемент не увеличивается и не уменьшается. Это значение раскрывается вflex: 0 0 auto. Размер элемента определяется его свойствамиwidthилиheightв зависимости от направления флекс-контейнера. Флекс-элемент полностью негибкий. -
flex: <number [1,∞]>: основной размер флекс-элемента будет пропорционален заданному числу. Это значение раскрывается вflex: <number> 1 0%. Оно задаётflex-basisравным0%и делает флекс-элемент гибким. Элемент будет не меньше своего минимального размера по ширине или высоте, а доступное положительное пространство контейнера будет распределено пропорционально коэффициентам роста этого элемента и соседних флекс-элементов. Если все флекс-элементы используют этот шаблон, их размеры будут пропорциональны заданным числовым значениям.
Описание
В большинстве случаев авторам следует задавать для flex одно из следующих значений: auto, initial, none или положительное число без единиц измерения. Чтобы увидеть эффект от этих значений, попробуйте изменить размеры флекс-контейнеров ниже:
<div class="flex-container"> <div class="item auto">auto</div> <div class="item auto">auto</div> <div class="item auto">auto</div> </div> <div class="flex-container"> <div class="item auto">auto</div> <div class="item initial">initial</div> <div class="item initial">initial</div> </div> <div class="flex-container"> <div class="item auto">auto</div> <div class="item auto">auto</div> <div class="item none">none</div> </div> <div class="flex-container"> <div class="item initial">initial</div> <div class="item none">none</div> <div class="item none">none</div> </div> <div class="flex-container"> <div class="item four">4</div> <div class="item two">2</div> <div class="item one">1</div> </div>
* {
box-sizing: border-box;
}
.flex-container {
background-color: #f4f7f8;
resize: horizontal;
overflow: hidden;
display: flex;
margin: 1em;
}
.item {
margin: 1em;
padding: 0.5em;
width: 110px;
min-width: 0;
background-color: #1b5385;
color: white;
font-family: monospace;
font-size: 13px;
}
.initial {
flex: initial;
}
.auto {
flex: auto;
}
.none {
flex: none;
}
.four {
flex: 4;
}
.two {
flex: 2;
}
.one {
flex: 1;
}
По умолчанию размер флекс-элементов не уменьшается ниже размера min-content. Чтобы изменить это поведение, задайте для элемента min-width или min-height>.
Формальное определение
| Начальное значение | как у каждого из свойств сокращённой записи: |
|---|---|
| Применяется к | флекс-элементам, включая псевдоэлементы в потоке |
| Наследуется | нет |
| Вычисленное значение | как у каждого из свойств сокращённой записи: |
| Тип анимации | как у каждого из свойств сокращённой записи: |
Формальный синтаксис
flex =
none |
[ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
Примеры
Значение flex: auto
В этом примере показано, как флекс-элемент со значением flex: auto увеличивается, занимая всё свободное пространство в контейнере.
HTML
<div id="flex-container">
<div id="flex-auto">
flex: auto (click to remove/add the `flex: initial` box)
</div>
<div id="default">flex: initial</div>
</div>
CSS
body * {
padding: 1rem;
user-select: none;
box-sizing: border-box;
font-family: "Consolas", "Arial", sans-serif;
}
#flex-container {
border: 2px dashed gray;
display: flex;
}
#flex-auto {
cursor: pointer;
background-color: wheat;
flex: auto;
}
#default {
background-color: lightblue;
}
JavaScript
const flexAutoItem = document.getElementById("flex-auto");
const defaultItem = document.getElementById("default");
flexAutoItem.addEventListener("click", () => {
defaultItem.style.display =
defaultItem.style.display === "none" ? "block" : "none";
});
Результат
Флекс-контейнер содержит два флекс-элемента:
- У элемента
#flex-autoзначениеflexравноauto. Значениеautoраскрывается в1 1 auto, то есть элемент может увеличиваться. - Для элемента
#defaultзначениеflexне задано, поэтому по умолчанию используется значениеinitial. Значениеinitialраскрывается в0 1 auto, то есть элемент не может увеличиваться.
Элемент #default занимает столько места, сколько требует его ширина, но не увеличивается, чтобы занять больше места. Всё оставшееся пространство занимает элемент #flex-auto.
При нажатии на элемент #flex-auto мы задаём свойству display элемента #default значение none, удаляя его из макета. Затем элемент #flex-auto увеличивается и занимает всё доступное пространство контейнера. Повторное нажатие на элемент #flex-auto добавляет элемент #default обратно в контейнер.
Спецификации
Совместимость с браузерами
| Компьютеры | Мобильные устройства | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome для Android | Firefox для Android | Opera для Android | Safari для iOS | Samsung Internet | WebView для Android | WebView для iOS | |
flex |
29
21
|
12
12
|
22Начиная с Firefox 28 поддерживается многострочный флексбокс.До Firefox 32 браузер не мог анимировать значения, начинающиеся с 0 или заканчивающиеся им.До Firefox 61 размеры флекс-элементов, определяемые их содержимым, вычислялись с использованием fit-content, а не max-content.49
|
12.1 |
9
7
|
29
25
|
22Начиная с Firefox для Android 28 поддерживается многострочный флексбокс.До Firefox для Android 32 браузер Firefox для Android не мог анимировать значения, начинающиеся с 0 или заканчивающиеся им.До Firefox для Android 61 размеры флекс-элементов, определяемые их содержимым, вычислялись с использованием fit-content, а не max-content.49
|
12.1 |
9
7
|
2.0
1.5
|
4.4
4.4
|
9
7
|
auto |
21 |
12 |
22 |
15 |
7 |
25 |
22 |
14 |
7 |
1.5 |
4.4 |
7 |
content |
94 |
94 |
61 |
80 |
15 |
94 |
61 |
66 |
15 |
17.0 |
94 |
15 |
fit-content |
94 |
94 |
94 |
80 |
16 |
94 |
94 |
66 |
16 |
17.0 |
94 |
16 |
max-content |
94 |
94 |
66 |
80 |
16 |
94 |
66 |
66 |
16 |
17.0 |
94 |
16 |
min-content |
94 |
94 |
66 |
80 |
16 |
94 |
66 |
66 |
16 |
17.0 |
94 |
16 |
none |
21 |
12 |
22 |
15 |
7 |
25 |
22 |
14 |
7 |
1.5 |
4.4 |
7 |
stretch |
138 |
138 |
Нет |
122 |
27 |
138 |
Нет |
91 |
27 |
30.0 |
138 |
27 |
См. также
- Основные понятия флексбокса
- Управление пропорциями флекс-элементов вдоль главной оси
- Модуль макета CSS Flexible Box
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/flex