Kurs HTML

12.12. Właściwość flex (skrót dla flex-grow, flex-shrink, flex-basis)

Strona główna > Kurs CSS > Rozdział 12: Flexbox > Właściwość 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>. Wtedy flex-shrink przyjmuje wartość 1, a flex-basis 0%. Czyli flex: 1; to skrót dla flex: 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>. Wtedy flex-grow i flex-shrink przyjmują wartość 1. Czyli flex: 150px; to skrót dla flex: 1 1 150px;.
    • Jeśli jest to słowo kluczowe none, oznacza to flex: 0 0 auto; (element nie rośnie, nie kurczy się, rozmiar bazowy zależy od width/height/zawartości).
    • Jeśli jest to słowo kluczowe auto, oznacza to flex: 1 1 auto; (element może rosnąć i kurczyć się, rozmiar bazowy zależy od width/height/zawartości).
  • 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>. Wtedy flex-basis przyjmuje wartość 0%. Czyli flex: 1 0; to skrót dla flex: 1 0 0%;.
      • Jeśli jest poprawną wartością dla width/height (np. flex: 2 150px;), jest interpretowana jako <flex-basis>. Wtedy flex-shrink przyjmuje wartość 1. Czyli flex: 2 150px; to skrót dla flex: 2 1 150px;.
  • 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).

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; lub flex: initial; (odpowiednik flex: 0 1 auto; - domyślne zachowanie): Element nie rośnie, może się kurczyć, rozmiar bazowy zależy od width/height/zawartości.
  • flex: auto; (odpowiednik flex: 1 1 auto;): Element może rosnąć i kurczyć się, rozmiar bazowy zależy od width/height/zawartości. Rozdziela wolną przestrzeń proporcjonalnie do rozmiaru bazowego.
  • flex: none; (odpowiednik flex: 0 0 auto;): Element jest całkowicie nielastyczny - nie rośnie, nie kurczy się. Jego rozmiar zależy od width/height/zawartości.
  • flex: <liczba>; (np. flex: 1;, flex: 2;) (odpowiednik flex: <liczba> 1 0%;): Element może rosnąć i kurczyć się, ale jego rozmiar bazowy to 0%. Oznacza to, że cała przestrzeń w kontenerze jest traktowana jako wolna i rozdzielana proporcjonalnie do wartości flex-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;.