Responsive Web Design (RWD) to podejście, w którym układ dostosowuje się do dostępnej przestrzeni oraz możliwości użytkownika i urządzenia. W tym artykule zobaczysz, jak łączyć mobile-first, media queries, container queries, elastyczne layouty i responsywne obrazy.
Viewport meta tag jako fundament Responsive Web Design
Bez tego tagu responsywność nie zadziała:
width=device-widthdopasowuje szerokość viewportu do szerokości urządzenia w pikselach CSSinitial-scale=1.0ustawia początkową skalę dokumentu na 100%
Powyższy kod dodaj do każdej klasycznej strony HTML, ponieważ bez niego przeglądarka mobilna może wyrenderować stronę w szerokim, wirtualnym viewportcie i pomniejszyć całość. Frameworki zwykle generują tę deklarację, ale warto potwierdzić jej obecność w wynikowym HTML-u. Nie blokuj powiększania strony przez user-scalable=no.
Mobile-first vs desktop-first w Responsive Web Design
Desktop-first jako starsze podejście
Piszesz style dla desktopu, potem "naprawiasz" dla mobile:
Mobile-first jako zalecane podejście
Piszesz style dla mobile, potem "rozszerzasz" dla większych ekranów:
Dlaczego podejście mobile-first często pomaga?
- Zaczynasz od ograniczonej przestrzeni. Musisz zdecydować, które treści i działania są najważniejsze dla użytkownika.
- Treść jest priorytetem. Zamiast upychać wszystko, co masz na desktopie, skupiasz się na najważniejszej treści i funkcjach, a to oznacza lepsze i bardziej przemyślane .
- Stopniowo ulepszasz, a nie psujesz. Zamiast tworzyć skomplikowany layout desktopowy i potem próbować go "naprawić" dla telefonów (degradacja), budujesz prostą, solidną podstawę mobilną i stopniowo ją rozbudowujesz (progresywne ulepszanie).
- Prostsza kaskada. Zwykle potrzebujesz mniej nadpisań, co ułatwia utrzymanie CSS. Nie jest to jednak automatyczna optymalizacja transferu, ponieważ reguły z niedopasowanych media queries nadal mogą znajdować się w pobranym arkuszu.
Mobile-first nie oznacza usuwania funkcji ani treści na telefonie. Możesz zmienić kolejność, sposób prezentacji i gęstość interfejsu, ale ważne informacje oraz działania powinny pozostać dostępne.
Nie jest to dogmat. Wewnętrzny panel używany wyłącznie na kontrolowanych stanowiskach może mieć inne priorytety. Nadal powinien jednak działać przy powiększeniu, zmianie rozmiaru okna i obsłudze klawiaturą. Mobile-first w CSS opisuje kierunek kaskady, natomiast mobile-first w projektowaniu produktu oznacza również priorytety treści i zadań. Te pojęcia są powiązane, ale nie są tym samym.
Media queries w praktyce
Składnia media queries
Popularne breakpoints dla responsywnych stron
To wyłącznie punkt startowy. Breakpointy powinny wynikać z treści i layoutu, a nie z nazw konkretnych urządzeń. Testuj również szerokości pomiędzy breakpointami, ponieważ błędy często pojawiają się właśnie tam.
Inne media features w CSS
Media features opisują możliwości wejścia, a nie kategorię sprzętu. Laptop z ekranem dotykowym może mieć jednocześnie mysz i dotyk, dlatego nie zakładaj, że hover: none zawsze oznacza telefon. Podstawowa funkcja interfejsu nie powinna zależeć wyłącznie od hover.
Fluid typography i skalowanie tekstu
clamp() i płynne skalowanie fontów
Sama wartość zależna od viewportu, taka jak 4vw, może zbyt słabo reagować na zmianę wielkości tekstu. Dodanie części w rem zachowuje związek z ustawieniami użytkownika. Po wdrożeniu sprawdź tekst przy powiększeniu do 200% i reflow przy 400%.
Responsywne obrazy w HTML i CSS
Podstawy
srcset i różne rozmiary obrazów
srcset opisuje dostępne pliki, a sizes przewidywaną szerokość obrazu w layoucie. Jeśli sizes nie odpowiada rzeczywistemu CSS, przeglądarka może pobrać zbyt duży albo zbyt mały wariant. Atrybuty width i height określają proporcje i pomagają zarezerwować miejsce przed pobraniem obrazu.
picture dla różnych wariantów obrazów
Użyj <picture>, gdy zmieniasz kadr, kompozycję albo format pliku. Jeśli różni się wyłącznie rozdzielczość tego samego obrazu, zwykle wystarczy srcset.
Lazy loading
Nie dodawaj loading="lazy" do obrazu hero ani innego prawdopodobnego elementu . Taki obraz powinien być wykrywalny w początkowym HTML-u i ładowany bez opóźnienia. W uzasadnionym przypadku możesz nadać mu fetchpriority="high", ale nie ustawiaj wysokiego priorytetu wielu obrazom.
Responsywny layout strony
Flexbox wrap
Grid auto-fit
Wewnętrzne min(100%, 250px) zapobiega przepełnieniu kontenera węższego niż 250 pikseli. Dla elementów umieszczonych w Grid lub Flexbox często przydaje się też min-width: 0, aby długi tekst nie rozszerzał kolumny.
Długie, niepodzielne wartości wymagają osobnej obsługi:
Layout z media queries
Wysokość mobilnego viewportu
Klasyczne 100vh nie zawsze zachowuje się intuicyjnie, gdy mobilna przeglądarka pokazuje albo chowa swoje paski. Nowe jednostki pozwalają wybrać oczekiwane zachowanie:
svh wykorzystuje mniejszą, stabilną wysokość viewportu, dlatego dobrze nadaje się do sekcji hero. dvh reaguje na bieżącą wysokość i sprawdza się tam, gdzie element ma wypełniać aktualnie widoczny obszar. Jednostka dynamiczna może zmieniać wartość podczas przewijania, więc unikaj jej tam, gdzie wywoływałaby irytujące przeskoki układu. Wartości safe-area-inset-* chronią istotne elementy przed wycięciami i obszarami zajętymi przez interfejs urządzenia. Jeśli chcesz rozszerzyć layout na cały fizyczny ekran urządzenia, dodaj viewport-fit=cover do wartości content w viewport meta tagu i koniecznie zachowaj bezpieczne odstępy.
Responsywna nawigacja na mobile
Samo ukrywanie i pokazywanie listy klasą CSS nie wystarcza. Przycisk powinien mieć dostępną nazwę, wskazywać kontrolowany element i aktualizować aria-expanded.
Bez JavaScriptu lista pozostaje widoczna, więc nawigacja nadal działa. W produkcyjnym komponencie przetestuj również kolejność fokusu, zamykanie menu po zmianie trasy i zachowanie po przejściu przez breakpoint.
Container queries w nowoczesnym CSS
Media queries reagują na viewport lub cechy środowiska, natomiast container queries pozwalają komponentowi reagować na wskazany kontener:
To dobre rozwiązanie dla komponentów używanych w różnych miejscach layoutu. Kontener musi jednak mieć zadeklarowany typ, a element nie może zapytać w ten sposób o własny rozmiar. Zapytanie dotyczy jego przodka będącego query containerem.
Testowanie responsywności strony
Chrome DevTools
- Otwórz tryb responsywny i przeciągaj krawędź viewportu zamiast sprawdzać wyłącznie gotowe presety.
- Przetestuj szerokości tuż przed każdym breakpointem i tuż po nim.
- Zmień orientację, powiększenie tekstu i zoom całej strony.
- Sprawdź obsługę klawiaturą, tryb dotykowy, wolniejszą sieć oraz ograniczony procesor.
Emulacja pomaga znaleźć błędy layoutu, ale nie zastępuje prawdziwego urządzenia. Nie odwzorowuje dokładnie wydajności, klawiatury ekranowej, obszarów bezpiecznych ani zmian wysokości viewportu wywołanych paskami przeglądarki.
Narzędzia online
- Responsively App pokazuje kilka viewportów jednocześnie.
- BrowserStack udostępnia testy w chmurze na różnych przeglądarkach i urządzeniach.
Lista kontrolna Responsive Web Design
W wynikowym HTML-u znajduje się poprawny viewport meta tag, który nie blokuje powiększania.
Główna treść zachowuje reflow przy szerokości 320 pikseli CSS i nie wymaga przewijania w dwóch kierunkach.
Tekst pozostaje czytelny przy powiększeniu do 200%, a layout działa również przy zoomie 400%.
Interaktywne cele mają co najmniej 24 × 24 piksele CSS albo wymagane odstępy. Dla najważniejszych kontrolek warto dążyć do 44 × 44 pikseli.
Nawigacja, formularze, modale i komunikaty działają za pomocą dotyku, myszy oraz klawiatury.
Obrazy mają poprawne proporcje,
srcset,sizesi strategię ładowania odpowiednią do ich położenia.Długie adresy, nazwy, komunikaty błędów i tłumaczenia nie rozsadzają kontenerów.
Sticky header, baner zgody i klawiatura ekranowa nie zasłaniają fokusu ani najważniejszych przycisków.
Wyjątki wymagające przewijania w dwóch wymiarach, takie jak szerokie tabele, mapy i diagramy, mają własny kontrolowany kontener.
| Technika | Użycie |
|---|---|
viewport meta | Na każdej stronie |
| Mobile-first | min-width media queries |
clamp() | Fluid typography i spacing |
srcset/picture | Responsywne obrazy |
Flexbox wrap | Elastyczne layouty |
Grid auto-fit | Siatki kart |
| Container queries | Komponenty niezależne od viewport |
