12.4. 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:
-
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>
-
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 (przyflex-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] -->
-
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.