CSS Flexbox – responsywny układ treści
CSS Flexbox (Flexible Box) umożliwia elastyczne układanie elementów na stronie internetowej. Została zaprojektowana, aby ułatwić tworzenie złożonych układów, które automatycznie dostosowują się do różnych rozmiarów ekranów i urządzeń. W tym artykule omówimy podstawy Flexboxa, a także przedstawimy praktyczne przykłady, które pomogą zrozumieć jego działanie.
Podstawy CSS Flexbox
Flexbox składa się z dwóch głównych elementów:
- Flex container (kontener Flexboxa) – element, który zawiera elementy podrzędne (flex items).
- Flex items (elementy elastyczne) – elementy wewnątrz kontenera Flexboxa, które podlegają układowi Flexboxa.
Aby rozpocząć korzystanie z Flexboxa, musimy określić element kontenera jako flexbox. Dodatkowo kontener ten będzie zawierał elementy podrzędne, które chcemy układać.
HTML
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
CSS
.container {
display: flex;
}
Właściwość display: flex; przekształca element kontenera w flexbox, a jego bezpośrednie dzieci stają się elementami flex.
W Flexboxie istnieją dwie osie:
- Oś główna (main axis) – domyślnie biegnie poziomo (od lewej do prawej).
- Oś poprzeczna (cross axis) – domyślnie biegnie pionowo (od góry do dołu).
Podstawowe właściwości flex container
flex-direction
.container {
display: flex;
flex-direction: row; /* Może być row, row-reverse, column, column-reverse */
}
Właściwość flex-direction określa kierunek osi głównej i może przyjmować następujące wartości:
row – (domyślnie) – elementy układają się w wierszu od lewej do prawej
row-reverse – elementy układają się w wierszu od prawej do lewej
column – elementy układają się w kolumnie od góry do dołu
column-reverse – elementy układają się w kolumnie od dołu do góry
flex-wrap
.container {
display: flex;
flex-wrap: wrap; /* Może być nowrap, wrap-reverse */
}
Właściwość flex-wrap kontroluje, czy elastyczne elementy (flex items) w kontenerze powinny zawijać się na kolejne wiersze, gdy brakuje miejsca w linii głównej (main axis). Poza tym działa w połączeniu z właściwością flex-direction, która określa kierunek osi głównej oraz przyjmuje następujące wartości:
nowrap – wszystkie elementy elastyczne będą umieszczone w jednym wierszu. Jeśli nie mieszczą się w jednej linii, mogą wychodzić poza krawędzie kontenera.
wrap – elementy będą zawijane na nowe wiersze, gdy zabraknie miejsca w jednym wierszu. Kontener dostosowuje swoją wysokość, aby pomieścić nowe wiersze.
wrap-reverse – elementy będą zawijane na nowe wiersze, ale w odwrotnym kierunku, czyli wiersze będą układane od dołu do góry (przy flex-direction: row) lub od prawej do lewej (przy flex-direction: column).
flex-flow
.container {
display: flex;
flex-flow: <'flex-direction'> <'flex-wrap'>;
}
Właściwość flex-flow jest skrótem łączącym dwie inne właściwości: flex-direction i flex-wrap. Dodatkowo umożliwia jednoczesne ustawienie kierunku układania elastycznych elementów oraz tego, czy mają się zawijać na nowe wiersze i mogą to być następujące wartości:
flex-direction:
row(domyślnie) – elementy układają się w wierszu od lewej do prawejrow-reverse– elementy układają się w wierszu od prawej do lewejcolumn– elementy układają się w kolumnie od góry do dołucolumn-reverse– elementy układają się w kolumnie od dołu do góry
flex-wrap:
nowrap(domyślnie) – elementy pozostają w jednym wierszuwrap– elementy zawijają się na nowe wiersze, gdy brakuje miejscawrap-reverse– elementy zawijają się na nowe wiersze w odwrotnym kierunku
/* Elementy w jednym wierszu, układane od lewej do prawej */
.flex-flow-row-nowrap { flex-flow: row nowrap;
}
/* Elementy w kilku wierszach, układane od lewej do prawej */
.flex-flow-row-wrap { flex-flow: row wrap; }
/* Elementy w kilku kolumnach, układane od góry do dołu */
.flex-flow-column-wrap { flex-flow: column wrap; }
/* Elementy w kilku kolumnach, układane od dołu do góry */
.flex-flow-column-wrap-reverse { flex-flow: column wrap-reverse; }
justify-content
.container {
display: flex;
justify-content: center; /* Może być flex-start, flex-end, center, space-between, space-around, space-evenly */
}
Właściwość justify-content ustawia wyrównanie elementów wzdłuż osi głównej. Może przyjmować następujące wartości:
flex-start (domyślnie) – elementy są wyrównane do początku kontenera
flex-end – elementy są wyrównane do końca kontenera
center – elementy są wyśrodkowane
space-between – elementy są rozmieszczone równomiernie, pierwszy element przy początku, ostatni przy końcu
space-around – elementy są rozmieszczone równomiernie z równymi odstępami wokół nich
space-evenly – elementy są rozmieszczone równomiernie z równymi odstępami między nimi i krawędziami kontenera
align-items
.container {
display: flex;
align-items: center; /* Może być flex-start, flex-end, center, baseline, stretch */
}
Właściwość align-items ustawia wyrównanie elementów wzdłuż osi poprzecznej i można przypisać następujące wartości:
flex-start – elementy są wyrównane do początku kontenera wzdłuż osi poprzecznej
flex-end – elementy są wyrównane do końca kontenera wzdłuż osi poprzecznej
center – elementy są wyśrodkowane wzdłuż osi poprzecznej
baseline – elementy są wyrównane wzdłuż ich linii bazowej tekstu
stretch (domyślnie) – elementy są rozciągnięte, aby wypełnić kontener wzdłuż osi poprzecznej
align-content
.container {
display: flex;
align-content: flex-start; /* Może być flex-end, center, space-between, space-around, space-evenly, stretch */
}
Właściwość align-content w Flexboxie jest używana do kontrolowania rozmieszczenia i wyrównania przestrzeni między wierszami elastycznych elementów (flex items) w kontenerze, gdy zawartość nie wypełnia całej dostępnej przestrzeni wzdłuż osi poprzecznej (cross axis). Działa tylko wtedy, gdy jest więcej niż jeden wiersz elementów i możemy do niej zastosować następujące wartości:
flex-start – wiersze są wyrównane do początku kontenera
flex-end – wiersze są wyrównane do końca kontenera
center – wiersze są wyśrodkowane w kontenerze
space-between – wiersze są rozmieszczone równomiernie w kontenerze, pierwszy wiersz przy początku, ostatni przy końcu
space-around – wiersze są rozmieszczone równomiernie z równymi odstępami wokół każdego wiersza
space-evenly – wiersze są rozmieszczone równomiernie z równymi odstępami między nimi oraz między nimi a krawędziami kontenera
stretch – wiersze są rozciągnięte, aby wypełnić dostępne miejsce w kontenerze (domyślne ustawienie)
Podstawowe właściwości flex items
Elementy elastyczne, czyli flex items, to „dzieci” bezpośrednio umieszczone w kontenerze Flexboxa (flex container). Flexbox dostarcza szereg właściwości, które umożliwiają precyzyjną kontrolę nad tymi elementami w celu dostosowania ich rozmiaru, rozmieszczenia i wyrównania.
Dla elementów w HTML będziemy nadawać poniższe wartości w CSS:
<div class="container">
<div class="item1">1</div>
<div class="item2">2</div>
<div class="item3">3</div>
</div>
order
Właściwość order kontroluje kolejność, w jakiej elementy elastyczne są rozmieszczane w kontenerze. Domyślna wartość to 0. Elementy z niższą wartością order będą umieszczone przed elementami z wyższą wartością.
.container { display: flex; }
.item1 { order: 1; }
.item2 { order: 2; }
.item3 { order: -1; }
flex-grow
Właściwość flex-grow określa, jak elastyczny element powinien rosnąć w stosunku do pozostałych elastycznych elementów, gdy jest dodatkowe miejsce w kontenerze. Domyślna wartość to 0 (element nie rośnie).
.container { display: flex; }
.item1 { flex-grow: 1; /* Rośnie, gdy jest dodatkowe miejsce */ }
.item2 { flex-grow: 2; /* Rośnie dwa razy szybciej niż item1 */ }
flex-shrink
Właściwość flex-shrink określa, jak elastyczny element powinien się kurczyć w stosunku do pozostałych elastycznych elementów, gdy brakuje miejsca w kontenerze. Domyślna wartość to 1 (element może się kurczyć).
.container { display: flex; }
.item1 { flex-shrink: 1; /* Kurczy się, gdy brakuje miejsca */ }
.item2 { flex-shrink: 0; /* Nie kurczy się */ }
flex-basis
Właściwość flex-basis określa początkowy rozmiar elastycznego elementu przed przydzieleniem dodatkowego miejsca przez właściwości flex-grow lub flex-shrink. Może przyjmować wartości długości (np. px, em, %) lub specjalną wartość auto.
.container { display: flex; }
.item1 { flex-basis: 200px; /* Początkowy rozmiar elementu to 200px */ }
.item2 { flex-basis: 50%; /* Początkowy rozmiar elementu to 50% kontenera */ }
flex
Właściwość flex jest skrótem, który łączy flex-grow, flex-shrink i flex-basis w jedną deklarację. Umożliwia bardziej zwięzłe i czytelne definiowanie elastyczności elementów.
flex: [flex-grow] [flex-shrink] [flex-basis];
.container { display: flex; }
.item1 { flex: 1; /* równoważne z flex: 1 1 0; */ }
.item2 { flex: 2 1 100px; /* flex-grow: 2, flex-shrink: 1, flex-basis: 100px */ }
align-self
.container { display: flex; }
.item1 { align-self: flex-start; /* Wyrównany do początku osi poprzecznej */ }
.item2 { align-self: center; /* Wyśrodkowany w osi poprzecznej */ }
Właściwość align-self pozwala nadpisać ustawienie align-items dla poszczególnych elastycznych elementów. Może przyjmować te same wartości co align-items:
flex-startflex-endcenterbaselinestretch(domyślnie)
Przykłady Zastosowania Flexboxa
Centrowanie Elementu
Aby wycentrować pojedynczy element w kontenerze:
<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Centrowanie Elementu</title>
<style>
.container {
display: flex;
justify-content: center;
align-items: center;
height: 15vh;
background: #ddd;
}
</style>
</head>
<body>
<div class="container">
<div class="item">Centered</div>
</div>
</body>
</html>
Elastyczne Kolumny
Tworzenie trzech elastycznych kolumn, które równomiernie dzielą dostępne miejsce:
<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Elastyczne Kolumny</title>
<style>
.container {
display: flex;
justify-content: space-between;
}
.item {
flex: 1;
margin: 0 10px; /* margines między kolumnami */
padding: 20px;
background: #ddd;
}
</style>
</head>
<body>
<div class="container">
<div class="item">Column 1</div>
<div class="item">Column 2</div>
<div class="item">Column 3</div>
</div>
</body>
</html>
Rozkład Kafelków
Tworzenie układu kafelkowego z elementami o zmiennej szerokości:
<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Rozkład Kafelków</title>
<style>
.container {
display: flex;
flex-wrap: wrap;
gap: 10px; /* odstępy między elementami */
}
.item {
flex: 1 1 calc(33.333% - 10px); /* elastyczna szerokość */
background: #ddd;
padding: 20px;
box-sizing: border-box;
}
</style>
</head>
<body>
<div class="container">
<div class="item">Title 1</div>
<div class="item">Title 2</div>
<div class="item">Title 3</div>
<div class="item">Title 4</div>
<div class="item">Title 5</div>
</div>
</body>
</html>
CSS Flexbox – podsumowanie
Bez wątpienia flexbox to potężne narzędzie CSS, które ułatwia tworzenie elastycznych i responsywnych układów. Dlatego zrozumienie podstawowych właściwości, takich jak flex-direction, justify-content, i align-items, jest kluczem do efektywnego wykorzystania tej technologii. Co więcej dzięki Flexboxowi, tworzenie nowoczesnych, elastycznych layoutów staje się znacznie prostsze. Zachęcam do eksperymentowania z różnymi właściwościami Flexboxa, aby w pełni wykorzystać jego możliwości i dostosować układ strony do własnych potrzeb.