flex
Властивість-скорочення CSS flex
(гнутися) задає те, як гнучкий елемент зростатиме чи скорочуватиметься для заповнення доступного в гнучкому контейнері простору.
Спробуйте його в дії
Складові властивості
Ця властивість є скороченням наступних властивостей CSS:
Синтаксис
/* Значення – ключове слово */
flex: none; /* 0 0 auto */
/* Одне значення, число без одиниць вимірювання: flex-grow
flex-basis у такому разі дорівнює 0%. */
flex: 2; /* 2 1 0% */
/* Одне значення, ширина чи висота: flex-basis */
flex: auto; /* 1 1 auto */
flex: 10em; /* 1 1 10em */
flex: 30%;
flex: min-content;
/* Два значення: flex-grow | flex-basis */
flex: 1 30px; /* 1 1 30px */
/* Два значення: flex-grow | flex-shrink */
flex: 2 2; /* 2 2 0% */
/* Три значення: flex-grow | flex-shrink | flex-basis */
flex: 2 2 10%;
/* Глобальні значення */
flex: inherit;
flex: initial; /* 0 1 auto */
flex: revert;
flex: revert-layer;
flex: unset;
Властивість flex
може бути задана у вигляді одного, двох чи трьох значень.
-
Синтаксис одного значення: значення мусить бути одним з таких варіантів:
- валідне для
<flex-grow>
значення: тоді це скорочення в усіх браузерах розгортається якflex: <flex-grow> 1 0%
. Проте специфікація стверджує, що воно повинно розгортатися якflex: <flex-grow> 1 0
. - валідне для
<flex-basis>
значення: тоді скорочення розгортається якflex: 1 1 <flex-basis>
. - ключове слово
none
, або одне з глобальних ключових слів.
- валідне для
-
Синтаксис двох значень:
-
Перше значення мусить бути:
<number>
– тлумачиться як<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
значення нуля й робить гнучкий елемент справді гнучким. Такий елемент стає щонайменше настільки широким або високим, як його мінімальний розмір, а додатний доступний простір у контейнері пропорційно розподіляється на основі множників росту цього елемента та його сестринських гнучких елементів. Якщо всі гнучкі елементи використовують такий патерн, то всі вони отримують свій розмір пропорційно до своїх числових значень.[!WARNING] Коли в значенні
flex
не заданоflex-basis
, браузери використовують значення0%
. Це не те саме, що значенняflex-basis
0
, яке задано в специфікації. Це може в певних випадках впливати на гнучкі макети. Цей вплив можна побачити в прикладі flex-basis0
і0%
.
Опис
У більшості випадків розробники повинні давати flex
одне з наступних значень: auto
, initial
, none
чи додатне число без одиниць вимірювання. Аби побачити в дії ці значення, спробуйте змінити розмір гнучких контейнерів нижче:
Усталено гнучкі елементи не скорочуються до розмірів, менших за їхній розмір min-content
. Щоб це змінити, треба задати елементові min-width
чи min-height
.
Формальне визначення
Початкове значення | так як і всі інші властивості зі скорочення:
|
---|---|
Успадковується | ні |
Обчислене значення | так як і всі інші властивості зі скорочення:
|
Формальний синтаксис
none | [ <\'flex-grow\'> <\'flex-shrink\'>? || <\'flex-basis\'> ]
Приклади
flex: auto
Цей приклад демонструє те, як гнучкий елемент із flex: auto
зростає, щоб зайняти вільний простір у контейнері.
HTML
<div id="flex-container">
<div id="flex-auto">
flex: auto (клацніть, аби прибрати чи додати рамку `flex: initial`)
</div>
<div id="default">flex: initial</div>
</div>
CSS
#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
, елемент #default
отримує властивість display
зі значенням none
, що прибирає його з макета. Потім елемент #flex-auto
розширюється, щоб зайняти весь доступний у контейнері простір. Повторне клацання елемента #flex-auto
знову додає елемент #default
до контейнера.
Специфікації
Сумісність із браузерами
desktop | mobile | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
flex
|
Chrome Full support 29 | Edge Full support 12 | Firefox Full support 20 | Internet Explorer Full support 11 | Opera Full support 12.1 | Safari Full support 9 | WebView Android Full support 4.4 | Chrome Android Full support 29 | Firefox for Android Full support 20 | Opera Android Full support 12.1 | Safari on iOS Full support 9 | Samsung Internet Full support 2.0 |