6. Responsywność – media queries, mobile-first + nowoczesne jednostki
~18-22 min
poziom: początkujący
Strona musi dobrze wyglądać na każdym urządzeniu. Najlepsze podejście to mobile-first + jednostki, które skalują się same.
Nowoczesne jednostki – must-have w 2026
/* Skalowalne i czytelne */
:root {
--base: 1rem; /* 16px na desktopie, często 10–18px na mobile */
}
body {
font-size: clamp(1rem, 3.5vw, 1.125rem); /* min, preferowane, max */
line-height: 1.5;
}
h1 {
font-size: clamp(1.8rem, 6vw, 3.5rem);
}
.card {
padding: clamp(1rem, 4vw, 2rem);
width: min(100%, 480px); /* nigdy nie szersze niż 480px */
aspect-ratio: 4 / 3; /* stały proporcje */
height: 60dvh; /* 60% wysokości widocznego ekranu */
}
/* Container queries – zamiast media na całym oknie */
@container (min-width: 400px) {
.karty {
flex-direction: row;
flex-wrap: wrap;
}
}
Mobile-first + media queries (klasyczny sposób)
/* Najpierw mobile */
.karty {
display: flex;
flex-direction: column;
gap: clamp(1rem, 4vw, 1.5rem);
}
/* Od ~tablet */
@media (min-width: 576px) {
.karty {
flex-direction: row;
flex-wrap: wrap;
}
.karta {
flex: 1 1 45%;
}
}
/* Od desktop */
@media (min-width: 992px) {
.karty {
max-width: 960px;
margin: 0 auto;
}
.karta {
flex: 1 1 30%;
}
}
Karta 1
Karta 2
Karta 3
- px – stały rozmiar w pikselach (rzadko używany w 2025+ na tekst i odstępy)
- % – procent względem rodzica (szerokość, wysokość, marginesy, padding)
- em – względem font-size aktualnego elementu (kaskadowe, trudne do przewidzenia)
- rem – względem font-size elementu
:root/html(najbezpieczniejszy wybór na tekst i odstępy) - vw / vh – procent szerokości / wysokości okna przeglądarki
- dvw / dvh – dynamiczne vw/vh – uwzględniają pasek adresu i paski nawigacyjne
- lvw / lvh – largest viewport – największa możliwa wysokość/szerokość (ignoruje paski)
- clamp(min, prefer, max) – płynne skalowanie między wartościami
- min() / max() – wybiera mniejszą / większą wartość z listy
- aspect-ratio – wymusza proporcje elementu (np. 16/9, 4/3)
- clamp(min, prefer, max) – idealne rozmiary tekstu i paddingu
- aspect-ratio – utrzymuje proporcje bez JS
- min() / max() – bardzo przydatne do limitowania szerokości
Do zapamiętania: Używaj
clamp() na font-size i padding + rem zamiast px.
Zadanie
W pliku style.css i index.html:
- trzy karty – mobile: jedna pod drugą, tablet: dwie, desktop: trzy
- użyj clamp() na font-size tytułu i paddingu kart
- ustaw maksymalną szerokość kontenera za pomocą min(100%, 1000px)
- dodaj aspect-ratio: 3 / 2 do kart (lub zdjęć w kartach)
- opcjonalnie: ustaw wysokość sekcji na 70dvh
[ Miejsce na reklamę ]