Strona responsywna w praktyce: znacznik viewport, reguła @media z przedziałem szerokości, jednostki względne, elastyczne obrazy oraz przestawienie układu sklepu na jedną kolumnę i test w trybie urządzenia. Lekcja 4.8 kursu INF.03.
Strona responsywna (responsive web design, RWD) to strona, której układ dopasowuje się do szerokości ekranu, więc ten sam plik HTML czyta się wygodnie i na monitorze, i na telefonie, bez osobnej wersji mobilnej. W części pisemnej wraca pytanie o regułę dla ekranów o szerokości od 600 px do 800 px oraz o znacznik <meta> ustawiający widok. W części praktycznej lista „innych zadań praktycznych" w informatorze CKE wymienia wprost „wykorzystania reguły @media w celu tworzenia stron responsywnych", a podstawa programowa każe jeszcze osobno przetestować responsywność gotowej witryny.
Trzy filary strony responsywnej
Responsywność stoi na trzech mechanizmach naraz: płynnej siatce, elastycznych obrazach i zapytaniach o media. Zabranie jednego psuje efekt dwóch pozostałych, bo zdjęcie o stałej szerokości 800 px rozepchnie nawet poprawnie policzone kolumny.
›
Płynna siatka (fluid grid): szerokości bloków podane w procentach zamiast w pikselach, do tego max-width w pikselach jako granica, żeby na szerokim monitorze wiersz tekstu nie ciągnął się przez cały ekran. Panel boczny sklepu ma 30 procent, blok główny 70 procent, więc obie kolumny kurczą się razem z oknem.
›
Elastyczne obrazy: max-width: 100% i height: auto, czyli obraz nigdy szerszy niż blok, w którym stoi.
›
Zapytania o media: reguła @media, która włącza inne wartości właściwości dopiero od pewnej szerokości ekranu.
aside {
width: 30%;
}
main {
width: 70%;
}
img {
max-width: 100%;
height: auto;
}
max-width: 100% mówi „nigdy szerszy niż rodzic", a height: auto pilnuje proporcji, żeby zmniejszony obraz nie wyszedł spłaszczony. W banku pytań to odpowiedź na pytanie, jak sprawić, by obraz sam skalował się do rozmiaru ekranu: szerokość w wartościach procentowych, nie oba wymiary w pikselach.
Znacznik viewport
viewport (obszar widoku) to prostokąt, w którym przeglądarka układa stronę, zanim pokaże ją na ekranie. Telefon bez ustawienia widoku zakłada, że strona była pisana na monitor: układa ją na udawanej szerokości około 980 px, a potem pomniejsza całość do szerokości wyświetlacza. Efekt to mikroskopijny tekst i powiększanie palcami. Gorsze jest to, czego nie widać od razu: reguły @media dostają wtedy szerokość 980 px, więc układ dla telefonu w ogóle się nie włączy.
<meta name="viewport" content="width=device-width, initial-scale=1">
Znacznik stoi w sekcji head, obok kodowania znaków i tytułu, czyli tam, gdzie opisuje go lekcja o szkielecie dokumentu. width=device-width ustawia szerokość widoku na szerokość urządzenia, a initial-scale=1 blokuje początkowe pomniejszenie. Pułapka: bez znacznika viewport reguły @media na telefonie nie zadziałają, bo przeglądarka podaje im szerokość udawanego ekranu, a nie prawdziwego.
Reguła @media
Zapytanie o media (media query) to warunek, po którym przeglądarka włącza albo pomija całą grupę reguł CSS. Warunek dotyczy najczęściej szerokości okna, ale bywa też typem urządzenia albo orientacją ekranu.
@media screen and (min-width: 600px) and (max-width: 800px) {
/* style css */
}
Tak wygląda reguła dla ekranów o szerokości od 600 px do 800 px, czyli dokładnie to, o co pyta bank. max-width znaczy „do tej szerokości włącznie", min-width znaczy „od tej szerokości w górę", a warunki łączy się słowem and. Przed warunkami stoi typ mediów: screen (ekran), print (druk) albo all (wszystkie); pominięty typ znaczy all. Warunek orientation: landscape (orientacja pozioma) łapie telefon obrócony na bok, a print służy do przygotowania wersji do druku: menu i reklamy znikają, zostaje sama treść.
@media print {
nav {
display: none;
}
}
Punkty, w których układ się zmienia, to punkty przełamania (breakpoints). Typowe wartości w arkuszach i szablonach to 600, 768, 992 i 1200 px, bo odpowiadają telefonowi, tabletowi, małemu laptopowi i monitorowi. Podejście „mobile first" (najpierw telefon) zaczyna od stylu dla wąskiego ekranu, a szersze układy dokłada regułami z min-width. Podejście „desktop first" (najpierw monitor) robi odwrotnie: styl podstawowy jest dla monitora, a reguły z max-width upraszczają go w dół. Na egzaminie wygodniejsze jest to drugie, bo arkusz opisuje układ dla monitora, a responsywność dopisuje się na końcu.
Blok @media nie podnosi specyficzności reguł, które są w jego wnętrzu: main { width: 100%; } wewnątrz @media wygrywa z main { width: 70%; } tylko dlatego, że stoi w pliku PÓŹNIEJ. Dlatego blok @media umieszcza się na końcu arkusza, a nie na początku. Zasady rozstrzygania sporów między regułami opisuje lekcja o dołączaniu stylów i kaskadzie. Jednostki względne, obrazy i tabele
Jednostka względna to taka, której wartość zależy od czegoś innego niż stały piksel: od rodzica, od korzenia dokumentu albo od okna przeglądarki. Procent liczy się od wymiaru rodzica, vw i vh (viewport width, viewport height) to jeden procent szerokości i wysokości okna, a rem (root em) to wielokrotność rozmiaru czcionki korzenia dokumentu, domyślnie 16 px. Funkcja clamp() podaje w jednym zapisie wartość najmniejszą, płynną i największą, więc nagłówek rośnie razem z oknem, ale nie przekroczy granic. Same jednostki omawia lekcja o kolorach, jednostkach i tekście. h1 {
font-size: clamp(1.2rem, 4vw, 2rem);
}
.przewijana {
overflow-x: auto;
}
Reguła max-width: 100% zmniejsza obraz na ekranie, ale telefon i tak pobiera plik w pełnym rozmiarze, czyli marnuje transfer. Po stronie HTML robi się to inaczej: atrybut srcset znacznika <img> wymienia kilka plików z ich szerokościami i pozwala przeglądarce wybrać, a <picture> z kilkoma <source> wskazuje inny plik dla innego warunku szerokości ekranu. Oba opisuje lekcja o obrazach i multimediach. Tabela cen ma stałą liczbę kolumn i na ekranie o szerokości 375 px po prostu się nie zmieści. Zmniejszanie czcionki niczego nie ratuje, więc tabelę opakowuje się blokiem z klasą przewijana i właściwością overflow-x: auto: przewija się sama tabela, a nie cała strona.
Układ sklepu na telefon
Ten sam sklep na trzech szerokościach: przy 1200 px panel boczny stoi obok treści, przy 768 px kolumny są węższe, a przy 375 px układ zwija się w jedną kolumnę
Na monitorze sklep ma menu poziome i panel boczny obok bloku głównego. Na tablecie zostaje ten sam układ, tylko kolumny są węższe. Poniżej 600 px dwie kolumny obok siebie przestają mieć sens: panel schodzi pod treść, menu ustawia się w pionie, a nagłówek maleje, żeby nazwa sklepu zmieściła się w jednym wierszu. Wszystkie te zmiany robi jedna reguła dopisana na końcu pliku styl.css.
@media (max-width: 600px) {
.srodek {
flex-direction: column;
}
aside, main {
width: 100%;
}
nav ul {
flex-direction: column;
}
h1 {
font-size: 150%;
}
}
.srodek to opakowanie panelu bocznego i bloku głównego, ustawione jako kontener elastyczny w lekcji o flexboksie i gridzie. flex-direction: column przestawia jego elementy z rzędu na kolumnę, a szerokość 100 procent daje każdemu z nich cały dostępny wiersz. Menu to lista <ul> wewnątrz <nav>, więc ta sama właściwość układa punkty menu jeden pod drugim. Reguły spoza bloku @media zostają w mocy: kolory, marginesy wewnętrzne i obramowania nie powtarzają się, bo zmienia się tylko to, co naprawdę ma być inne. Testowanie responsywności
Testowanie responsywności to sprawdzenie, jak strona zachowuje się na kolejnych szerokościach ekranu, a nie tylko czy reguła @media jest w pliku. Podstawa programowa wymienia je jako osobną umiejętność, obok samego wykonania strony.
›
Narzędzia deweloperskie przeglądarki: klawisz F12 otwiera panel, ikona telefonu włącza tryb urządzenia. Można wybrać model z listy, wpisać własną szerokość i obrócić ekran do poziomu. Bieżąca szerokość jest wypisana nad stroną, więc widać, przy której wartości układ się przełamuje.
›
Zwężanie okna myszą: najszybszy test na komputerze, dobry do znalezienia miejsca, w którym układ się psuje, zanim dojdzie do punktu przełamania.
›
Prawdziwy telefon w tej samej sieci: wpisuje się adres IP komputera z serwerem lokalnym zamiast localhost. Dopiero tu widać rozmiar przycisków pod palcem i czcionki systemowe telefonu.
Lista kontrolna jest krótka. Po pierwsze, na żadnej szerokości nie ma poziomego paska przewijania. Po drugie, tekst jest czytelny bez powiększania. Po trzecie, odnośniki i przyciski dają się nacisnąć palcem, czyli nie stoją sklejone w jednym rzędzie. Po czwarte, obrazy i tabele nie wystają poza ekran.
Na egzaminie
Pytanie pisemne o regułę dla ekranów od 600 px do 800 px ma tylko jedną poprawną odpowiedź: @media screen and (min-width: 600px) and (max-width: 800px). Odpowiedź błędna wygląda prawie tak samo, ale ma dwa nawiasy postawione obok siebie bez słowa and, a to już jest błąd składni: przeglądarka odrzuca całą regułę i żaden styl z jej wnętrza nie zadziała. Druga odpowiedź błędna podaje jeden warunek min-width: 800px, czyli ekrany od 800 px w górę, a nie przedział. Kierunek jest stały: max-width to „do", min-width to „od".
Wracają jeszcze trzy kształty. Znacznik ustawiający widok na telefonie ma stać w sekcji head, nie w body i nie w arkuszu stylów. Obraz skalujący się do rozmiaru ekranu ma mieć szerokość podaną w procentach, a nie oba wymiary w pikselach. Ukrycie sekcji na ekranach do 400 px to klasa z display: none zapisana wewnątrz @media (max-width: 400px), a nie poza nim.
W zadaniu praktycznym responsywność bywa jednym z punktów opisu stylu i jedna reguła @media przestawiająca układ na kolumnę zwykle wystarcza. Sprawdzana jest w trybie urządzenia, więc ten sam tryb jest ostatnim krokiem przed oddaniem pracy. Reguła musi trafić do zewnętrznego pliku dołączonego przez <link>: styl wpisany w atrybucie style nie przyjmie zapytania o media w ogóle.
Ściąga
<meta name="viewport" content="width=device-width, initial-scale=1">
szerokość widoku równa szerokości ekranu, bez pomniejszania
@media screen and (max-width: 600px)
ekran o szerokości do 600 px
@media screen and (min-width: 600px)
ekran o szerokości od 600 px w górę
@media screen and (min-width: 600px) and (max-width: 800px)
przedział od 600 px do 800 px
@media print
wersja do druku, tu ukrywa się menu
@media (orientation: landscape)
urządzenie obrócone poziomo
max-width: 100%; height: auto;
obraz nigdy szerszy niż blok, z zachowaniem proporcji
width: 30%
szerokość liczona od rodzica, kurczy się z oknem
1vw, 1vh
jeden procent szerokości i wysokości okna
1rem
rozmiar czcionki korzenia dokumentu, domyślnie 16 px
overflow-x: auto
poziome przewijanie samej tabeli, nie strony
display: none
ukrycie sekcji na wąskim ekranie
Pobierz ściągę PDF