12.12. Właściwość flex
(skrót dla flex-grow
, flex-shrink
, flex-basis
)
flex
(skrót dla flex-grow
, flex-shrink
, flex-basis
)
Wprowadzenie: Skrócony zapis elastyczności
Właściwości flex-grow
, flex-shrink
i flex-basis
definiują kluczowe aspekty elastyczności elementu flex. Często ustawia się je razem, aby określić, jak element ma się zachowywać pod względem rozmiaru i reagowania na dostępną przestrzeń.
Właściwość flex
jest **skróconym zapisem (shorthand)**, który pozwala ustawić te trzy właściwości jednocześnie w jednej deklaracji. Stosuje się ją bezpośrednio do **elementu flex**.
Jest to jedna z najważniejszych i najczęściej używanych właściwości w Flexboxie.
Składnia flex
Właściwość flex
może przyjmować od jednej do trzech wartości:
flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
Interpretacja wartości:
- Jedna wartość:
- Jeśli jest to liczba bez jednostki (np.
flex: 1;
), jest interpretowana jako<flex-grow>
. Wtedyflex-shrink
przyjmuje wartość1
, aflex-basis
0%
. Czyliflex: 1;
to skrót dlaflex: 1 1 0%;
. - Jeśli jest to poprawna wartość dla
width
/height
(np.flex: 150px;
,flex: 30%;
,flex: auto;
,flex: content;
), jest interpretowana jako<flex-basis>
. Wtedyflex-grow
iflex-shrink
przyjmują wartość1
. Czyliflex: 150px;
to skrót dlaflex: 1 1 150px;
. - Jeśli jest to słowo kluczowe
none
, oznacza toflex: 0 0 auto;
(element nie rośnie, nie kurczy się, rozmiar bazowy zależy odwidth
/height
/zawartości). - Jeśli jest to słowo kluczowe
auto
, oznacza toflex: 1 1 auto;
(element może rosnąć i kurczyć się, rozmiar bazowy zależy odwidth
/height
/zawartości).
- Jeśli jest to liczba bez jednostki (np.
- Dwie wartości:
- Pierwsza wartość musi być liczbą bez jednostki i jest interpretowana jako
<flex-grow>
. - Druga wartość:
- Jeśli jest liczbą bez jednostki (np.
flex: 1 0;
), jest interpretowana jako<flex-shrink>
. Wtedyflex-basis
przyjmuje wartość0%
. Czyliflex: 1 0;
to skrót dlaflex: 1 0 0%;
. - Jeśli jest poprawną wartością dla
width
/height
(np.flex: 2 150px;
), jest interpretowana jako<flex-basis>
. Wtedyflex-shrink
przyjmuje wartość1
. Czyliflex: 2 150px;
to skrót dlaflex: 2 1 150px;
.
- Jeśli jest liczbą bez jednostki (np.
- Pierwsza wartość musi być liczbą bez jednostki i jest interpretowana jako
- Trzy wartości:
- Pierwsza wartość musi być liczbą bez jednostki (
<flex-grow>
). - Druga wartość musi być liczbą bez jednostki (
<flex-shrink>
). - Trzecia wartość musi być poprawną wartością dla
width
/height
(<flex-basis>
). - Przykład:
flex: 2 0 100px;
(rośnij z wagą 2, nie kurcz się, rozmiar bazowy 100px).
- Pierwsza wartość musi być liczbą bez jednostki (
Wartość domyślna: flex: 0 1 auto;
(nie rośnij, kurcz się z wagą 1, rozmiar bazowy z width
/height
/zawartości).
Typowe wartości skrócone i ich znaczenie
flex: 0 auto;
lubflex: initial;
(odpowiednikflex: 0 1 auto;
- domyślne zachowanie): Element nie rośnie, może się kurczyć, rozmiar bazowy zależy odwidth
/height
/zawartości.flex: auto;
(odpowiednikflex: 1 1 auto;
): Element może rosnąć i kurczyć się, rozmiar bazowy zależy odwidth
/height
/zawartości. Rozdziela wolną przestrzeń proporcjonalnie do rozmiaru bazowego.flex: none;
(odpowiednikflex: 0 0 auto;
): Element jest całkowicie nielastyczny - nie rośnie, nie kurczy się. Jego rozmiar zależy odwidth
/height
/zawartości.flex: <liczba>;
(np.flex: 1;
,flex: 2;
) (odpowiednikflex: <liczba> 1 0%;
): Element może rosnąć i kurczyć się, ale jego rozmiar bazowy to0%
. Oznacza to, że cała przestrzeń w kontenerze jest traktowana jako wolna i rozdzielana proporcjonalnie do wartościflex-grow
. Jest to bardzo częsty sposób na tworzenie kolumn o równych lub proporcjonalnych szerokościach.
Przykład użycia flex: 1;
do stworzenia równych kolumn:
<div class="container" style="display: flex;">
<div class="column">Kolumna 1</div>
<div class="column">Kolumna 2</div>
<div class="column">Kolumna 3</div>
</div>
.column {
flex: 1; /* Odpowiednik flex: 1 1 0%; */
border: 1px solid gray;
padding: 10px;
margin: 5px;
}
Ponieważ wszystkie kolumny mają flex-basis: 0%
i flex-grow: 1
, cała szerokość kontenera zostanie równo podzielona między nimi (po odjęciu marginesów i paddingów).
Zadania praktyczne
Zadanie 1 (z rozwiązaniem)
Stwórz kontener flex z dwoma elementami. Użyj skróconej właściwości flex
, aby pierwszy element zajmował 1/3 dostępnej przestrzeni, a drugi 2/3.
Rozwiązanie:
HTML:
<div class="container-task1" style="display: flex; border: 1px solid black;">
<div class="item item-1">1/3</div>
<div class="item item-2">2/3</div>
</div>
CSS:
.item {
border: 1px solid #ccc;
padding: 20px;
margin: 5px;
text-align: center;
}
.item-1 {
flex: 1; /* flex: 1 1 0% */
background-color: lightblue;
}
.item-2 {
flex: 2; /* flex: 2 1 0% */
background-color: lightgreen;
}
Efekt: Element .item-1
zajmie 1 część, a .item-2
zajmie 2 części dostępnej przestrzeni (po odjęciu marginesów/paddingów), ponieważ ich flex-basis
to 0%, a flex-grow
to odpowiednio 1 i 2.
Zadanie 2 (do samodzielnego wykonania)
Stwórz kontener flex z trzema elementami. Użyj flex: auto;
dla wszystkich. Nadaj im różne szerokości za pomocą właściwości width
. Zaobserwuj, jak rozdzielana jest wolna przestrzeń (lub jak elementy się kurczą, jeśli suma szerokości przekracza kontener).
Zadanie 3 (do samodzielnego wykonania)
Stwórz kontener flex z trzema elementami. Pierwszemu nadaj flex: none;
i stałą szerokość. Drugiemu nadaj flex: 1;
. Trzeciemu nadaj flex: 2 0 100px;
. Zaobserwuj wynikowy układ.
FAQ - Najczęściej zadawane pytania
Jaka jest wartość domyślna właściwości flex
?
Wartością domyślną jest 0 1 auto
. Oznacza to, że element domyślnie nie rośnie (flex-grow: 0
), może się kurczyć (flex-shrink: 1
), a jego rozmiar bazowy jest określany przez width
/height
lub zawartość (flex-basis: auto
).
Czy flex: 1;
zawsze oznacza równy podział przestrzeni?
flex: 1;
(czyli 1 1 0%
) prowadzi do równego podziału przestrzeni tylko wtedy, gdy **wszystkie** elastyczne elementy w linii mają tę samą wartość flex: 1;
. Jeśli inne elementy mają np. flex: 2;
, podział będzie proporcjonalny (1:2). Użycie flex-basis: 0%
sprawia, że cała przestrzeń jest rozdzielana na podstawie flex-grow
.
Kiedy używać flex: auto;
a kiedy flex: 1;
?
Użyj flex: 1;
(lub innej liczby), gdy chcesz, aby elementy dzieliły dostępną przestrzeń proporcjonalnie do wartości flex-grow
, ignorując ich początkowy rozmiar bazowy (bo flex-basis
to 0%
). Użyj flex: auto;
(czyli 1 1 auto
), gdy chcesz, aby elementy mogły rosnąć i kurczyć się, ale dystrybucja wolnej przestrzeni uwzględniała ich rozmiar bazowy (flex-basis: auto
).
Czy mogę pominąć flex-shrink
w skrócie flex
?
Tak. Jeśli podasz dwie wartości, np. flex: 2 150px;
, przeglądarka przyjmie domyślną wartość flex-shrink
, czyli 1
. Pełny zapis to flex: 2 1 150px;
.