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-shrinkprzyjmuje wartość1, aflex-basis0%. 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-growiflex-shrinkprzyjmują 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-basisprzyjmuje 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-shrinkprzyjmuje 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;.