Kurs HTML

12.4. Właściwość flex-wrap

Strona główna > Kurs CSS > Rozdział 12: Flexbox > Właściwość flex-wrap

Problem przepełnienia kontenera

Domyślnie, gdy używamy display: flex, wszystkie elementy flex próbują zmieścić się w **jednej linii** wzdłuż osi głównej. Jeśli suma ich rozmiarów (main size) przekracza dostępną przestrzeń w kontenerze, elementy te zaczną się kurczyć (jeśli flex-shrink na to pozwala) lub po prostu "wyleją się" poza kontener.

Właściwość flex-wrap, stosowana do **kontenera flex**, pozwala kontrolować, czy elementy flex mają pozostać w jednej linii, czy też mogą być zawijane do kolejnych linii, gdy zabraknie miejsca.

Możliwe wartości flex-wrap

Właściwość flex-wrap może przyjmować trzy wartości:

  1. nowrap (wartość domyślna):

    • Elementy flex **nie są zawijane**.
    • Wszystkie elementy próbują zmieścić się w jednej linii.
    • Jeśli się nie mieszczą, mogą się kurczyć (jeśli flex-shrink > 0) lub przepełnić kontener.
    .container {
      display: flex;
      flex-wrap: nowrap; /* Domyślne, można pominąć */
      width: 300px; /* Ograniczona szerokość kontenera */
      border: 1px solid blue;
    }
    .item {
      width: 100px; /* Każdy element chce mieć 100px */
      height: 50px;
      background-color: lightblue;
      border: 1px solid navy;
      margin: 5px;
    }
    
    <!-- 3 elementy po 100px + marginesy > 300px -->
    <!-- Elementy będą próbowały się zmieścić, kurcząc się lub wylewając -->
    <div class="container">
      <div class="item">1</div>
      <div class="item">2</div>
      <div class="item">3</div>
    </div>
  2. wrap:

    • Elementy flex **są zawijane** do nowych linii, jeśli nie mieszczą się w bieżącej linii.
    • Nowe linie są dodawane poniżej poprzednich (przy flex-direction: row) lub po prawej stronie (przy flex-direction: column).
    • Kierunek dodawania nowych linii zależy od flex-direction.
    .container {
      display: flex;
      flex-wrap: wrap; /* Włącz zawijanie */
      width: 300px;
      border: 1px solid green;
    }
    /* Style .item jak poprzednio */
    
    <!-- Element 3 nie zmieści się w pierwszej linii i zostanie zawinięty -->
    <div class="container" style="background-color: #e0ffe0;">
      <div class="item" style="background-color: lightgreen; border-color: darkgreen;">1</div>
      <div class="item" style="background-color: lightgreen; border-color: darkgreen;">2</div>
      <div class="item" style="background-color: lightgreen; border-color: darkgreen;">3</div>
    </div>
    <!-- Efekt: -->
    <!-- [1] [2] -->
    <!-- [3]     -->
  3. wrap-reverse:

    • Elementy flex **są zawijane**, ale nowe linie są dodawane w **odwrotnym kierunku** osi poprzecznej.
    • Przy flex-direction: row, nowe linie pojawiają się **powyżej** poprzednich.
    • Przy flex-direction: column, nowe linie pojawiają się po **lewej** stronie poprzednich.
    .container {
      display: flex;
      flex-wrap: wrap-reverse; /* Włącz odwrotne zawijanie */
      width: 300px;
      border: 1px solid orange;
    }
    /* Style .item jak poprzednio */
    
    <!-- Element 3 nie zmieści się w linii i zostanie zawinięty POWYŻEJ -->
    <div class="container" style="background-color: #fff0e0;">
      <div class="item" style="background-color: lightsalmon; border-color: darkorange;">1</div>
      <div class="item" style="background-color: lightsalmon; border-color: darkorange;">2</div>
      <div class="item" style="background-color: lightsalmon; border-color: darkorange;">3</div>
    </div>
    <!-- Efekt: -->
    <!-- [3]     -->
    <!-- [1] [2] -->

Wieloliniowe kontenery Flex

Gdy używamy wrap lub wrap-reverse, kontener flex staje się **wieloliniowy**. W takim przypadku pojawia się możliwość kontrolowania wyrównania i rozkładu przestrzeni **między liniami flex** za pomocą właściwości align-content (omówionej w dalszej części kursu).

Właściwość align-items nadal kontroluje wyrównanie elementów **wewnątrz pojedynczej linii flex**.

Zadania praktyczne

Zadanie 1 (z rozwiązaniem)

Stwórz kontener flex o stałej szerokości (np. 400px) i umieść w nim 5 elementów, każdy o szerokości 100px. Użyj flex-wrap: wrap;, aby elementy zawijały się do nowych linii.

Rozwiązanie:

HTML:

<div class="container-task1">
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
  <div class="item">4</div>
  <div class="item">5</div>
</div>

CSS:

.container-task1 {
  display: flex;
  flex-wrap: wrap; /* Włącz zawijanie */
  width: 400px; /* Szerokość kontenera */
  border: 1px solid black;
  padding: 5px;
}

.item {
  width: 100px; /* Szerokość elementu */
  height: 50px;
  background-color: #eee;
  border: 1px solid #ccc;
  margin: 5px;
  box-sizing: border-box; /* Uwzględnij padding i border w szerokości */
  text-align: center;
  line-height: 50px;
}

Efekt: W kontenerze o szerokości 400px zmieszczą się 3 elementy (100px + 5px marginesu z lewej + 5px marginesu z prawej = 110px; 3 * 110px = 330px). Elementy 4 i 5 zostaną zawinięte do drugiej linii.

Zadanie 2 (do samodzielnego wykonania)

Skopiuj rozwiązanie z Zadania 1 i zmień flex-wrap na wrap-reverse. Zaobserwuj, jak zmienia się układ linii.

Zadanie 3 (do samodzielnego wykonania)

Stwórz kontener flex z flex-direction: column; i stałą wysokością (np. 200px). Umieść w nim kilka elementów o stałej wysokości (np. 60px). Użyj flex-wrap: wrap; i zaobserwuj, jak elementy zawijają się do nowych kolumn (po prawej stronie).

FAQ - Najczęściej zadawane pytania

Jaka jest domyślna wartość flex-wrap?

Domyślną wartością jest nowrap. Oznacza to, że jeśli nie ustawisz jawnie flex-wrap, elementy flex będą próbowały zmieścić się w jednej linii, potencjalnie kurcząc się lub przepełniając kontener.

Czy flex-wrap działa z flex-direction: column?

Tak, flex-wrap działa również, gdy oś główna jest pionowa (flex-direction: column). W takim przypadku, jeśli elementy nie mieszczą się w wysokości kontenera, wrap spowoduje ich zawinięcie do nowej kolumny po prawej stronie, a wrap-reverse do nowej kolumny po lewej stronie.

Jak kontrolować odstępy między liniami w zawiniętym kontenerze?

Do kontrolowania rozkładu przestrzeni **między liniami flex** w wieloliniowym kontenerze służy właściwość align-content. Pozwala ona np. rozsunąć linie, zgrupować je na początku, na końcu lub na środku osi poprzecznej.

Czy zawijanie wpływa na właściwości flex-grow i flex-shrink?

Tak. Właściwości flex-grow i flex-shrink działają w kontekście **pojedynczej linii flex**. Gdy elementy są zawijane, każda linia jest traktowana niezależnie pod kątem rozciągania (grow) i kurczenia (shrink) elementów w jej obrębie.