Dodajmy do tej struktury nieco treści, by móc się przekonać, jak strona wygląda w rzeczywistości: Craig Sharkie Responding to Responsive Design Craig has been a regular at Web Directions South since before it was Web Directions South. He’s moved from the audience, through moderation, and on to being a presenter.
...
No matter what you do, your design is going to be responsive. Even if your response is to ignore Responsive Design, that’s still
23
24
Responsywne strony WWW a response.
...
...
...
Powyższy kod zapewnia możliwość wprowadzenia pewnych modyfikacji, jednak zażarte dyskusje na temat języka HTML5 nie sprzyjają dążeniu do skoncentrowania się na użytkowniku. W dalszej części książki poprawimy ten kod, teraz jedynie przedstawimy jego podstawową postać. Zastosowanie standardu HTML5 nie jest jednym z elementów zapewniających responsywność strony, jednak pomaga ją uzyskać. Oprócz tego HTML5 pozwala zmniejszyć wielkość stron i stworzyć taką strukturę DOM, która ułatwi późniejsze wprowadzanie modyfikacji.
Określanie struktury zawartości/bloków W pierwszej kolejności zamienimy nadrzędny element section na article, ponieważ wpis dotyczący konkretnego prelegenta łatwo może zostać pobrany z tej strony i umieszczony na stronie dotyczącej jednej ścieżki tematycznej (na takiej stronie mogą się na przykład znaleźć wszystkie wpisy poświęcone zagadnieniom projektowania). Element article jest w tym przypadku doskonałym rozwiązaniem, gdyż bloki dotyczące poszczególnych prelegentów umieszczane na stronie będą „w zasadzie niezależnie rozpowszechniane i wielokrotnie stosowane”8. Nasza nowa struktura podkreśla to, tworząc niezależne bloki, które z łatwością można łączyć. Oznacza to, że możemy ograniczyć zastosowanie elementów section do umieszczania w nich większych fragmentów zawartości (sekcji), takich jak projektowanie, programowanie i tak dalej. A zatem uprośćmy strukturę kodu:
Jak widać, zmniejszyliśmy nieco głębokość struktury kodu, dzięki czemu określając jego wygląd, będziemy mogli w trochę mniejszym stopniu korzystać z klas. Prostsza struktura kodu oznacza także możliwość uproszczenia stylów CSS i szybszego przekazywania użytkownikowi zarówno kodu HTML, jak i CSS. Zanim przyjrzymy się stosowanym stylom CSS, ponownie dodamy przykładową treść, by podkreślić cechy tego rozwiązania: 8
http://www.w3.org/html/wg/drafts/html/master/single-page.html#the-article-element/.
ZAPEWNIANIE RESPONSYWNOŚCI Craig Sharkie Responding to Responsive Design @twalve Craig has been a regular at Web Directions South since before it was Web Directions South. He’s moved from the audience, through moderation, and on to being a presenter.
...
No matter what you do, your design is going to be responsive. Even if your response is to ignore Responsive Design, that’s still a response.
...
...
Upraszczanie stylów CSS Teraz przyjrzymy się używanym stylom CSS. Upraszczanie arkuszy stylów może w znaczący sposób poprawić wydajność działania stron, i to nawet jeśli sprowadzi się ono do usuwania stylów, które nie są używane9. Innym sposobem zachowania prostoty używanych arkuszy CSS jest stosowanie możliwie małej liczby klas. Łączenie ze sobą klas powoduje powstawanie selektorów o najniższej efektywności działania, dlatego też tworzenie stylów na podstawie unikalnych identyfikatorów i elementów sprawi, że aplikacja będzie się wczytywała i wyświetlała szybciej, a to z kolei wpłynie na większe zadowolenie użytkowników. Upraszczanie stylów CSS będzie jeszcze bardziej zbieżne z zasadami metodologii RWD, jeśli zadbamy o zmniejszenie liczby różnego rodzaju sztuczek używanych w kodzie. Wykorzystując arkusze CSS działające w możliwie największej liczbie przeglądarek, będziemy mieli większe poczucie bezpieczeństwa. Niebawem zajmiemy się zagadnieniami wsparcia ze strony przeglądarek, lecz do tego czasu skupmy się na problemie, który od dawna nie traci popularności: .session-info.active { max-height: 1500px; overflow: hidden; }
9
https://developers.google.com/speed/docs/best-practices/payload#RemoveUnusedCSS.
25
26
Responsywne strony WWW
Można sądzić, że Internet Explorer 6 już wypadł z naszego zestawienia obsługiwanych przeglądarek, choć wciąż pojawia się na liście programów używanych przez osoby korzystające z naszych aplikacji. Dlatego też wciąż nie warto, zgodnie ze starą radą, łączyć selektorów w łańcuchy. Przeglądarka IE6 rozpozna bowiem tylko ostatni selektor takiego łańcucha i radośnie zastosuje właściwości max-height oraz overflow we wszystkich elementach, w których użyto klasy active, a nie jedynie w elementach session-info. Odejście od łańcuchów selektorów na rzecz klas stosowanych w kontekście identyfikatorów elementów jest korkiem na drodze do obiektowych stylów CSS. Zapewnia także znaczny wzrost wydajności, osiągany dzięki zmniejszeniu liczby klas. Być może rozwiązanie to nie stanowi panaceum, jednak pozwala poprawić wrażenia użytkowników: #content .active { max-height: 1500px; overflow: hidden; }
Zmiany w semantyce kodu Ostatnim tematem, jakim się zajmiemy, będą treści umieszczane wewnątrz bloku każdego prelegenta. Kiedy przyjrzymy się zmodyfikowanemu wcześniej kodowi HTML, zauważymy w nim miejsca warte uwagi: element div klasy speaker zawierający informacje o prelegencie oraz drugi element div klasy session zawierający informacje o sesji:
Po porównaniu tego kodu z fragmentem strony przedstawionym na rysunku 1.9 okazuje się, że lewa kolumna tekstu jest poświęcona prelegentowi, a prawa — sesji. Bardzo łatwo zauważyć to w kodzie, natomiast nieco trudniej w przeglądarce. Użytkownicy przeglądający stronę nie mogą skorzystać z udogodnienia, jakim jest możliwość poznania opisowej nazwy klasy, a zatem sami muszą się przekonać i domyślić, że dwie prezentowane kolumny tekstu zawierają odrębne treści, i powiązać to z różnicami w ich szerokości i wysokości. A w jaki sposób ta struktura kolumn będzie prezentowana w przeglądarkach na urządzeniach mobilnych? Produkcyjna witryna rozwiązuje ten problem, zmieniając układ na jednokolumnowy (przedstawiony na rysunku 1.10), choć także w tym przypadku oba bloki tekstu nie są wyróżniane w żaden widoczny sposób. Próbując poprawić responsywność stron poprzez zmianę ich struktury, należy pamiętać, że równie duże efekty mogą dawać modyfikacje zawartości. Zmiana właściwości font-size jednej kolumny, zmiana właściwości font-family drugiej, zmiana koloru tekstu w każdej z kolumn bądź dodanie do nich nagłówków mogą znacząco ułatwić użytkownikom rozróżnienie obu rodzajów treści.
ZAPEWNIANIE RESPONSYWNOŚCI
Rysunek 1.9. Typowy blok prelegenta na stronie Web Direction South 2012
Rysunek 1.10. Typowy blok prelegenta na stronie Web Direction South 2012 w przypadku, gdy dostępna szerokość strony jest mniejsza od 800 pikseli
Dodatkowo odchudzona wersja strony, na której wpisy poświęcone prelegentom pojawiają się wyłącznie, gdy jest to konieczne, także może znacząco zmniejszyć zarówno swój czas wyświetlania, jak i rozmiar. Skoro wpisy poświęcone prelegentom są początkowo „zwinięte”, moglibyśmy dynamicznie wczytywać zawartość wpisu wybranego przez użytkownika.
27
28
Responsywne strony WWW
Dzięki takiemu rozwiązaniu użytkownicy otrzymywaliby wspaniałe, interesujące ich treści, a jednocześnie nie byliby narażeni na pobieranie „ciężkiej” strony w jej obecnej, pełnej postaci. Oczywiste jest zatem, że witryna prezentuje bogate treści, lecz nie została stworzona z myślą o urządzeniach mobilnych. W następnych rozdziałach wprowadzimy więcej zmian w prezentowanej stronie poświęconej prelegentom oraz sesjom; na razie widać, że istnieje doskonały punkt wyjściowy do rozpoczęcia prac i że możemy na wiele sposobów dążyć do zapewnienia responsywności tworzonych stron WWW. A teraz zmienimy docelową grupę urządzeń, z myślą o których strona będzie tworzona, i przyjrzymy się zaletom, jakie daje powrót do fazy projektu.
Przedstawienie projektowania z myślą o urządzeniach mobilnych Choć idea projektowania responsywnych stron WWW znajduje się dopiero na początkowym etapie rozwoju, to jednak zaczynają już wykształcać się szkoły dotyczące sposobów zmian podstawowego podejścia i rozwiązań. Pierwszą z nich jest projektowanie z myślą o urządzeniach mobilnych (ang. mobile-first design). Sugeruje ona, by prace zaczynać od stworzenia działającego projektu witryny dla urządzeń mobilnych, a później uzupełnić go i rozszerzyć o wersję dla komputerów stacjonarnych, a nie na odwrót — czyli zaczynać od wersji dla komputerów i później usuwać z niej niepotrzebne komponenty, zapewniając odpowiednie działanie na urządzeniach mobilnych. W początkowym okresie po pojawieniu się metodologii RWD liczba urządzeń wymagających takiego podejścia była stosunkowo mała, dlatego też potrzeba wprowadzania zmian była niewielka. Z tego powodu najlepsi i najbardziej błyskotliwi projektanci bez obiekcji najpierw tworzyli strony przeznaczone dla komputerów stacjonarnych, a dopiero później dostosowywali je do potrzeb innych urządzeń. Kiedy jednak liczba urządzeń mobilnych zaczęła szybko rosnąć, projektanci spojrzeli na ideę projektowania z myślą o urządzeniach mobilnych w zupełnie nowym świetle, co jasno wyraził Andy Clarke, stwierdzając: „Och, jak bardzo śmialiśmy się, gdy uzmysłowiliśmy sobie nasz błąd”10. Wykorzystanie idei projektowania z myślą o urządzeniach mobilnych sprawia, że dyskusja na temat zawartości i interakcji występuje na znacznie wcześniejszym etapie prac nad projektem, gdyż wypełnienie wstępnej wersji aplikacji mobilnej przykładowymi treściami jest niemal niemożliwe. Takie skoncentrowanie uwagi na treści ułatwia określenie jej postaci i dostosowanie do kontekstu zastosowań mobilnych (co często jest uważane za najtrudniejsze zadanie), a to z kolei wywiera wpływ na rozszerzenie witryny na wszystkie inne obsługiwane środowiska.
10
http://stuffandnonsense.co.uk/projects/320andup/.
30
Responsywne strony WWW
Dziennik odwołań do serwera obsługującego witrynę może udostępnić informacje o preferencjach dotyczących używanych przeglądarek i uchronić nas przed niepotrzebnym zgadywaniem. Na przykład możemy zauważyć, że pracownicy sektora finansowego w Anglii i Australii używają zazwyczaj starszych przeglądarek niż osoby związane z kreatywnymi gałęziami przemysłu w USA. Statystyki przeglądarek nie tylko pozwolą nam podjąć lepsze decyzje dotyczące poziomu wsparcia, lecz dodatkowo pokażą, w których przypadkach poświęcanie na coś wysiłku i czasu nie będzie miało sensu. Analizując takie informacje, możemy uniknąć problemu typu: ze względu na tę jedną osobę musimy zapewnić wsparcie dla tej przeglądarki.
W potrzebie dobry będzie dowolny obszar prezentacyjny Kolejnym kluczowym zagadnieniem, na jakie należy zwrócić uwagę przed zakończeniem zarówno dopasowywania witryny, jak i tworzenia jej od podstaw, będzie zastosowanie elementu meta viewport. W rzeczywistości należy go stosować niezależnie od tego, czy tworzymy responsywną witrynę, czy też witrynę przeznaczoną wyłącznie dla urządzeń mobilnych. Oto postać tego elementu:
Przeglądarki Safari oraz Chrome działające w systemie iOS oraz przeglądarki na urządzeniach z systemem Android mają obszar prezentacyjny ustawiony na 980 pikseli szerokości. Nieco dziwne jest to, że samo urządzenie może dysponować ekranem o szerokości 320 lub 480 pikseli, w zależności od tego, czy działa w układzie pionowym, czy poziomym. To dziwactwo oznacza, że witryna będzie wyglądać dwa lub trzy razy węziej, niż można by się tego spodziewać. Zamiast w naturalny sposób prezentować lewy górny fragment strony odpowiadający jednej trzeciej jej pełnej szerokości (960 pikseli), przeglądarka niepotrzebnie ją zmniejszy. Choć może to być przydatne, gdy staramy się zapewnić responsywność witryny, to jednak będzie sporym utrudnieniem w przypadkach aplikacji przeznaczonych dla urządzeń o konkretnej szerokości ekranu. Na szczęście w rozwiązaniu tego problemu może nam pomóc element meta viewport. Trzeba jednak wyjaśnić zastosowanie atrybutu initial-scale=1.0. Otóż początkowo aplikacja jest wyświetlana w proporcji 1:1. Warunek width=device-width będzie przysparzał problemów wyłącznie do momentu, gdy nauczymy się, że ta „szerokość” (ang. width) przed znakiem równości oznacza „szerokość obszaru prezentacyjnego”. Atrybut ten zmienia wielkość obszaru prezentacyjnego, sprawiając, że będzie on odpowiadał szerokości ekranu urządzenia. Teraz nasza aplikacja będzie idealnie pasować!
ZAPEWNIANIE RESPONSYWNOŚCI
Nie należy jednak uważać, że jesteśmy skazani na stosowanie początkowej skali 1:0. Nieznaczne, kreatywne zastosowanie innych skal obszaru prezentacyjnego także może dać wspaniałe rezultaty. W ramach przykładu przyjrzymy się naszej witrynie SitePoint, przedstawionej na rysunku 1.2. Po pewnych eksperymentach zmieniłem używaną na niej skalę na 0,43, a uzyskane efekty ponownie pozwalają skoncentrować się na wrażeniach użytkownika (jak widać na rysunku 1.11).
Rysunek 1.11. Witryna w nowej skali
Jeśli użytkownicy muszą zmieniać powiększenie witryny podczas każdych odwiedzin, dlaczego by nie wyjść im naprzeciw? W przypadku witryny SitePoint skala 0,43 doskonale pasuje do szerokości głównej kolumny treści. Pasek boczny jest ukryty z prawej strony ekranu, górny pasek nawigacyjny pozostaje w niezmienionej postaci, a logo jest od niego estetycznie odsunięte. To oraz treść witryny, stanowiąca podstawowy powód odwiedzin, tworzy całość, która zajmuje najważniejsze miejsce na stronie. Musimy dodać jeszcze kilka słów ostrzeżenia, nim zostawimy element meta viewport i zajmiemy się kolejnymi zagadnieniami. Otóż nie należy próbować kontrolować obszaru prezentacyjnego w większym stopniu, niż to jest konieczne. Poszukując w internecie rozwiązań związanych ze skalowaniem, należy pamiętać, że programiści starając się emulować w swoich aplikacjach konkretne urządzenia, często kontrolują aspekty prezentacji w bardzo ścisły sposób, przez co nieuważni naśladowcy14 mogą mieć problemy z zapewnieniem odpowiedniej użyteczności swoich stron. 14
http://blog.javierusobiaga.com/stop-using-the-viewport-tag-until-you-know-ho.
31
32
Responsywne strony WWW
Na przykład gdybyśmy zastosowali tę samą skalę (0,43) na iPadzie, spowodowałaby ona pogorszenie, a nie poprawę użyteczności, co wyraźnie pokazuje rysunek 1.12.
Rysunek 1.12. Nowy wymiar porażki
Reagowanie na metodologię RWD Narzędzia i techniki zaliczane do metodologii RWD zawsze były głównym punktem zainteresowania społeczności programistów i projektantów — ten stan nie ulegnie zmianie, gdyż codzienna praktyka tchnie w nie nowe życie. Podstawowe filary metodologii RWD udostępniają zestaw technik, które można stosować pojedynczo lub grupowo i które pomagają umieścić użytkownika w centrum uwagi aplikacji. Połączenie płynnych siatek, dynamicznych obrazów, zapytań medialnych oraz responsywnych treści zapewnia możliwość obsługi szerokiej gamy urządzeń, na których będzie działać aplikacja. Najlepsze jest jednak to, że to dopiero początek… Jesteśmy pewni, że nie możesz doczekać się wszystkiego, co czeka na Ciebie w dalszej części książki.
Rozdział
Płynne siatki Wszyscy wiemy, że choć ekrany komputerów stacjonarnych i laptopów stają się coraz szersze — pozwalają na wyświetlanie coraz to większej liczby pikseli — to urządzenia mobilne popularyzują ekrany o znacznie mniejszych rozmiarach. Oznacza to, że teraz w stopniu większym niż kiedykolwiek wcześniej potrzebne jest rozwiązanie projektowe pozwalające sprostać potrzebie obsługi coraz większej liczby różnych szerokości ekranów (co pokazuje rysunek 2.1).
Rysunek 2.1. Witryna SitePoint wyświetlona na jednym laptopie, dwóch komputerach stacjonarnych, trzech iPhone’ach i czterech iPadach
34
Responsywne strony WWW
Rola płynnych siatek Jednym z elementów tego rozwiązania są płynne siatki (ang. fluid grids), stanowiące jeden z filarów metodologii RWD. Zarówno w kontekście projektowania stron WWW, jak i w innych przypadkach siatka jest sposobem zarządzania przestrzenią w układzie, co pokazaliśmy na rysunku 2.2. Najprostsze siatki — składające się z jednej, dwóch bądź trzech kolumn — zazwyczaj zawierają treści mieszczące się w jednym poziomym wierszu. W przypadku siatek bardziej złożonych (składających się z 9, 12 lub nawet większej liczby kolumn) zazwyczaj rośnie także liczba wierszy stosowanych do rozmieszczania treści. W takich złożonych siatkach pionowe kolumny pełnią raczej funkcję punktów rejestracyjnych, używanych do rozmieszczania zawartości w wierszach. Na przykład w 12-kolumnowej siatce wiersz może rozciągać się na wszystkie 12 kolumn, może zostać podzielony na trzy części rozpoczynające się odpowiednio w kolumnach 1., 4. i 8., na cztery części rozpoczynające się w kolumnach 1., 3., 5. i 8.; może też zostać podzielony w dowolny inny sposób.
Rysunek 2.2. Siatki proste oraz złożone
I choć siatki na stronach WWW przypominają te stosowane w publikacjach drukowanych, gdyż mają stałą szerokość, to jednak dysponują także luksusem elastyczności. Płynne siatki składają się z kolumn oraz odstępów pomiędzy nimi, przy czym wielkość siatek jest proporcjonalna do szerokości pojemników, w których są umieszczane. Szerokość tych pojemników może być stała lub określana względnie, niemniej jednak aby kolumny siatki mogły zostać uznane za „płynne”, ich szerokość musi być określana w sposób względny, jak tak pokazuje rysunek 2.3. Najlepszą właściwością płynnych siatek jest udostępnienie nam szansy, by już więcej nie przejmować się samą siatką, zwłaszcza jeśli chodzi o rozmieszczanie zawartości na stronie. Zamiast określać układ witryny, posługując się ustalonymi wymiarami, płynne siatki stosują wartości względne, dostosowując się tym samym do urządzenia, jakim posługuje się użytkownik. Jeśli są prawidłowo utworzone, to pozwalają nam skoncentrować się na treści oraz na wrażeniach użytkownika, a nie na strukturze aplikacji.
PŁYNNE SIATKI
Rysunek 2.3. Płynne siatki o szerokości kolumn zależnej od szerokości pojemnika
Rysunek 2.4 przedstawia stronę główną witryny firmy Microsoft wyświetloną w rozdzielczości 1440 pikseli. W swojej najszerszej postaci trzy kolumny umieszczone poniżej nagłówka W domu zajmują niemal tyle samo miejsca co cała witryna wyświetlona w oknie przeglądarki o szerokości 1024 pikseli, przedstawiona na rysunku 2.5. Układ strony został rozszerzony, aby wypełnić cały dostępny obszar, a jego elementy, takie jak kolumny, obrazki oraz odstępy pomiędzy kolumnami, zostały proporcjonalnie rozszerzone.
Rysunek 2.4. Witryna firmy Microsoft wyświetlona w oknie przeglądarki o szerokości 1440 pikseli
35
36
Responsywne strony WWW
Rysunek 2.5. Witryna firmy Microsoft wyświetlona w oknie przeglądarki o szerokości 1024 pikseli
Niegdyś minimalna szerokość witryny była ustalona i wynosiła 780 pikseli, by wraz z pionowym paskiem przewijania zmieścić się na ekranach o szerokości 800 pikseli. Obecnie na niemal dowolnych ekranach zajmuje ona 95 procent ich szerokości. To proste! Zamiast stosować wiele odrębnych projektów uwzględniających urządzenia z mniejszymi i większymi ekranami, układ strony płynnie się rozszerza lub zwęża zależnie od wielkości przeglądarki. Płynne siatki realizują najtrudniejsze zadania, dzięki czemu możemy skupić się na projekcie, a nie na strukturze strony. Jeszcze raz przyjrzyjmy się zatem kolumnom umieszczonym poniżej nagłówka W domu.
W domu
Powyższy kod jest uproszczonym i elegancko sformatowanym fragmentem kodu, który znajdziemy na witrynie firmy Microsoft. Dzięki temu struktura jego kolumn jest wyraźnie widoczna, a zastosowanie klas w elementach div sprawia, że jeszcze łatwiej można ją zrozumieć. Wystarczy, że skoncentrujemy się na samych nazwach klas, a następnie przeanalizujemy strukturę nadrzędnych elementów strony. Zaczniemy od trzech elementów, w których użyto klasy grid-units, umieszczonych wewnątrz elementu klasy grid-rows. Następnie docieramy do elementu klasy col-3, który tworzy kolumny, do kolejnego elementu klasy grid-row, który zawiera cztery elementy podrzędne, co sugeruje zastosowanie klasy row-4, a następnie do elementu nadrzędnego siatki, w którym została zastosowana klasa grid-container. I w końcu, na najwyższym poziomie prezentowanej hierarchii, umieszczony jest ele-
PŁYNNE SIATKI
Rysunek 2.6. Siedem różnych proporcji i trzydzieści pięć najczęściej stosowanych rozdzielczości ekranów
Płynna typografia Nasze zadanie polega na tym, by upewnić się, że wszystkie aspekty używanej typografii zostały określone w jednostkach względnych. W ten sposób wszystkie elementy typograficzne umieszczane na stronie będą płynnie i elastycznie dostosowywać się do różnych urządzeń, na których mają być używane nasze aplikacje. Ważniejsze jest jednak to, że określanie wielkości czcionek w sposób względny zapewni użytkownikom możliwość wpływania na postać tekstu wyświetlanego na stronie — zmiana bazowej wielkości czcionki sprawi, że cały tekst zostanie odpowiednio przeskalowany. Jeśli zaakceptujemy fakt, że wartość właściwości font-size powinna być określana względnie, a użytkownicy powinni mieć ostatnie słowo co do skali tekstu na stronie, lecz później ograniczymy możliwość określania wielkości elementów typograficznych, podając ich rozmiar w pikselach, to rozczarujemy naszych użytkowników i stracimy możliwości, jakie zapewnia płynna typografia. Co więcej, nie dotyczy to jedynie właściwości font-size, lecz także padding, margin oraz border. Czcionki używane w przeglądarkach udostępniają możliwość skalowania od momentu, kiedy zaczęło się mówić o takiej potrzebie. Historycznie największym problemem związanym ze skalowaniem czcionek był długi okres wykorzystywania najpopularniejszej z istniejących przeglądarek WWW. Internet Explorer 6 zapewnił firmie Microsoft zdobycie 90 procent udziałów w rynku przeglądarek, choć nie pozwalał na skalowanie czcionek, których wielkość została podana w pikselach. Nie byłoby to wielkim problemem, gdyby nie fakt, że większość istniejących w tym czasie witryn właśnie tak określała wielkości czcionek.
39
40
Responsywne strony WWW
Dążąc do zapewnienia użytkownikom możliwości skalowania czcionek, twórcy i projektanci stron zaczęli stosować miary względne — procenty lub jednostki em (a ostatnio także rem3). Choć IE 6 nie jest już tak popularną przeglądarką jak niegdyś, to jednak skorzystamy z prac pionierów względnego wymiarowania czcionek i przeniesiemy je na wyższy poziom. Najważniejszym aspektem płynnej typografii jest to, że jest ona kontrolowana przez użytkownika — my jedynie korzystamy z punktu podstawowego, który on określił. Poziomy kontrastu, czcionki, ich wielkości, powiększenie ekranu — wszystkie te aspekty wizualne są modyfikowane przez osoby niedowidzące, które dostosowują je do własnych potrzeb. Nawet jeśli nasi użytkownicy pozostawiają domyślne ustawienia przeglądarek, to i tak można uznać, że w ten sposób określają swoje preferencje. Aby nasze aplikacje były dla nich bardziej dostępne, należy porzucić określanie wielkości w pikselach i zacząć stosować jednostki względne. Wciąż będziemy korzystali z tych samych proporcji, jakie stosowaliśmy, określając wielkość czcionek w pikselach, jednak uzyskamy je, posługując się jednostkami względnymi. Po zastosowaniu typografii płynnej nasz tekst może mieć wielkość jednej jednostki, nagłówki — dwóch jednostek, a marginesy — szerokość połowy jednostki. Powstrzymamy się przed ustaleniem wymiaru tej jednostki, bo wierzymy w nasz projekt. Podejmujemy w ten sposób świadomy wysiłek, by nie narzucać zasady, że zwyczajny tekst ma być wyświetlany czcionką o wielkości 12 pikseli, nagłówki czcionką o wielkości 24 pikseli, a wypełnienie ma mieć szerokość 6 pikseli. W przypadku korzystania z metodologii RWD określenie proporcji pomiędzy elementami stron stanowi jedno z najważniejszych zagadnień procesu projektowego. W przykładzie przedstawionym na rysunku 2.7 tekst widoczny z lewej strony ma margines — obszar ograniczony linią przerywaną — o stałej wielkości 6 pikseli. Kiedy wielkość czcionki zostanie dwukrotnie powiększona, margines nie ulegnie zmianie. Z kolei wszystkie aspekty tekstu widocznego z prawej strony zostały określone w sposób względny. A zatem gdy wielkość czcionki zostanie podwojona, także margines stanie się dwa razy większy, zachowując tym samym proporcje projektu.
Rysunek 2.7. Marginesy, których wielkość została podana względnie, zachowują proporcje określone przez projektanta 3
http://css-tricks.com/snippets/css/less-mixin-for-rem-font-sizing/.
PŁYNNE SIATKI
Ujawnianie domyślnych wielkości czcionek Rozejrzyjmy się szybko dokoła. Czy jest ktoś, kto zwraca na siebie uwagę przeglądarek? Mamy bowiem zamiar zdradzić coś, co umknęło ich uwadze. Czy jesteśmy sami? Jeśli nie, to poszukajmy kogoś do małej dywersji… We wszystkich obecnie używanych przeglądarkach domyślna wielkość czcionki wynosi 16 pikseli. I tyle. To wszystko. Nie udało nam się znaleźć żadnej informacji wyjaśniającej, dlaczego w arkuszach stylów wszystkich przeglądarek właściwość font-size ma tę samą domyślną wartość, niemniej jednak tak właśnie jest. To jedna z wielkich tajemnic internetu — jedna z tych niezwykle rzadkich sytuacji, w których wszystkie przeglądarki działają tak samo, nawet pomimo faktu, że nie zostało to opisane w żadnej dokumentacji. Można jedynie sądzić, że trop wiedzie do pierwszej przeglądarki Mosaic4. Jeśli w elemencie body zastosujemy właściwość font-size o wartości 100%, a następnie wyświetlimy wyliczoną wielkość czcionki, używając dostępnego w danej przeglądarce narzędzia dla programistów, to okaże się, że będzie ona wynosić 16 pikseli (jak widać na rysunku 2.8).
Rysunek 2.8. 16px — domyślna wartość właściwości font-size w przeglądarkach Chrome, Firefox oraz Opera rozdzial02/browsersheets/index.html (fragment) body { font-size: 100%; }
W Wikipedii można znaleźć informacje na tematu historii punktu w typografii 5, jednak z naszego punktu widzenia najważniejsze jest to, że dysponujemy bazową wielkością czcionki
4
http://www.ncsa.illinois.edu/Projects/mosaic.html.
5
http://en.wikipedia.org/wiki/Point_(typ ography) oraz http://pl.wikipedia.org/wiki/Punkt_typograficzny.
41
42
Responsywne strony WWW
działającą we wszystkich przeglądarkach i możemy jej użyć, by trochę ułatwić sobie posługiwanie się czcionkami. Jednak skoro naszym celem jest uzyskanie czytelnych i proporcjonalnych wielkości czcionek, standardowa wielkość wynosząca 16 pikseli nie będzie dla nas zbyt użyteczna. Musimy zatem powrócić do nieco wygodniejszego rozmiaru: 10 pikseli. W tym celu użyjemy podstawowej właściwości font-size o wartości 62.5%, gdyż 62,5 procent z 16 pikseli daje 10 pikseli. W ten sposób uzyskamy wygodne możliwości powiększania czcionek: 1.2em daje w efekcie czcionkę o wielkości 12 pikseli, 1.6em — 16 pikseli i tak dalej. A zatem gdyby ktoś obawiał się stosowania proporcjonalnych czcionek ze względu na dziwaczne wartości, które się z tym wiążą, to właśnie udało nam się tę przeszkodę usunąć: rozdzial02/relativelydifficult/index.html (fragment) html { font-size: 62.5%; } body { font-size: 1.0em; ... } body > div { font-size: 1.2em; ... }
Obecnie jednak akceptuje się używanie 16 pikseli jako wielkości bazowej. Pojawiają się nawet głosy, że rozmiar ten ponownie powinien zostać uznany za domyślną wielkość tekstu na stronach WWW6. Powyższa technika określania wielkości czcionek może w ogromnym stopniu ułatwić nam pracę na stronach o niezbyt głębokiej strukturze DOM bądź takich, w których pomiędzy poszczególnymi poziomami nagłówków nie ma zbyt dużych różnic w wielkości czcionek. Jednak ma ona także wadę — choć sprawia, że dosyć łatwo można modyfikować rozmiar czcionek, używając wielkości względnych, to jednak korzystanie z niej na stronach o głębokiej strukturze DOM szybko może spowodować problemy. Aby się o tym przekonać, wystarczy zmniejszyć wielkość czcionki w pasku bocznym, powiększyć ją w elemencie article umieszczanym w tym pasku i spróbować wyliczyć wielkość nagłówka. Pułapkę tę ilustruje rysunek 2.9.
Rysunek 2.9. Interpretacja względnie określanych wielkości tekstu w elementach podrzędnych w przeglądarce Chrome 6
http://www.smashingmagazine.com/2011/10/07/16-pixels-body-copy-anything-less-costly-mistake/.
PŁYNNE SIATKI
Jeśli zejdziemy w głąb struktury DOM, przekonamy się, że wielkość tekstu w elementach html, body oraz div jest zgodna z oczekiwaniami. Wartość 1.6em, której użyliśmy w elemencie section, nie dała planowanej wielkości 16px, gdyż wielkość tekstu w elemencie nadrzędnym wynosiła 12px, a nie 10px. Jeszcze bardziej zaskakujące wyniki daje wartości 2.0em użyta w elemencie h1: tekst w elemencie nadrzędnym ma wielkość 12px, lecz po jej podwojeniu uzyskujemy 23px, a nie 24px, których można by oczekiwać. Zajrzyj do przykładów dołączonych do książki, zmodyfikuj wartości i przekonaj się, czy będziesz w stanie przewidzieć efekty. W tych przykładach i tak została zastosowana strona o stosunkowo płytkiej strukturze DOM, więc określanie wielkości czcionek w sposób względny wciąż jest rozwiązaniem sensownym. Jednak w przypadku stron o głębszej strukturze lub starych witryn rozwiązanie to szybko może nam przysporzyć problemów. Pokusa, by uciec do bezpiecznych pikseli, będzie zatem silna. Jak widać, potrzebujemy techniki, która zapewni nam prostszą drogę do sukcesu.
Wykorzystanie jednostek względnych w układach stron Jeśli zmienimy skalę, w jakiej oglądamy witrynę, i zauważymy przy tym, że choć tekst zareagował na nią prawidłowo i został powiększony, to jednak odstępy pomiędzy elementami nie zmieniły się (bądź też został zaburzony układ elementów lub nawet zaczęły one na siebie zachodzić), to można iść o zakład, że wartość właściwości font-size została podana w jednostkach względnych, natomiast któraś z właściwości padding, margin lub line-height (a nawet wszystkie trzy) została określona jako wartość bezwzględna, przez co nie reaguje prawidłowo na potrzeby użytkownika. Taką sytuację ilustruje strona przedstawiona na rysunku 2.10. Spróbujemy teraz rozwiązać ten problem.
Rysunek 2.10. Wielkości określane w sposób względny oraz bezwzględny, przy czym z prawej strony wielkość czcionek została podwojona
Podobnie jak w przypadku techniki skalującej bazową wielkość czcionki do 62.5%, także i teraz będziemy używali domyślnej czcionki o wielkości 10px, jednak dodamy do elementu 6 pikseli wypełnienia. Oprócz tego użyjemy nagłówków, w których wielkość czcionki będzie podwojona, choć zachowają one to samo wypełnienie o wielkości 6px. Tym razem
43
44
Responsywne strony WWW
usuniemy wartość 62.5% zastosowaną w elemencie html i nie będziemy zmieniać bazowej wielkości czcionki; wszystkie zmiany wielkości czcionek będziemy wprowadzać względem domyślnej wielkości 16px: rozdzial02/relativelydifficult/index.html (fragment) body { font: normal 100% Helvetica, Arial, sans-serif; }
Wiadomo, że czcionki dziedziczą bazową wielkość po elemencie nadrzędnym. Dlatego też skoro przeglądarka używa swojej wielkości domyślnej 16px, nasza docelowa wielkość 12px będzie wynosiła 75% wielkości domyślnej: rozdzial02/relativelydifficult/index.html (fragment) p { font-size: 0.75em; }
Wiemy także, że marginesy i wypełnienia są proporcjonalne do wielkości czcionki używanej w danym elemencie. Odnosząc to do naszych początkowych wyliczeń oraz do domyślnej wielkości czcionki naszego elementu p, która wynosi 12px, widać, że połowa jednostki em będzie odpowiadać 6 pikselom. A zatem przy domyślnej wielkości czcionki 16px docelową wielkością czcionki w elemencie p będzie 12px, a jego wypełnienie wyniesie 6px. Dodatkowo, aby otrzymać wypełnienie o wielkości 6px w elemencie h1, będziemy musieli określić, jak uzyskać tę wartość z 24px, bo taka jest wielkość czcionki nagłówka; nietrudno obliczyć, że jest to jedna czwarta tej wartości: rozdzial02/relativelydifficult/index.html (fragment) p { font-size: 0.75em; padding: 0.5em; } h1 { font-size: 1.5em; padding: 0.25em; }
W powyższym rozwiązaniu najważniejsze jest to, że wielkości czcionek oraz wypełnienia w elementach podaliśmy przy użyciu współczynników, a nie konkretnych wartości. Jeśli użytkownik ustawi w swojej przeglądarce bazową wielkość czcionki na 36px, to proporcje wielkości czcionki i wypełnienia naszego układu pozostaną niezmienione, a nawet lepiej — będą współpracować z ustawieniami użytkownika. Na przykład jeśli bazową wielkością czcionki będzie 36px, to właściwość font-size elementu p przyjmie wartość 27px, a właściwość padding — wartość 13.5px.
PŁYNNE SIATKI
Tak naprawdę wcale nie trzeba wiedzieć, jakie będą ostateczne wyliczone wartości, gdyż użytkownik może je zmodyfikować w dowolnej chwili, niemniej jednak wiadomo, że będą one spełniać poniższe równanie 2.1: element_docelowy ÷ kontekst = wynik
(2.1)
Element docelowy to element, którego postać określamy, kontekstem jest miejsce struktury DOM, w którym element ten się znajduje, z kolei wynikiem jest wartość, którą umieścimy w arkuszu stylów. Innymi słowy: bierzemy wielkość czcionki, którą chcemy uzyskać, dzielimy ją przez wielkość czcionki w wybranym elemencie i w ten sposób uzyskujemy interesujący nas wynik. Ten sam wzór można zobaczyć w artykule Marcotte’a pt. „Fluid Grids”, zamieszczonym na witrynie A List Apart7, a on zapewne znalazł go w opublikowanym jeszcze wcześniej artykule Jona Tana8. Także dla nas ten wzór będzie nieoceniony: element_docelowy / kontekst = wynik 12 / 16 = 0.75
Uzyskaną wartość 0.75 możemy umieścić bezpośrednio w arkuszu stylów: p { font-size: 0.75em; }
Dobrze nam idzie, zatem zastosujemy takie samo — proporcjonalne — rozwiązanie do określenia wartości właściwości line-height. Będziemy w tym celu potrzebowali odpowiedniej, proporcjonalnej jednostki, a ponieważ właściwość line-height taką ma, zatem jej użyjemy. Wartość właściwości line-height jest dziedziczona po najbliższym elemencie nadrzędnym w strukturze DOM, w którym wartość ta została określona, przy czym można ją podać w postaci wartości procentowej, w pikselach, używając słowa kluczowego normal lub jako liczbę bez określonej jednostki. Zastosowanie wartości procentowej lub wielkości wyrażonej w pikselach może dać nieco nieoczekiwane wyniki, chyba że będziemy ją odpowiednio ustawiali i przywracali do wartości odziedziczonej. Bez tego przywracania raz przypisane właściwości line-height wartości procentowe lub wymiary w pikselach byłyby niezmienne i niezależne od modyfikacji właściwości font-size elementu. Jeśli przy określaniu wartości względnych zastosujemy specjalne słowo kluczowe normal lub podamy wartość bez określania jednostki, to CSS zagwarantuje, że zastosowane zostaną takie wartości, o jakie nam chodzi. Różnica pomiędzy tymi dwoma rozwiązaniami polega na tym, że słowo kluczowe normal reprezentuje „rozsądną” wartość, która zmienia się wraz z wybraną wielkością czcionki, używaną przeglądarką i platformą systemową, na której ta przeglądarka działa9. W odróżnieniu od niej wartość liczbowa bez jednostki może być 7 8 9
http://alistapart.com/article/fluidgrids. http://v1.jontangerine.com/silo/css/pixels-to-ems/. http://www.w3.org/TR/CSS21/visudet.html#propdef-line-height.
45
46
Responsywne strony WWW
całkowicie dowolna. W tym przypadku dysponujemy pełną kontrolą! A ponieważ wytyczne WCAG 2.0 (Web Content Accessibility Guidelines10) zalecają stosowanie właściwości line-height o wartości 1.5, gdyż wtedy wynik uzyskiwany przez stronę jest najwyższy, zatem postąpimy zgodnie z tym zaleceniem. Po prostu użyjemy właściwości line-height o wartości 1.5 w elemencie body, a ustawienie to zostanie przekazane do wszystkich innych elementów strony: body { font: normal 100% Helvetica, Arial, sans-serif; /* 16px */ line-height: 1.5; } p { font-size: 0.75em; /* 12px */ padding: 0.5em; /* 6px */ }
W ten sposób, dzięki użyciu wartości liczbowej bez żadnej jednostki, udało nam się stworzyć rozwiązanie cechujące się dużą dostępnością, a zastosowana wartość wydaje się pasować do całego arkusza. Zyskujemy w ten sposób proporcjonalność wysokości linii i jesteśmy w stanie otrzymać ten sam poziom kontroli co w przypadku określania używanej czcionki w pełny, najbardziej rozbudowany sposób: p { font: normal inherit 400 1em/1.5 Helvetica, Arial, sans-serif; }
Prosty wzór (element_docelowy ÷ kontekst = wynik), którego użyliśmy do określania względnych wielkości czcionek, przyjdzie nam z pomocą jeszcze raz — gdy zajmiemy się tworzeniem własnej płynnej siatki.
Samodzielne tworzenie płynnej siatki Musimy zaakceptować fakt, że sposoby, w jakie użytkownicy będą przeglądać nasze aplikacje, są poza naszą kontrolą (analogicznie jak zrobiliśmy wcześniej w przypadku płynnej typografii). Jeśli chcemy coś kontrolować, to możemy mieć nadzieję, że będzie to sposób, w jaki zareagujemy na to, czego użytkownicy będą używali do przeglądania naszej aplikacji. W czasie gdy płynne siatki po raz pierwszy zostały ogłoszone Świętym Graalem11, panujące opinie akceptowały jedynie, by witryny o docelowej szerokości 800 pikseli rozszerzały się do ogromnego rozmiaru 1024 pikseli. Jednak zamiast dodawać po 100 pikseli z obu stron układu, zachęcano nas do otworzenia układu i zapewnienia mu możliwości zajęcia całej 10
11
Jest to zbiór zasad i wytycznych służących do zapewniania wysokiej dostępności treści publikowanych w internecie — przyp. tłum. http://www.alistapart.com/articles/holygrail/.
PŁYNNE SIATKI
dostępnej szerokości strony. I to rozwiązanie działało prawidłowo. Jednak później rozdzielczości ekranów ponownie uległy powiększeniu i okazało się, że trzeba zmienić to, co rozumiemy pod pojęciem „prawidłowego działania”. Na szczęście wraz ze wzrostem szerokości ekranów użytkownicy przestali odczuwać konieczność powiększania okna przeglądarki na cały obszar ekranu. Jednak nawet gdy ekrany są najszersze, istnieje ryzyko, że okno nie będzie zmaksymalizowane, a wtedy możemy złamać nasz układ, korzystając z pustego miejsca.
Dodawanie złotej proporcji Przyjrzyjmy się systemowi kolumn, który, podobnie jak płynna typografia, został zaprojektowany po to, by wyglądał tak samo, niezależnie od ekranu wybranego przez użytkownika. Naszym celem będzie stworzenie układu składającego się z dwóch kolumn, który zagwarantuje nam sprostanie wymogom nowoczesnych komputerów stacjonarnych. W dalszych rozdziałach zajmiemy się dostosowaniem sekcji Speakers & Sessions naszej przykładowej witryny do ekranów urządzeń mobilnych i tabletów, jednak na razie naszym celem jest stworzenie układu przeznaczonego dla komputerów stacjonarnych. Możemy nawet zaszaleć w następnym rozdziale i zbudować układ złożony z jednej kolumny, niemniej jednak będzie to możliwe wyłącznie w przypadku, gdy teraz zapewnimy sobie odpowiednie podstawy. Naszym pierwszym zadaniem będzie określenie szerokości kolumn w sposób względny. Moglibyśmy stworzyć układ, w którym obie kolumny mają 50 procent, lub taki, w którym jedna kolumna ma szerokość jednej trzeciej szerokości całego układu. Zamiast tego inspiracją dla naszego układu będzie zasada złotej proporcji, opisana w 300 r. p.n.e. przez Euklidesa. Stwierdza ona, że „linia prosta jest podzielona w złoty sposób, gdy stosunek całej linii do większego odcinka jest równy stosunkowi większego odcinka do mniejszego”. Wyrażając to w nieco prostszy sposób: stosunek a + b do a jest taki sam jak stosunek a do b, co pokazaliśmy na rysunku 2.11.
Rysunek 2.11. Zasada złotej proporcji Euklidesa
Na rysunku 2.12 z lewej strony pokazaliśmy, jak wyglądają kolumny układu zastosowanego na stronie Web Directions South. Z kolei z prawej strony przedstawiony został nasz docelowy układ, z wykorzystanymi klasycznymi proporcjami kolumn.
47
48
Responsywne strony WWW
Rysunek 2.12. Informacje o sesji na witrynie Web Direction South: z lewej strony początkowo, z prawej — po zastosowaniu złotej proporcji
Zasada złotej proporcji często występuje w naturze (na przykład można ją znaleźć w układzie spiral ziaren słonecznika) i jest od wieków stosowana przez człowieka we wszelkiego typu projektach: w kolumnach greckiego Partenonu lub układzie średniowiecznych rękopisów. Uważamy po prostu, że te proporcje są przyjemne dla oka. Choć być może zamieszczony opis nic czytelnikowi nie mówi, to jednak zastosowanie tej zasady w naturze na pewno będzie doskonale znane. Jej efektem jest na przykład kształt muszli morskiego ślimaka łodzika (nazywanego także nautiliusem) pokazany na rysunku 2.13.
Rysunek 2.13. Złota proporcja w naturze i w projekcie
Przy okazji złotej proporcji zapaleńcy mogą przetestować swoje umiejętności matematyczne12, jednak dla nas najważniejsze będą dwie wartości określające tę proporcję: 1,6180339887 oraz 0,6180339887. W omawianym przypadku będzie nas interesować ta druga wartość, gdyż nasz wzór używa krótszej długości (a), którą dzielimy przez dłuższą (a + b): element_docelowy ÷ kontekst = wynik (a) ÷ (a + b) = 0,6180339887
W ramach przykładu wykorzystania tego wzoru użyjemy standardowej szerokości strony wynoszącej 960px i wykonamy kilka obliczeń. Gdyby zależało nam jedynie na określeniu
12
pl.wikipedia.org/wiki/Złoty_podział.
50
Responsywne strony WWW
Gotowe systemy siatek Gotowe systemy siatek zapewniają możliwość określania układów stron z niespotykaną wcześniej łatwością. Pozwalają zastosować opracowaną już siatkę i skoncentrować się na wrażeniach, które zapewni aplikacja, chociaż z drugiej strony uzależniają od rozwiązania stworzonego przez kogoś innego. Musimy jedynie znaleźć rozwiązanie, które będzie nam najbardziej odpowiadać, a potem wygodnie usiąść i zrelaksować się. Krótkie poszukiwania w internecie pozwalają znaleźć całkiem sporo gotowych systemów siatek. Najbardziej popularne i znane są cztery z nich: 960 Grid System13, Bootstrap14, Gridset15 oraz innowacyjny system 320 and Up16. Przyjrzymy się pobieżnie każdemu z nich, a następnie zastosujemy jeden na przykładowej stronie Speakers & Sessions. Podczas prezentowania tych systemów należy pamiętać, że być może nie skorzystasz z żadnego z nich, jednak każdy system ma pewne aspekty, które mogą się przydać w dalszej pracy. W czterech kolejnych podpunktach rozdziału opiszemy zalety i wady poszczególnych systemów oraz wskażemy ich kluczowe cechy.
960 Grid System 960 Grid System Nathana Smitha (przedstawiony na rysunku 2.14) powstał jako rozwiązanie bezwstydnie dedykowane jedynie dla komputerów stacjonarnych — doskonale nadawało się do tworzenia rozwiązań przeznaczonych właśnie na tradycyjne komputery. Ostatnio jednak autor poświęcił wiele wysiłku, by dostosować je także do zastosowań mobilnych. Aby uwzględnić oba podejścia, system ten udostępnia zbiór narzędzi obejmujący arkusze CSS oraz skrypty JavaScript służące do błyskawicznego prototypowania i publikacji, jak również szablony przeznaczone dla wielu popularnych środowisk projektowych, takich jak Balsamiq, Fireworks, Omnigraffle oraz Photoshop17. Obecnie dostępnych jest w sumie 15 takich szablonów, które ułatwiają przejścia pomiędzy fazami projektowania, tworzenia i publikowania witryn. Przywiązywanie ogromnej wagi do detali, które cechuje 960 Grid System, stanowi inspirację dla wielu responsywnych i płynnych wariacji, tematów, a nawet systemów pozwalających na stosowanie własnych preferencji związanych z wykorzystywaniem CSS18. Wszystko to oznacza, że możemy określić preferowaną liczbę kolumn oraz wielkość odstępów pomiędzy nimi, a jednocześnie cieszyć się korzyściami, jakie daje stosowanie rozwiązań opartych na 960 Grid System. 13
http://960.gs/.
14
http://twitter.github.com/bootstrap/. https://gridsetapp.com/. http://stuffandnonsense.co.uk/projects/320andup/. https://github.com/nathansmith/960-Grid-System/tree/master/templates/. http://grids.heroku.com/.
15 16 17 18
PŁYNNE SIATKI
Rysunek 2.14. Witryna 960 Grid System
Zalety: udostępnia generator własnych arkuszy stylów; stanowił początek dla wielu innych systemów o szerokości 960 pikseli, co zapewnia
łatwość integracji z nimi; ma wiele podzielników — w sumie 28 — co zapewnia szerokie możliwości tworzenia
różnych układów kolumn. Wady: konieczność stosowania bardziej rozbudowanego kodu w porównaniu z rozwiąza-
niami autorskimi; większy rozmiar plików CSS w porównaniu z rozwiązaniami autorskimi; nieopisowe nazwy klas.
Najważniejsze cechy Ze względu na to, że naszymi „użytkownikami” będą również boty wyszukiwarek, 960 Grid System pamięta także o nich. Dysponuje on mechanizmem modyfikacji kolejności kodu źródłowego, który to mechanizm pozwala nam umieszczać ważne treści na wyższych poziomach struktury DOM, lecz dzięki zastosowaniu odpowiednich stylów wyświetlać je we właściwych miejscach strony:
960 Grid System ...
Klasy push_X oraz pull_X pozwalają przesuwać elementy umiejscowione względnie w ramach wiersza, odpowiednio wypychając je w lewo lub ciągnąc w prawo. Na przykład logo
51
52
Responsywne strony WWW
960 Grid System, widoczne na rysunku 2.14, w kodzie źródłowym jest umieszczone bliżej początku strony niż blok tekstu wyświetlony z jego lewej strony, pomimo to zajmuje kluczowe miejsce na samym środku układu.
Bootstrap Każdy, kto obecnie ma coś wspólnego z internetem, słyszał na pewno o Twitterze i GitHubie. Zatem jeśli natkniemy się na system, który został stworzony przez autorów Twittera i stanowi najpopularniejsze repozytorium na GitHubie, bijąc przy tym jQuery i Node.js, to możemy wyrobić sobie pewne pojęcie o szybkości, z jaką Bootstrap (przedstawiony na rysunku 2.15) zyskuje popularność. Zgodnie ze słowami jego twórców, jest to „elegancki, intuicyjny i potężny system do określania wyglądu stron WWW, przeznaczony do ułatwienia i przyspieszenia ich tworzenia”19. Mówiąc krótko: Bootstrap uosabia dążenie stanowiące kluczowy cel metodologii RWD, czyli zapewnienie twórcom możliwości szybkiego udostępniania aplikacji, które pod względem prezentacji będą spełniać wszystkie wymagania użytkowników.
Rysunek 2.15. Witryna systemu Bootstrap
Bootstrap jest najbardziej znany ze swojej biblioteki komponentów, jednak jego możliwości związane z tworzeniem responsywnych stron WWW są także dość silne, by mogły się wyróżniać. Już niebawem użyjemy systemu Bootstrap, by zmodyfikować przykładową stronę Speakers & Sessions, wykorzystując przy tym możliwości płynnego zagnieżdżania i przesuwania, które w znacznej mierze pomagają wynieść ten system ponad jego konkurentów. I chociaż będziemy unikali korzystania z komponentów, dla których wielu programistów decyduje się sięgnąć po system Bootstrap, to jednak łatwość, z jaką pozwala on na tworzenie układów siatek, na pewno każdego zachęci do wypróbowania jego innych możliwości.
19
https://github.com/twitter/bootstrap.
PŁYNNE SIATKI
Można nawet ulec pokusie, by skorzystać z szybko rozwijającego się środowiskowego sklepu udostępniającego tematy graficzne do tego systemu. Darmowe tematy graficzne można znaleźć na witrynie Bootswatch20, a później ewentualnie sięgnąć po produkty komercyjne, dostępne na witrynie WrapBootstrap21. Jeśli nie skorzystamy z żadnego z dostępnych tematów graficznych, to możemy wziąć przykład z książki o systemie 320 and Up i zastosować w tworzonych stronach style współpracujące z Bootstrapem. Na razie można pominąć taką integrację, jednak klasy prezentowane w tej książce są niezwykle solidne, a sam system — inspirujący i efektywny. Zalety: jego popularność oznacza, że społeczność użytkowników jest duża i prężna, a pro-
gramiści doskonale znają system; został intensywnie przetestowany i przetrwał krytyczne badania; zapewnia pełne możliwości dostosowywania i wyboru tylko tych opcji, na których
nam zależy; udostępnia sklep, w którym można kupować i sprzedawać tematy graficzne; może „pomóc maniakom w tworzeniu fantastycznych rzeczy w Sieci”22.
Wady: konieczność stosowania bardziej rozbudowanego kodu w porównaniu z rozwiąza-
niami autorskimi; większy rozmiar plików CSS w porównaniu z rozwiązaniami autorskimi; nieopisowe nazwy klas.
Najważniejsze cechy Bootstrap pozwala na łatwe tworzenie zagnieżdżonych kolumn, a w razie stosowania takich rozwiązań nie traci nic ze swej responsywności. Jest oparty na układzie składającym się z 12 kolumn i pozwala zagnieżdżać kolumny na dowolną głębokość, choć trzeba przy tym zadbać, by kolumny każdej z zagnieżdżonych grup były tworzone przy wykorzystaniu klas systemu. W przykładzie przedstawionym poniżej dwie kolumny o szerokości 6 jednostek są umieszczone w jednej kolumnie, która z kolei wraz z drugą, sąsiadującą z nią kolumną została umieszczona w nadrzędnej kolumnie układu, mającej szerokość 12 jednostek. Każda z kolumna o szerokości 6 jednostek w rzeczywistości zajmuje 48,93617021276595% dostępnej szerokości i ma lewy margines o szerokości 2,127659574468085% (przy czym dla pierwszej kolumny margines ten wynosi 0). Po zsumowaniu tych wszystkich szerokości uzyskujemy dokładnie 100%:
20
http://bootswatch.com/.
21
https://wrapbootstrap.com/.
22
http://twitter.github.com/bootstrap/.
53
54
Responsywne strony WWW
Szerokość 12 jednostek
Szerokość 6 jednostek
Szerokość 6 jednostek
Szerokość 6 jednostek
Szerokość 6 jednostek
Twórcy systemu dokonali wszystkich niezbędnych obliczeń i testów (o czym można się przekonać, przeglądając plik /css/bootstrap.css dostępny w pobranym archiwum z plikami systemu Bootstrap), dzięki czemu możemy skoncentrować się na samym projekcie: .row-fluid [class*="span"] { ... margin-left: 2.127659574468085%; } .row-fluid [class*="span"]:first-child { margin-left: 0; } .row-fluid .span6 { width: 48.93617021276595%; ... }
Gridset Gridset, przedstawiony na rysunku 2.16, zapewnia możliwość szybkiego tworzenia prototypów i skupienia uwagi na projekcie, zgodnie z tym, czego można oczekiwać po jednym z głównych systemów. Udostępnia on łatwe w użyciu narzędzia, dzięki którym przy projektowaniu kolumn możemy odłożyć kalkulatory do szuflady. Co więcej, jest firmowany przez Marka Boultona23. Ale czy pozwala współpracować na bieżąco z ludźmi znajdującymi się w dowolnym miejscu na świecie? Owszem, pozwala! Gridset pozwala na współpracę z zespołem niezależnie od tego, czy jego członkowie są zgromadzeni przy jednym laptopie, czy też rozsiani po całym świecie. Jednak nie chodzi w niej tylko o określanie w arkuszach CSS punktów granicznych, w których następuje zmiana układu (określanych w języku angielskim terminem breakpoints), ale raczej o projektowanie w przeglądarce przy jednoczesnym czerpaniu inspiracji spoza niej.
23
http://www.markboulton.co.uk/.
PŁYNNE SIATKI
Rysunek 2.16. Witryna systemu Gridset
Zalety: można łatwo tworzyć i porównywać wiele siatek w celu wyróżniania punktów gra-
nicznych; można współdzielić tworzone siatki; kombinacje klawiszy pozwalają wyświetlać nad witryną warstwę z zaprojektowaną
siatką; system pozwala dodawać kolumny, zmieniać proporcje, odstępy pomiędzy kolum-
nami i nigdy nie przejmować się jakimikolwiek obliczeniami matematycznymi. Wady: konieczność stosowania bardziej rozbudowanego kodu w porównaniu z rozwiąza-
niami autorskimi; większy rozmiar plików CSS w porównaniu z rozwiązaniami autorskimi; nieopisowe nazwy klas.
Najważniejsze cechy Gridset dysponuje interfejsem graficznym typu WYSIWYG, którego użycie jest równie łatwe jak posługiwanie się liniami pomocniczymi w Photoshopie. Można przeciągać kolumny, by nadawać im nieregularne rozmiary, dzięki czemu podstawowa siatka staje się bardziej responsywna (co pokazano na rysunku 2.17). Nie ma już potrzeby scalania dwóch kolumn o jednostkowej szerokości, żeby utworzyć kolumnę dwukrotnie szerszą — wystarczy przeciągnąć ją do takiego rozmiaru, jakiego potrzebujemy. Można także zagnieżdżać siatki w celu tworzenia niezawodnych i asymetrycznych układów.
55
56
Responsywne strony WWW
Rysunek 2.17. Niebieska kolumna została przeciągnięta w celu zmiany jej szerokości
320 and Up 320 and Up był pierwszym bardzo popularnym systemem do projektowania responsywnych stron WWW, działającym zgodnie z ideą dotyczącą urządzeń mobilnych. Idea ta zakłada, że elementy wspólne zarówno dla aplikacji mobilnej, jak i dla jej wersji przeznaczonej dla tradycyjnych komputerów występują w wersji mobilnej. W pierwszej kolejności zatem tworzona jest wersja aplikacji przeznaczona dla urządzeń mobilnych, a dopiero potem rozbudowuje się ją, uzupełniając o progresywne ulepszenia24 poprawiające wrażenia użytkownika korzystającego z aplikacji na większych ekranach. Nie trzeba się przy tym koncentrować na podstawowej szerokości systemu, wynoszącej 320 pikseli; dzięki wykorzystaniu zapytań medialnych system pozwala także na obsługę szerokości równej 480, 600, 768, 992 oraz 1382 pikseli. Zresztą przekonaj się sam (rysunek 2.18). Zalety: wielkość pobieranych plików dla urządzeń mobilnych jest niewielka, dzięki czemu
aplikacja wczytuje się szybciej; system pozwala na oddzielenie siatki od „atmosfery” projektu, czyli takich jego aspek-
tów jak typografia i kolory; w drugiej wersji systemu usunięto wymóg korzystania z Respond.js; system powstał początkowo jako rozszerzenie do szablonu HTML5 Boilerplate25, a za-
tem jest oparty na prawdziwym gigancie. 24
http://pl.wikipedia.org/wiki/Progresywne_ulepszanie.
25
http://html5boilerplate.com/.
58
Responsywne strony WWW
Dodatkowy kod CSS może być większy od tego, który napisalibyśmy w rozwiązaniu autorskim. Niemniej jednak zapewnia nam możliwość szybkiego tworzenia nowych sekcji aplikacji i zmiany liczby kolumn w poszczególnych sekcjach, a wszystko to przy zachowaniu gwarancji, że style CSS będą prawidłowo działać w różnych przeglądarkach i na różnych platformach systemowych. Jeśli zaś chodzi o nieopisowe nazwy klas (takie jak span4, yui-b, grid 4), to choć nie mają one większego sensu w kontekście naszej witryny, nabierają znaczenia w kontekście danego systemu. Nazwa klasy offset4 w kontekście systemu Bootstrap jest sensowna i zrozumiała.
Zastosowanie systemu Bootstrap Przekonajmy się, jak wyglądałoby wykorzystanie systemu Bootstrap na naszej przykładowej stronie Speakers & Sessions przedstawionej na rysunku 2.19. Skoncentruj się, bo modyfikacje wprowadzimy bardzo szybko, i nie zapomnij zajrzeć do przykładów dołączonych do książki, by przeanalizować zmiany wprowadzane w kodzie.
Rysunek 2.19. Strona Speakers & Sessions w naturze
Pierwszą rzeczą, jaką należy zrobić, jest dostosowanie systemu Bootstrap do naszych potrzeb i pobranie wynikowych plików26. Specjalna strona dostosowywania dostępna na witrynie systemu (przedstawiona na rysunku 2.20) pozwala łatwo określać, z których jego możliwości chcemy korzystać. W naszym przypadku należy kliknąć oba przyciski Toggle all (widoczne na rysunku 2.20): pierwszy w nagłówku sekcji Choose components oraz drugi w nagłówku sekcji Select jQuery plugins. Na razie nie będziemy potrzebowali żadnych wtyczek, a z sekcji Scaffolding interesuje nas wyłącznie pole wyboru Grid system, należy je zatem zaznaczyć. Teraz pozostaje już jedynie przewinąć stronę na sam koniec, aż pokaże się
26
W treści książki oraz w przykładach autorzy korzystają ze starszej wersji systemu Bootstrap — 2.3.2. Można ją pobrać ze strony: http://getbootstrap.com/2.3.2/.
PŁYNNE SIATKI
Rysunek 2.20. Nieuchwytny przycisk Customize and Download
sekcja Download, i kliknąć przycisk Customize and download (nie sposób go przeoczyć — jest niebieski i bardzo duży). Po pobraniu pliku ZIP należy rozpakować jego zawartość, dodać ją do aplikacji i dołączyć odpowiednie odwołanie wewnątrz elementu head:
Teraz zajmiemy się naszym arkuszem stylów i usuniemy z niego wszystkie ustawienia związane z układem o stałej szerokości 800 pikseli, dzięki czemu nasza nowa responsywna siatka będzie w stanie robić swoje czary. Chcemy, by nasze elementy blokowe zajmowały cały
59
60
Responsywne strony WWW
dostępny obszar swoich elementów nadrzędnych. Będziemy dysponowali tym samym poziomem kontroli, ale tym razem użyjemy możliwości, jakie daje nam Bootstrap. Dzięki temu unikniemy konieczności tworzenia dodatkowych reguł CSS. Początkowo niepotrzebne deklaracje stylów umieścimy w komentarzach, choć nic nie stoi na przeszkodzie, by je całkowicie usunąć. Jednak dzięki komentarzom będzie nam łatwiej śledzić, jak strona działała wcześniej oraz jak będzie działać po wprowadzeniu modyfikacji. W efekcie uzyskamy reguły podobne do przedstawionych w poniższym przykładzie: rozdzial02/wds/04 grid/stylesheets/800.css (fragment) header { ... /* width: 800px; */ ... } #content { /* width: 800px; */ ... } #sponsors { ... /* width: 800px; */ }
Po wprowadzeniu tych zmian nasza strona będzie wyglądać całkiem dobrze, przynajmniej do momentu, gdy otworzymy jeden z wpisów dotyczących prelegentów. Ze względu na brak określonej szerokości i zastosowanie dwóch kolumn o stałej szerokości, z których jedna jest umieszczona z lewej, a druga z prawej strony, uzyskaliśmy układ z groteskowo szerokim odstępem pomiędzy kolumnami (co wyraźnie widać na rysunku 2.21).
Rysunek 2.21. Strona Speakers & Sessions bez żadnych ograniczeń szerokości
Zaraz to naprawimy. W pierwszej kolejności spróbujemy usunąć ograniczenie szerokości treści; zrobimy to, umieszczając odpowiednie reguły CSS w komentarzach:
PŁYNNE SIATKI rozdzial02/wds/04 grid/stylesheets/800.css (fragment) .session { /* width: 320px; */ } .speaker { /* width: 240px; */ } #content p { /* max-width: 480px; */ text-indent: 2em; }
Chodzi nam o to, by poprawić wygląd strony i wykorzystać możliwości systemu Bootstrap, wprowadzając przy tym jak najmniejszą liczbę zmian i dodatków, zarówno w jej kodzie, jak i w kodzie arkuszy stylów. Bez ograniczenia szerokości zastosowanie właściwości float nie daje oczekiwanego efektu — zaraz usuniemy wszystkie reguły z tą właściwością, gdyż w przypadku wykorzystania Bootstrapa nie są już potrzebne. Następnie dodamy do strony trochę nowego kodu HTML. Musimy umieścić kolumny wewnątrz elementu div, dzięki czemu będziemy mogli zastosować klasę row, a przy okazji dodamy odpowiednie klasy także do kolumn i określimy prawidłowe wyrównanie ich treści — pozwoli to w odpowiedni sposób wizualnie wyróżnić nasze nowe kolumny: rozdzial02/wds/05 bootstrap/stylesheets/grid.css (fragment) .session { /* float: right; */ text-align: justify; } .speaker { /* float: left; */ text-align: justify; }
Nowe klasy udostępniane przez Bootstrap wprowadzają interesujące koncepcje. Pierwszą i najważniejszą z nich jest praca w układzie 12-kolumnowym. Ze względu na to, że Bootstrap narzuca wykorzystanie właśnie 12 kolumn, pracując nad zawartością wiersza, należy się starać, by klasy elementów dawały w sumie 12. Na stronie przedstawionej na rysunku 2.22 zastosowano style: span4, span6 oraz offset2, co w sumie daje 12 jednostek. Dzięki temu wiemy, że jesteśmy na właściwej drodze. Drugim ważnym zagadnieniem jest to, że w wierszu wcale nie trzeba umieszczać 12 elementów — ma on jedynie zająć 12 jednostek szerokości, przy czym można to uzyskać, stosując także przesunięcia. Klasa offset2 zastosowana w elemencie div klasy sessions przesuwa go o dwie kolumny w prawo względem położenia wynikającego z rozkładu dokumentu. To bardzo wygodny i dający duże możliwości sposób rozmieszczania treści na stronie bez konieczności stosowania w kodzie dodatkowych, pustych pojemników:
61
62
Responsywne strony WWW
Rysunek 2.22. Strona systemu Bootstrap z nałożoną siatką kolumn
Daleko nam jeszcze do zakończenia prac nad stroną, niemniej jednak dodaliśmy do niej jedynie kilka klas, stylów i elementów div, a i tak uzyskaliśmy wspaniałe efekty. Ile jeszcze zmian musimy wprowadzić? Usuńmy właściwość margin ze stylów określających postać elementów article, tak by wiersze naszej strony zajmowały całą dostępną szerokość przeglądarki, a następnie umieśćmy kompletną treść w wygodnym elemencie div z atrybutem id o wartości main, który umożliwi nam określanie punktów granicznych: rozdzial02/wds/05_bootstrap/stylesheets/grid.css (fragment) #main { margin: 0 auto; max-width: 1200px; width: 96%; } rozdzial02/wds/04_grid/index.html (fragment)
... ...
PŁYNNE SIATKI
Jak widać, zastosowaliśmy właściwość max-width o wartości 1200px. Wartość ta jest wybrana dosyć arbitralnie, jednak Bootstrap przyjmuje, że właśnie taka jest szerokość ekranu na dużych komputerach stacjonarnych, a dodatkowo pozwala nam pokazać, co się stanie, gdy okno przeglądarki będzie szersze od wartości właściwości max-width. Domyślnym punktem granicznym stosowanym przez Bootstrap dla „komputerów stacjonarnych” jest wartość 980px, natomiast dla „dużych komputerów stacjonarnych” wartość ta wynosi 1200px. Każda szerokość większa od 980px sprawi, że system przestanie działać responsywnie. Zależy nam na tym, by nasze treści zachowywały się responsywnie, a jednocześnie by straciły responsywność w przypadku, gdy obszar prezentacyjny aplikacji będzie zbyt duży, aby takie zachowanie zapewniło odpowiednio wysoką czytelność. Zastosowanie szerokości 96% zapewnia, że wokół wszystkich kolumn będą widoczne odstępy, i pozwala, by w początkowym projekcie zawartość sekcji Speakers zajmowała cały obszar dostępny pomiędzy krawędziami pojemników, w których jest umieszczona. Teraz do każdego bloku sekcji Speakers dodamy klasy określające szerokość kolumn (span11) oraz przesunięcie (offset1) i to właściwie będzie już wszystko. Klasa span11 oznacza, że element zajmie 11 kolumn, natomiast klasa offset1 — że będzie on wyświetlany, poczynając od 2. kolumny, dzięki czemu uzyskamy miejsce na nagłówki sekcji, takie jak na przykład Design widoczny na rysunku 2.23:
Rysunek 2.23. Strona Speakers & Sessions z ograniczeniami odstępów pasującymi do wszystkich przeglądarek
W ramach ostatnich poprawek przyjrzymy się pewnemu problemowi, który pojawił się na naszej nowej stronie, i zastosujemy responsywne rozwiązanie w używanych na niej skryptach JavaScript. Stosowany na niej akordeon, który pozwala na wyświetlanie i ukrywanie zawartości każdego bloku prelegentów, przestał działać. Skrypt wymaga bowiem obecności elementu należącego do ściśle określonej klasy — vcard session-info — a modyfikacja atrybutów class i dodanie do nich klas wymaganych przez Bootstrap spowodowała, że skrypty nie działają i treści poświęcone prelegentom nie są wyświetlane. Dlatego też zamiast podawać
63
64
Responsywne strony WWW
nazwę klasy vcard session-info na stałe w kodzie JavaScript, będziemy dynamicznie pobierać wartość właściwości className. W ten sposób nasz akordeon będzie działał nawet podczas testowania strony, kiedy będziemy zmieniali nazwy używanych klas: rozdzial02/wds/05 bootstrap/scripts/active.js (fragment) var sessions = document.getElementsByTagName("article"), length = sessions.length, classname = sessions[0].className; ... for (var i = 0; i < length; i += 1) { if (sessions[i].className === classname) { ...
Nie wiemy, jaka będzie faktyczna nazwa klasy używanej w elemencie, jednak wcale nie musimy jej znać — tak samo jak nie wiemy, na jakim urządzeniu użytkownik będzie przeglądał witrynę. Oczywiście przedstawiony fragment kodu JavaScript nie jest może idealnym przykładem stosowania metodologii RWD, jednak na pewno jest nim nasze ogólne dążenie do zapewniania responsywności. Rysunek 2.24 przedstawia stronę wyświetloną w oknie przeglądarki o szerokości 1440 pikseli.
Rysunek 2.24. Szerokość 1440 pikseli: punkt graniczny na stronie Speakers & Session zastosowany dzięki użyciu systemu Bootstrap
Rysunek 2.25 przedstawia tę samą stronę wyświetloną w oknie przeglądarki o szerokości 800 pikseli. Jak widać, chociaż szerokość kolumn zmienia się w zależności od szerokości okna przeglądarki, to jednak nawet w najszerszym z nich udało nam się zachować integralność całego układu. Dopracowanie układu naszej przykładowej strony może jeszcze wymagać pewnego nakładu pracy, niemniej jednak płynny układ stworzony przy użyciu systemu Bootstrap działa bez zarzutu.
PŁYNNE SIATKI
Rysunek 2.25. Efekty przekroczenia punktu granicznego 800 pikseli
Rozwiązania responsywne Przekonaliśmy się już, że płynne siatki zapewniają ogromną elastyczność i dają dodatkowe zalety, takie jak szybkość wdrażania, testowania i łatwość utrzymania kodu. Jeśli zdecydujemy się na wykorzystanie określonego systemu, będziemy mogli zatrudniać pracowników do naszego zespołu na podstawie jego znajomości i umiejętności stosowania. Jeśli tworzymy własne rozwiązania i wykorzystujemy wypróbowane systemy wyłącznie jako źródła inspiracji do tworzenia własnego kodu, to nowi członkowie zespołu także będą mogli korzystać z tej inspiracji. W ten sposób będziemy mogli szybko utworzyć strukturę aplikacji i poświęcić więcej uwagi na zaprojektowanie i zapewnienie wrażeń, które skłonią użytkowników do ponownego zaglądnięcia na naszą witrynę. Jeśli uzupełnimy płynne siatki o wykorzystanie płynnej typografii, to nasze aplikacje będą w stanie dostosowywać się do wszystkich urządzeń, na jakich będą wyświetlane — zarówno dziś, jak i w przyszłości. Teraz przyjrzymy się następnemu elementowi rozwiązania — dynamicznym obrazom, dzięki którym grafiki używane na stronach mogą mieć taki sam wpływ na strony oraz uzyskiwać podobną responsywność, jaką nadaliśmy strukturze układu oraz typografii.
65
66
Responsywne strony WWW
Rozdział
Obrazy adaptacyjne Obrazy adaptacyjne — drugi filar metodologii RWD — pozwalają nam dostarczać materiały graficzne, które nie podlegają ograniczeniom związanym z ustaloną wielkością obszaru prezentacji. Obrazy te są w stanie dostosowywać się do różnych rozmiarów obszaru prezentacyjnego oraz rozdzielczości ekranu. Stanowią próbę rozwiązania dwóch problemów, z jakimi muszą borykać się wizualne elementy stron w dobie aplikacji przeznaczonych także na urządzenia mobilne. Pierwszy z tych problemów polega na tym, że jeśli struktura witryny jest elastyczna, to tę samą cechę musi mieć także jej zawartość. W przeciwnym razie, gdy struktura będzie się zmieniać, wokół wszystkich nieelastycznych elementów będą się pojawiały puste obszary. I choć w przypadku tekstu zapewnienie takiej elastyczności jest stosunkowo proste, to jednak zupełnie inaczej wygląda sytuacja z elementami graficznymi. Każdy, kto poświęcił już trochę czasu na przycinanie obrazów w celu nadania im wymaganych wymiarów i kształtu lub próby skompresowania ich z zachowaniem optymalnej równowagi pomiędzy jakością i wielkością pliku, będzie wiedział, że pozostawienie dostosowywania wymiarów obrazów w gestii przeglądarki może doprowadzić jedynie do problemów. Drugi problem wynika z konieczności reagowania na jakość ekranów stosowanych w nowoczesnych urządzeniach. Nowoczesne urządzenia HiDPI (ang. High Dots Per Inch — w dużej liczbie pikseli na cal), takie jak urządzenia firmy Apple wyposażone w ekrany Retina lub konkurujące z nimi urządzenia z ekranami AMOLED, wyświetlają dwukrotnie więcej pikseli na cal, niż byliśmy do tego przyzwyczajeni, a dwukrotnie większa liczba pikseli oznacza dwukrotnie większą rozdzielczość. A zatem skuteczne rozwiązanie graficzne musi dysponować mechanizmem pozwalającym na wykrywanie urządzeń o zwiększonej rozdzielczości (DPI) i dostarczanie do nich odpowiednich materiałów. Potrzebujemy zatem sposobu, który pozwoliłby nam spełnić oba te wymagania — dotyczące rozmiaru i rozdzielczości materiałów graficznych — dzięki czemu będziemy mogli w większym stopniu skoncentrować się na naszych użytkownikach. Najprawdopodobniej kusi nas,
68
Responsywne strony WWW
by wymyślić jakieś jedno doskonałe rozwiązanie, jednak zanim do niego dojdziemy, spróbujemy przyjrzeć się problemowi adaptacyjnych obrazów ze wszystkich możliwych perspektyw: kodu CSS, skryptów JavaScript oraz kodu HTML; spróbujemy też określić zalety i wady każdego z tych rozwiązań. A zatem zabierzmy się do roboty, zaczynając od rozwiązania wykorzystującego arkusze stylów CSS.
Adaptacyjne arkusze stylów CSS Nasze dotychczasowe rozwiązanie pozwala dostosowywać postać układu. Teraz przekonamy się, czy arkusze stylów CSS są w stanie poradzić sobie ze zmianami rozdzielczości obrazów. Specyfikacja CSS nie udostępnia żadnego rozwiązania pozwalającego tworzyć obrazy adaptacyjne w taki sposób, by działały one w wielu przeglądarkach. Dlatego też przedstawimy najpopularniejsze eksperymentalne rozwiązanie zaproponowane przez firmę Apple — image-set. Pozwala ono określać różne obrazy tła, które będą wykorzystywane w urządzeniu zależnie od gęstości pikseli ekranu. W efekcie do urządzenia będą przesyłane obrazy, które w optymalny sposób mogą wykorzystać jego możliwości. Składnia image-set opiera się na wykorzystaniu prefiksów przeglądarek, dzięki którym do odpowiednich przeglądarek mogą być przekazywane odpowiednie wartości. Wewnątrz tej funkcji podawany jest adres URL oraz dodatkowy modyfikator, który w tym przypadku może przyjmować wartości 1x, 2x oraz 1.5x. Modyfikator ten reaguje na współczynnik gęstości pikseli na danym urządzeniu i wyświetla obraz, wykorzystując największy z dostępnych współczynników. rozdzial03/imageset/stylesheets/style.css (fragment) #set { background-image: url(../images/1_oppan.png); background-image: -webkit-image-set( url(../images/2_gangnam.png) 1x, url(../images/3 style.png) 2x ); ... background-image: image-set( url(../images/2_gangnam.png) 1x, url(../images/3_style.png) 2x ); }
Warto zauważyć, że nie tylko funkcja i jej składnia są eksperymentalne. Funkcja image-set wytycza nowe obszary związane z dodawaniem prefiksu przeglądarek za dwukropkiem (czyli do wartości podawanej w deklaracji), a nie przed dwukropkiem (czyli do nazwy właściwości). Rysunek 3.1 przedstawia efekty wykorzystania funkcji image-set w różnych przeglądarkach: Chrome, Safari, Firefox, Opera oraz Chrome uruchomionej w systemie iOS. Przeglądarki oparte na silniku WebKit obsługują funkcję z prefiksem -webkit- i tam, gdzie to możliwe, wyświetlają obraz ze współczynnikiem 2x, natomiast w przypadku urządzeń, które nie są wyposażone w ekran Retina, wyświetlany jest obraz ze współczynnikiem 1x.
OBRAZY ADAPTACYJNE
Rysunek 3.1. Zastosowanie funkcji image-set w przeglądarkach: Chrome, Safari, Firefox, Opera oraz Chrome w systemie iOS
Współczynnik pikseli jest sposobem opisu rozdzielczości ekranu urządzenia, mierzonej jako liczba punktów na cal. Określanie rozdzielczości przy użyciu punktów stało się kłopotliwe po wprowadzeniu pojęcia „pikseli CSS” określanych także jako „piksele niezależne od gęstości” (ang. Density-Independent Pixels, w skrócie: DIP). Pikseli CSS używaliśmy od wielu lat, zupełnie się nad tym nie zastanawiając, gdyż miara ta dokładnie odpowiada liczbie fizycznych pikseli na cal (DPI) na naszych urządzeniach. Drugi blok widoczny na rysunku 3.2 przedstawia sytuację, gdy współczynnik pomiędzy pikselami fizycznymi i pikselami CSS wynosi 1:1. Z kolei trzeci i czwarty blok odpowiadają przypadkom, gdy współczynnik ten wynosi odpowiednio 1,5:1 oraz 2:1. Odpowiada to możliwościom wyświetlaczy stosowanych dziś w nowoczesnych urządzeniach z systemem Android oraz urządzeniom z ekranami Retina.
Rysunek 3.2. Powiększone bloki 2×2 piksele ilustrujące współczynniki (od prawej) 2x, 1.5x oraz 1x punktów na piksel
Jak widać na rysunku 3.2, współczynnik pikseli uzyskujemy, dzieląc liczbę fizycznych pikseli (DPI) przez liczbę pikseli CSS (DIP). Na przykład 2 podzielone przez 4 daje gęstość 2x, przedstawioną z prawej strony rysunku. Warto także zauważyć, że gęstość 2x sprawia, że na tej samej powierzchni ekranu znajduje się cztery razy więcej pikseli, co w efekcie zapewnia znacznie wyraźniejszy obraz. Oczywiście wraz ze wzrostem jakości obrazu rośnie także wielkość plików. Firma Apple twierdzi, że gęstość pikseli na ekranach jej urządzeń jest tak wysoka, że oko ludzkie nie jest w stanie rozróżnić poszczególnych pikseli, oraz że taka jakość równoważy zwiększone zużycie przepustowości i większy rozmiar plików. Na rysunku 3.3 przedstawiona została ta sama strona WWW wyświetlona w przeglądarce Safari w systemie iOS6 oraz w przeglądarce Chrome na MacBooku Pro z ekranem Retina. Ze względu na to, że obie przeglądarki obsługują opisywane mechanizmy, a oba urządzenia dysponują ekranami o rozdzielczości 2x, w obu przypadkach został wyświetlony obraz style.png.
69
70
Responsywne strony WWW
Rysunek 3.3. Efekty działania funkcji image-set w przeglądarce Chrome i na ekranie Retina oraz w przeglądarce Safari uruchomionej w systemie iOS6
Ze składnią funkcji image-set spotkamy się jeszcze raz, w punkcie „W3C wybiera atrybut srcset”, niemniej jednak abyśmy nie musieli obawiać się jej stosowania, musi ona być obsługiwana przez dostatecznie wiele różnych przeglądarek (oczywiście jeśli tylko wszyscy użytkownicy naszej aplikacji nie korzystają z przeglądarek opartych na silniku WebKit). Widać jednak, że W3C stara się dążyć do rozwiązania pozwalającego na stosowanie adaptacyjnych obrazów. A teraz przekonajmy się, na co pozwala nam JavaScript.
Obrazy adaptacyjne obsługiwane skryptowo Jak widać, CSS nie zapewnia kompletnego działającego rozwiązania pozwalającego na stosowanie obrazów adaptacyjnych, niemniej jednak uzupełniając istniejące możliwości skryptami JavaScript, jesteśmy w stanie dotrzeć znacznie bliżej zamierzonego celu. Podobnie jak rozwiązanie korzystające z CSS, także i to, które opiera się na języku JavaScript, jest zależne od zmieniających się poziomów wydajności, które zazwyczaj powodują blokowanie procesu wczytywania naszej aplikacji1. Jeśli będziemy dostarczali aplikacji obraz dostosowany do możliwości używanego urządzenia, lecz będzie się to odbywać kosztem wrażeń użytkownika lub wydajności działania strony, to bez wątpienia nie będzie to właściwe rozwiązanie. A zatem naszym celem jest rozwiązanie, którego można używać na wielu różnych serwerach i które jest tak mało intruzyjne, że pozwoli nam skupić się na użytkownikach aplikacji. Doskonałym przykładem takiego rozwiązania jest skrypt Picturefill2 autorstwa Scotta Jehla. Skrypt ten należy do grupy narzędzi nazywanych polyfill. Rozwiązania tego typu określają różnice pomiędzy specyfikacją a możliwościami przeglądarki i poszukują sposobów na ich zniwelowanie. Pozwalają nam stosować najnowsze technologie w przeglądarkach, które zazwyczaj nie dysponują niezbędnymi możliwościami. Przykład zastosowania takiego rozwiązania przedstawiliśmy na rysunku 3.4. W przypadku użycia skryptu Picturefill jego twórca pozwala eksperymentować z elementem picture, który poznamy już niebawem. Aby skorzystać ze skryptu Picturefill, należy dodać do sekcji head strony mały plik o wielkości 0,5 KB, który przegląda DOM w poszukiwaniu określonego wzorca. Działanie skryptu
1
http://www.stevesouders.com/blog/2009/04/27/loading-scripts-without-blocking/.
2
https://github.com/scottjehl/picturefill.
OBRAZY ADAPTACYJNE
Rysunek 3.4. Dobór wielkości obrazu w zależności od kontekstu przy wykorzystaniu skryptu Picturefill
rozpoczyna się po odnalezieniu elementu div z atrybutem data-picture. Kiedy taki element zostanie znaleziony, skrypt analizuje jego elementy podrzędne, traktując je jako źródła alternatywne. Źródła te zostają następnie użyte zależnie od podanych zapytań medialnych, dostarczając obrazy, które są optymalnie dostosowane do używanego urządzenia. Przykładowy kod HTML takiego rozwiązania został podany w repozytorium Git Scotta Jehla:
W powyższym rozwiązaniu, zamiast elementów picture oraz source (przyjrzymy się im nieco później), które nie są obsługiwane przez wszystkie przeglądarki, oraz elementów img (w ich przypadku przeglądarki starają się od razu pobierać wskazany obraz), zostały zastosowane elementy div. Poprzez unikanie stosowania nieobsługiwanych elementów
71
72
Responsywne strony WWW
skrypt Picturefill nie wywiera negatywnego wpływu na wydajność 3 działania związanego z koniecznością uczenia przeglądarki, jak mają być traktowane nowe elementy. Dzięki temu, że nieużywane obrazy nie będą pobierane, skrypt jest w stanie zapewnić takie wykorzystanie przepustowości, jakie mielibyśmy, gdyby przeglądarki potrafiły same obsługiwać adaptacyjne obrazy. Atrybuty data-media określają warunki wykorzystania źródła podanego w atrybucie data-src; źródło to będzie następnie podane w elemencie img, który zostanie utworzony i wstawiony do struktury DOM. Oczywiście rozwiązanie to zakłada, że w przeglądarce użytkownika jest włączona obsługa języka JavaScript. Jeśli JavaScript nie będzie obsługiwany, to przeglądarka wyświetli obraz umieszczony w elemencie noscript. Jak zatem widać, zapewnienie prawidłowego działania w razie problemów zostało dokładnie przemyślane, podobnie jak inne cechy skryptu Picturefill. Picturefill jest skryptem typu polyfill, dlatego nigdy nie miał się stać ostatecznym rozwiązaniem problemów dotyczących używania obrazów adaptacyjnych. Miał on jedynie ułatwić programistom stosowanie eksperymentalnego wzorca, tak by mogli okazać mu swoje wsparcie. W idealnym przypadku rozwiązania typu polyfill pozwalają nam już dziś stosować kod, który w przyszłości będzie kompleksowo obsługiwany przez wbudowane możliwości przeglądarek, dzięki czemu stosowanie takich dodatkowych rozwiązań stanie się niepotrzebne. I chociaż język JavaScript pozwala nam przesuwać granice możliwości wykorzystania przeglądarek, to jednak kiedy zaczną się pojawiać inne technologie, będziemy mogli nieco zmniejszyć nasze uzależnienie od niego. Rozwiązania skryptowe, podobnie jak i te opierające się wyłącznie na CSS, kiedyś zostaną zastąpione przez rozwiązania działające spójnie w wielu przeglądarkach i obsługiwane przez ich wbudowane możliwości. A technologią, która ma na to pozwolić, jest HTML5. Język HTML5 potrzebował „rozwiązania znacznikowego zapewniającego możliwość dostarczania różnych źródeł obrazów, w zależności od cech urządzenia, pozwalając tym samym na unikanie marnowania przepustowości i optymalizację materiałów prezentowanych na ekranach oraz przeznaczonych do druku”4. Przekonajmy się zatem, w jaki sposób HTML5 jest w stanie pomóc nam w stosowaniu adaptacyjnych obrazów.
Adaptacyjne rozwiązanie w języku HTML5 Przez znaczną część 2012 roku środowisko twórców stron WWW z zapartym tchem śledziło dwie propozycje walczące pomiędzy sobą o zdominowanie sposobu, w jaki w języku HTML5 będą obsługiwane obrazy adaptacyjne. Jednym z popularnych celów języka HTML5 była próba skodyfikowania popularnych i szeroko stosowanych technik. W efekcie obecnie w HTML5 dysponujemy elementami nav, section oraz aside, gdyż na bardzo wielu stronach 3
http://www.w3.org/community/respimg/2012/03/15/polyfilling-picture-without-the-overhead/.
4
http://www.w3.org/community/respimg/.
OBRAZY ADAPTACYJNE
można było znaleźć elementy o takich identyfikatorach. Takie podejście w zasadzie sprawdziło się zarówno w przypadku WHATWG, jak i W3C. Problemy pojawiały się jednak wtedy, gdy w taki sposób próbowano implementować eksperymentalne rozwiązania lub rzadko używane techniki, dla których nie było wielu przykładów zastosowania. Jak już się przekonaliśmy, jednym z rozwiązań, które dopiero należało opracować, były obrazy adaptacyjne. Wymagały one od WHATWG oraz W3C wytyczenia nowych kierunków, bez opierania się na istniejących narzędziach sprawdzonych techniką prób i błędów — musiały być pionierskie. Środowisko związane ze standardami internetowymi paliło się do pomocy. Opracowało rozwiązanie, które mogło zostać przyjęte, i powołało grupę roboczą Responsive Images Community Group (RICG); jej stronę WWW przedstawiliśmy na rysunku 3.5. Grupa RICG zaproponowała rozwiązanie oparte na wzorcach i elementach już istniejących w języku HTML5.
Rysunek 3.5. Oficjalna strona grupy RICG
Siłę i wartość tego rozwiązania dodatkowo wzmacnia fakt, że Bruce Lawson, gorący propagator standardów internetowych pracujący w zespole zajmującym się rozwojem przeglądarki Opera, zupełnie niezależnie w tym samym czasie zaproponował takie samo rozwiązanie5. Obie grupy zasugerowały zastosowanie elementu picture z dodatkowymi elementami podrzędnymi wskazującymi źródła obrazów, które byłyby stosowane dla określonych urządzeń docelowych. Przedstawiony wcześniej skrypt Picturefill w założeniu miał operować właśnie na elementach picture. Jednak grupa robocza WHATWG przegapiła propozycję RICG i w specyfikacji pojawiło się zupełnie inne rozwiązanie. Efekt całkowicie sparaliżował społeczność twórców i projektantów stron WWW: zwolennicy twórców przeglądarek (takich jak firma Apple) starli się z osobami optującymi za innym rozwiązaniem, które według nich jest najlepsze.
5
http://html5doctor.com/html5-adaptive-images-end-of-round-one/.
73
74
Responsywne strony WWW
W3C wybiera atrybut srcset W projekcie WHATWG zamiast nowego elementu picture pojawił się nowy atrybut elementu img — srcset. Ze względu na wsparcie ze strony firmy Apple oraz pozostałych twórców przeglądarek Ian Hickson z WHATWG zdecydował się opowiedzieć po stronie rozwiązania, które miało większe szanse trafić do przeglądarek:
Atrybut srcset jest oparty na przedstawionej wcześniej metodzie image-set, a zaproponował go Ted O’Connor z firmy Apple. Rozwiązanie adaptacyjnych obrazów zostało przyjęte, lecz zupełnie ignorowało wkład wniesiony przez grupę RICG. Wartością tego nowego atrybutu jest lista łańcuchów alternatywnych obrazów, oddzielonych od siebie przecinkami. Każdy z tych łańcuchów zawiera źródło obrazu oraz maksymalnie trzy deskryptory6. Deskryptory łączą się ze sobą, tworząc identyfikatory urządzeń docelowych. W powyższym przykładzie pierwszy z alternatywnych obrazów zaleca zastosowanie pliku large.png na urządzeniach, których ekran ma przynajmniej 600 pikseli szerokości, 200 pikseli wysokości i gęstość 1x. Opinie na temat atrybutu srcset są podzielone. Liczne osoby twierdziły, że pokazał on tę stronę procesu tworzenia HTML5, której lepiej było nie ujawniać7. Inne uznały, że sam wzorzec rozwiązania jest mniej solidny od wzorca elementu picture zaproponowanego przez RICG. Choć wielu wyrażało się o tej decyzji z pogardą, inni podeszli do swoich analiz bardziej pragmatycznie8. Hickson zastosował rozwiązanie, które opierało się na dobrze przetestowanej funkcji image-set i które mogli przyjąć producenci przeglądarek, a nie to bardziej popularne wśród twórców stron. Można by sympatyzować z RICG i krzywić się, patrząc na postać atrybutu srcset, jednak takie podejście nie pomogłoby nam lepiej zrozumieć tego rozwiązania. Przeanalizujmy jeszcze raz poprzedni przykład (z którego tym razem usunęliśmy zbędne formatowanie): obrazek przedstawiający logo jest udostępniany w wersjach dla ekranów o dwóch gęstościach oraz w dodatkowej wersji dla urządzeń z małymi ekranami:
Możemy uprościć go jeszcze bardziej: 6 7 8
http://www.w3.org/html/wg/drafts/srcset/w3c-srcset/#image-candidate-strings. http://adactio.com/journal/5474/. http://cssquirrel.com/comic/?comic=97.
76
Responsywne strony WWW
Grupa RICG uznała ten wymóg za jeden z problemów związanych z atrybutem srcset. W standardzie HTML5 bardzo dużą wagę przykłada się do upraszczania kodu znacznikowego aplikacji, a atrybut srcset stanowił wyraźne odstępstwo od tej zasady. Zamiast ułatwiać analizę i zrozumienie kodu, proponowane rozwiązanie korzystało z nowej składni i nowych reguł. Bez implementacji tego atrybutu w przeglądarkach było to jak wpływanie na nieznane wody9. W jakim stopniu nieznane? 28 grudnia 2012 roku organizacja W3C opublikowała wstępny szkic dotyczący rozszerzenia srcset10. Choć stanowi on wspaniałe źródło informacji dla twórców przeglądarek, to wykorzystanie go w innych celach może być problematyczne. Niemniej jednak, zważywszy na to, że od maja (kiedy to zaprezentowano atrybut srcset) do grudnia (kiedy to adaptacyjne obrazy zostały dołączone do bieżącego standardu grupy WHATWG — WHATWG Living Standard) musieliśmy w znacznej mierze opierać się na informacjach publikowanych na liście dyskusyjnej Hicksona11, to i tak kierunek rozwoju stał się znacznie wyraźniejszy. Wyraźniejszy przynajmniej pod tym względem, że wiemy, w jaki sposób przeglądarki powinny implementować 35-etapową procedurę służącą do określania, który z alternatywnych obrazów należy zastosować. Zobaczmy, co możemy zrobić, by tę procedurę nieco uprościć. Przeglądarki będą musiały wykonać wszystkie te czynności, jednak ludziom określenie jej wyniku powinno pójść nieco łatwiej. Zanim zaczniemy, całą wartość atrybutu srcset należy podzielić na fragmenty oddzielone od siebie przecinkami, a każdy z tych fragmentów staje się „kandydatem” — jednym z alternatywnych źródeł obrazu. Teraz określenie, którego z tych źródeł należy użyć, będzie wymagało sprawdzenia czterech warunków. 1. Pierwszym z nich jest sprawdzenie, czy istnieje jakieś źródło, w którym podano właściwość width — liczbę dodatnią zakończoną literą „w”, określającą szerokość obrazu. Właśnie tę właściwość zawsze należy sprawdzać w pierwszej kolejności. Jeśli została ona podana, to należy wybrać największą jej wartość, a wszystkie pozostałe wartości odrzucić. Jeśli przeglądarka nie jest w stanie wyświetlić obrazu o tej największej szerokości, to należy ją odrzucić i znaleźć obraz o największej szerokości, który będzie można wyświetlić, a wszystkie inne szerokości — zarówno mniejsze, jak i większe — należy odrzucić. 2. Następnie należy sprawdzić, czy którekolwiek z alternatywnych źródeł określa jakieś wymogi związane z wysokością obrazu. Są one podawane przy użyciu właściwości height — liczby dodatniej zakończonej literą „h”. Tę właściwość zawsze należy sprawdzać w drugiej kolejności. Jeśli została ona określona i jeśli przeglądarka jest w stanie wyświetlić obraz o największej podanej wysokości, to wszystkie pozostałe źródła o mniejszych wysokościach należy odrzucić. Jeśli obraz o największej wysokości nie może zostać wyświetlony, to odrzucamy go, znajdujemy największą wysokość, jaką 9
http://blog.cloudfour.com/the-real-conflict-behind-picture-and-srcset/.
10
http://www.w3.org/html/wg/drafts/srcset/w3c-srcset/.
11
http://lists.w3.org/Archives/Public/public-whatwg-archive/2012May/0247.html.
OBRAZY ADAPTACYJNE
przeglądarka może wyświetlić, i odrzucamy wszystkie inne źródła, w których podana wysokość jest mniejsza lub większa. 3. Następnie spośród pozostałych źródeł wybieramy to, w którym została podana największa gęstość pikseli — liczba dodatnia zakończona literą „x”. Jeśli uda się taką znaleźć i jeśli przeglądarka jest w stanie wyświetlać obrazy o takiej gęstości, to odrzucamy wszystkie inne źródła, w których podana gęstość jest mniejsza. Jeśli jednak obrazu o podanej gęstości nie można wyświetlić, to znajdujemy największą gęstość, jaka może być użyta, a wszystkie pozostałe gęstości — zarówno mniejsze, jak i większe — odrzucamy. 4. Jeśli nie określono wymogów dotyczących szerokości i wysokości, to wszystkie te testy można pominąć. Jeśli nie została także określona wymagana gęstość, to przyjmujemy, że należy użyć gęstości 1x. Po wykonaniu powyższej procedury powinniśmy uzyskać jedno źródło, i to właśnie obraz określany przez nie należy wyświetlić. To takie proste. Może się też okazać, że uzyskamy dwa lub więcej źródeł, jeśli określają one identyczne wymagania, niemniej nie należy tworzyć kodu, który dopuszczałby do takich sytuacji. Gdyby się jednak tak zdarzyło, to przeglądarka powinna zastosować pierwsze odszukane źródło. To prawda, że zwykle zachowywane są ostatnie dane dla tego samego identyfikatora, więc kaskada stylów działa w taki sposób, że wykorzystywana jest ostatnia deklaracja lub właściwość, jednak w przypadku atrybutu srcset dzieje się dokładnie na odwrót. W każdym razie tak napisano w specyfikacji. Wciąż musimy się przekonać, co zrobią twórcy przeglądarek, chociaż specyfikacja, pomimo trochę przydługiego opisu, nie pozostawia żadnych niejasności. Jesteśmy przekonani, że po skróceniu procedury opisanej w specyfikacji z 35 do 5 etapów każdy twórca stron godny tego miana będzie w stanie zrozumieć składnię atrybutu srcset, choć przyzwyczajenie się do niej może trochę potrwać. Oprócz atrybutu image-set, który także pochodzi od firmy Apple, srcset wprowadza wyjątkową składnię oraz całkowicie obce wzorce jednostek i wydaje się zbyt podatny na błędy. Z pewnością jednak do niego przywykniemy. Jednak potencjalne błędy, z jakimi mogłoby się wiązać stosowanie atrybutu srcset, mogą się okazać poważnym problemem. Programiści i twórcy stron WWW popełniają błędy. Język HTML4 pozwalał na popełnianie takich błędów — były one wręcz w niego wkalkulowane. HTML5 ze wszystkich sił stara się popełnianie błędów utrudniać. Jak widać, atrybut srcset wprowadził przecinki, litery i składnię, która nie jest zbyt elastyczna. Jednak chcąc go stosować, nie mamy większego wyboru. Co gorsze, wszelkie błędy w składni tego atrybutu mogą dawać dziwne efekty:
77
78
Responsywne strony WWW
Przecinek błędnie dodany przed 2x oznacza, że pojawiło się dodatkowe źródło. To tylko jeden przecinek, błąd, który bardzo łatwo można popełnić, niemniej jednak brak elastyczności atrybutu srcset znacznie zwiększa prawdopodobieństwo występowania błędów tego typu. W powyższym przykładzie ten dodatkowy przecinek oznacza, że mamy nowe źródło, w którym nie określono nazwy pliku, nie podano szerokości ani wysokości, a jedynie gęstość pikseli. W idealnym przypadku przeglądarka powinna takie źródło odrzucić. Jeśli prawidłowo dopasuje wymogi dotyczące minimalnej szerokości i wysokości — 600w i 200h — to powinna wybrać plik large.png, ponieważ jest on pierwszym źródłem spełniającym kryteria, i odrzucić drugi plik: large_2x-res.png. Trzeba jednak pamiętać, że obsługa atrybutu srcset nie została jeszcze zaimplementowana, więc wciąż musimy poczekać, by przekonać się, jak w praktyce będą działały przeglądarki. Na szczęście specyfikacja została opublikowana, więc sytuacja wkrótce powinna ulec zmianie.
Brakujący element picture Przyjrzyjmy się teraz drugiemu rozwiązaniu adaptacyjnych obrazów, któremu prawie udało się trafić do przeglądarek. Grupa RICG twierdzi, że proponowany przez nią element picture był zgodny z istniejącą składnią elementów zalecaną przez W3C, a jego składnia (przedstawiona poniżej) była łatwa do zrozumienia:
Element picture działa tak samo jak video, należący do standardu HTML5, a w razie problemów używany jest umieszczany wewnątrz niego element img. Jeśli przeglądarka nie rozpoznaje elementu picture, zignoruje go i przejdzie do elementów umieszczonych wewnątrz niego. Jeśli nie rozpozna elementów source — a właśnie tak się stanie w przypadku starszych przeglądarek — dotrze w końcu do elementu img i go wyświetli. Element picture zapewniałby także zgodność wstecz i mógłby być obsługiwany przy użyciu metod analizy elementów obecnie stosowanych przez przeglądarki. Gdyby przeglądarka była w stanie rozpoznać element picture oraz umieszczane wewnątrz niego elementy source, to rozpoznawałaby także parametr media. Pochodzi on bowiem bezpośrednio ze specyfikacji elementu video12 (wygląda na to, że opracowując element picture, starano się, by powodował jak najmniej problemów). Z łatwością rozpoznamy także wartości atrybutu media — są nimi zapytania medialne, stanowiące trzeci filar metodologii RWD. 12
http://html5.org/r/724.
OBRAZY ADAPTACYJNE
Warto wiedzieć, że nasze przeglądarki ekscytują się zapytaniami medialnymi jeszcze bardziej niż my sami, o czym przekonamy się w rozdziale 4. Mówiąc krótko: przeglądarka sprawdza wartości atrybutów media i gdy znajdzie taką, która odpowiada cechom ekranu, wykorzysta wartość atrybutu src jako źródło wyświetlanego obrazu. Członkowie grupy RICG sądzili, że udało się im coś osiągnąć. Zaproponowali elastyczne, kompletne i czytelne rozwiązanie problemu dostarczania do urządzeń zestawów zasobów graficznych, rozwiązanie spełniające wymagania nowoczesnych projektantów. Udało im się to uzyskać, korzystając z elementów konstrukcyjnych dostarczonych przez W3C, a efekt mógł budzić zadowolenie. I faktycznie, ekipa RICG cieszyła się… aż do chwili, gdy okazało się, że WHATWG całkowicie zignorowała ich propozycję.
Adaptacja przykładowej strony Adaptacyjne obrazy czeka jeszcze długa i wyboista droga. Choć atrybut srcset trafił do propozycji W3C, to dokument ten ostrzega, że „twórcy przeglądarek powinni pamiętać, że ta specyfikacja nie jest ostateczna”. Ostrzeżenie to jest skierowane do twórców przeglądarek i nie powinno nas powstrzymywać przed stosowaniem atrybutu srcset, choć powinniśmy zachować ostrożność. Najlepszym, co możemy zrobić, jest skorzystanie ze ścieżki wytyczonej przez W3C, używając przy tym możliwie jak najmniej kodu. Pomimo wsparcia ze strony firmy Apple, nawet przeglądarka Safari nie obsługuje jeszcze atrybutu srcset, dlatego też trzeba będzie odpowiednio uzupełnić jej możliwości, podobnie jak zrobiliśmy to wcześniej, przedstawiając skryptowe rozwiązanie typu polyfill. Aby zwiększyć szanse działania naszego kodu w przyszłości, gdy stosowanie skryptów typu polyfill nie będzie już konieczne, musimy zapewnić, że będzie on korzystał wyłącznie z elementów i składni o odpowiednim znaczeniu, czyli inaczej niż skrypt Picturefill. Dzięki temu znacznie łatwiej będzie nam usunąć dodatkowe skrypty i lepiej zrozumiemy działanie atrybutu, kiedy zostanie on już zaimplementowany. Ponownie przyjrzyjmy się naszej przykładowej stronie Web Directions South, przedstawionej na rysunku 3.6, i spróbujmy użyć atrybutu srcset do wyświetlania zdjęć poszczególnych prelegentów. Aby ułatwić sobie przezwyciężenie ograniczeń przeglądarek, wykorzystamy projekt srcset-polyfill13 Borisa Smusa, który to projekt podmienia pudełka elementów na urządzeniach z mniejszymi ekranami, zmniejszając przez to zużycie przepustowości; jednocześnie skrypt ten korzysta z kodu odpowiadającego proponowanej specyfikacji HTML5. Wykorzystanie skryptu srcset-polyfill jest tak proste, jak moglibyśmy sobie tego życzyć. Sprowadza się do zastosowania nowej składni opisanej w propozycji standardu HTML5 i umieszczeniu w sekcji nagłówka strony odwołania do odpowiedniego pliku JavaScript.
13
http://github.com/borismus/srcset-polyfill.
79
80
Responsywne strony WWW
Rysunek 3.6. Zdjęcia prelegentów
Im wcześniej w dokumencie dodamy odwołanie do skryptu, tym szybciej zacznie on operować na obrazach, jednak wybierając miejsce, w którym go umieścimy, należy pamiętać o zachowaniu równowagi z innymi plikami używanymi na stronie. rozdzial03/wds/06 srcset/index.html (fragment)
Przy pewnej dozie szczęścia może się okazać, że zmiany, jakie trzeba wprowadzić w kodzie HTML, będą bardzo nieznaczne. W naszej przykładowej stronie Web Directions South musimy jedynie usunąć atrybuty width oraz height umieszczone w elementach img. Okazuje się, że skrypt potrzebuje określenia szerokości w przeglądarkach, które nie są oparte na silniku WebKit (choć w przyszłości sytuacja ta może ulec zmianie), a modyfikowanie właściwości CSS w zewnętrznym arkuszu stylów jest znacznie wygodniejszym rozwiązaniem. Oto fragment kodu faktycznie używany na witrynie Web Directions South: ...
A oto wyjściowy kod, do którego dodamy atrybut srcset:
OBRAZY ADAPTACYJNE rozdzial03/wds/06 srcset/index.html (fragment) ...
Pozostaje nam jedynie dodać atrybut, posługując się przy tym składnią ze specyfikacji i podając w nim alternatywne obrazy oraz ich deskryptory: rozdzial03/wds/06_srcset/index.html (fragment) srcset="graphics/speaker/c_sharkie_2hd.png 2x" ...
Jak widać na rysunku 3.7, do kodu dodaliśmy tylko jedno źródło alternatywne. Spowoduje ono zmianę obrazu wyświetlanego na urządzeniach, które są w stanie prezentować obrazy o podwójnej gęstości. Gdybyśmy dodatkowo chcieli reagować na dostępną wielkość ekranu, to nic nie stoi na przeszkodzie — wystarczyłoby dodać deskryptor określający szerokość, wysokość lub oba te wymiary. I to wszystko — całą resztę zrobi za nas skrypt.
Rysunek 3.7. Zdjęcia prelegentów po zastosowaniu skryptu srcset-polyfill
Ze względu na to, że posługujemy się obrazami o wyższej gęstości, powiększyliśmy ich wymiary; w końcu prelegenci są całkiem czarujący, stanowi to zatem także dodatkowy efekt. Uwydatnia to również pewien aspekt aktualnej wersji skryptu srcset-polyfill. Skrypt odczytuje deskryptor, a następnie dodaje do znacznika HTML właściwość style CSS3:
81
82
Responsywne strony WWW
Skoro do właściwości jest dodawany prefiks przeglądarki, nie będzie ona miała żadnego wpływu na postać zdjęcia prezentowanego na przykład w przeglądarce Firefox:
Takie rozwiązanie jest w porządku, jeśli zdjęcie, które chcemy wyświetlić przy użyciu atrybutu srcset (jak zostało to przedstawione na rysunku 3.8), jest w rzeczywistości dwukrotnie większe od zdjęcia, które pojawi się na stronie. Jeśli nasze zdjęcie o podwójnej gęstości jest większe wyłącznie pod względem rozdzielczości, gdyż zostało zapisane z wyższym współczynnikiem kompresji, to konieczne będzie wprowadzenie do wyników działania skryptu srcset-polyfill pewnych korekt.
Rysunek 3.8. Jedno ze zdjęć prelegentów ze strony WDS w wersjach pobranych przez urządzenia o gęstości 1x oraz 2x
W przeglądarkach opartych na silniku WebKit należy także przywrócić obraz do jego początkowych wymiarów. Zrobimy to, używając zapytania medialnego korzystającego z właściwości dostępnej wyłącznie w tym silniku. Lepiej nie przyzwyczajać się do takich rozwiązań, jednak póki możliwości przeglądarek trzeba uzupełniać skryptami JavaScript, niestety nie unikniemy konieczności ich stosowania. Uzyskane wyniki są tak bliskie efektom, jakie będą zapewniały przeglądarki obsługujące adaptacyjne rysunki, jak to tylko możliwe. Dzięki zastosowaniu niewielkiego skryptu JavaScript i arkusza stylów CSS wpływ na szybkość wyświetlania strony jest możliwie mały, a kiedy przeglądarki w końcu zaczną obsługiwać atrybut srcset, to nawet ten niewielki dodatkowy kod będzie można stopniowo usuwać.
OBRAZY ADAPTACYJNE
Zrozumieć sytuację Jeśli chodzi o standaryzację jednego rozwiązania implementującego obsługę adaptacyjnych obrazów w wielu przeglądarkach, to wciąż jesteśmy jeszcze w lesie. Dotyczy to nawet tych przeglądarek, które zapewniają największą zgodność ze standardami. Wiemy jednak, że po udostępnieniu propozycji specyfikacji twórcy przeglądarek mogą zacząć implementować atrybut srcset, a co za tym idzie, można się spodziewać, że będzie on obsługiwany w coraz to większym stopniu. Tymczasem możemy cieszyć się z faktu, że jesteśmy świadkami procesu standaryzacji i że bierzemy w nim udział. Od naszego wsparcia — lub jego braku — może zależeć to, czy atrybut srcset faktycznie trafi do języka HTML5. Na razie możemy korzystać z wielu technik opartych na CSS, języku JavaScript oraz kodzie HTML, zapewniających niezawodne rozwiązania problemu dostarczania obrazów dostosowanych do możliwości urządzeń, na których są wyświetlane nasze strony. Możemy także uzyskiwać jeszcze lepsze efekty, korzystając w tym celu ze skryptów typu polyfill — i to niezależnie od tego, czy preferujemy stosowanie atrybutu srcset, czy elementu picture. Kto wie, jeśli W3C zauważy, że element picture cieszy się dostatecznie dużą popularnością, może się zdarzyć, że to właśnie on trafi do specyfikacji HTML5.
83
84
Responsywne strony WWW
Rozdział
Zrozumieć zapytania medialne Zapytania medialne są trzecim filarem metodologii RWD i stanowią rozszerzenie języka HTML5 pozwalające, by na dostarczanie arkuszy CSS do konkretnego urządzenia miały wpływ cechy jego ekranu, zgodnie z definicją zawartą w specyfikacji modułu CSS31. Innymi słowy: istnieje możliwość wykrycia, że strona jest wyświetlana na urządzeniu przenośnym z ekranem o szerokości 320 pikseli i działającym w układzie poziomym, i dostarczenia do niej innego arkusza stylów niż do tej samej strony wyświetlanej na komputerze stacjonarnym z ekranem o obszarze prezentacyjnym o szerokości 1024 pikseli. Tradycyjnie różnice w stylach ograniczałyby się jedynie do innego układu, tła oraz obrazów, jednak w rzeczywistości istnieje możliwość dostarczenia całkowicie odrębnego zestawu stylów. Arkusze stylów określane na podstawie zapytań medialnych mogą być podawane na trzy sposoby, podobnie jak w przypadku typów mediów. Po pierwsze, przy użyciu elementu link języków HTML i XHTML:
Po drugie, przy użyciu kodu XML:
Ostatnim sposobem jest użycie reguł @import w arkuszach stylów: @import url("/style.css") all and (color);
1
http://www.w3.org/TR/css3-mediaqueries/.
86
Responsywne strony WWW
lub reguł @media: @media all and (color) { /* jeden lub kilka zestawów reguł... */ }
Także w tym przypadku metodologia RWD udostępnia nam narzędzia do tworzenia prostych rozwiązań umożliwiających budowanie niezawodnych układów. Zapewnia również możliwość skoncentrowania uwagi na treści i na zachęceniu użytkowników do ponownego skorzystania z aplikacji. Jak wyraźnie widać na rysunku 4.1, nowoczesne urządzenia mają bardzo różne możliwości oraz wymagania związane z wykorzystywanymi materiałami i stylami. Na szczęście składnia zapytań medialnych jest bardzo prosta, jak również powszechnie obsługiwana i stosowana — w rzeczywistości pojawiła się już w każdym rozdziale tej książki!
Rysunek 4.1. Różne obrazy na docelowych urządzeniach
Zazwyczaj staramy się ograniczać style CSS dostarczane do każdego z urządzeń docelowych. Zaczynając od stylów używanych zawsze, dochodzimy do tych, które są przeznaczone dla konkretnych urządzeń. Niemniej jednak nie tylko same style są dostosowywane do urządzeń — to samo dotyczy także materiałów używanych i dostarczanych przez te style. Rysunek 4.2 pokazuje, że jeśli do naszego urządzenia z ekranem o szerokości 320 pikseli (pokazanego na rysunku 4.1) przekażemy tło o szerokości 1920 pikseli, to wyślemy do niego obraz 14 razy większy niż to konieczne. Takiego niepotrzebnego marnowania przepustowości i obciążenia aplikacji można całkiem łatwo uniknąć.
ZROZUMIEĆ ZAPYTANIA MEDIALNE
Rysunek 4.2. Nasz mały obraz mieści się w dużym obrazie około 14 razy
Przyjrzyjmy się zapytaniu medialnemu stworzonemu z myślą o telefonie iPhone 5: @media only screen and (min-device-width: 640px) and (max-device-width: 1136px) and (-webkit-min-device-pixel-ratio: 2) { /* tylko dla iPhone’a 5... przynajmniej na razie */ }
Teraz przynajmniej składnia ta nie wygląda już zupełnie obco. Cechę device-width widzieliśmy już w elemencie meta viewport, a device-pixel-ratio — w adaptacyjnych obrazach tworzonych przy użyciu elementu picture. Gdyby tego było mało, zapytania medialne są kuzynami typów mediów wprowadzonych w maju 1998 roku jako jeden z elementów rekomendacji CSS 2.02.
Poznawanie możliwości zapytań medialnych Zapytania medialne zapewniają całkiem sporo możliwości, nawet jeśli będziemy się posługiwali wyłącznie cechą device-width. Trzeba jednak pamiętać o tym, że można sprawdzać także inne cechy, a nie jedynie szerokość ekranu urządzenia. Obecnie specyfikacja3 wymienia
2
http://www.w3.org/TR/2008/REC-CSS2-20080411/.
3
http://www.w3.org/TR/css3-mediaqueries/#contents.
87
88
Responsywne strony WWW
13 takich cech: width, height, device-width, device-height, orientation, aspect-ratio, device-aspect-ratio, color, color-index, monochrome, resolution, scan oraz grid. Mogą one, z wyjątkiem orientation, scan oraz grid, być także poprzedzane prefiksami min- oraz max-. Poziom kontroli, jaki zapewniają nam zapytania medialne, jest inspirujący, choć jednocześnie budzi respekt! Jeśli wciąż jesteśmy pełni szacunku dla liczby możliwości, jakie na nas czekają, to musimy zdać sobie sprawę z tego, że zapytania medialne są kontrolowane przez CSS, a twórcy przeglądarek mogą dodawać do tej listy nowe możliwości, poprzedzając je odpowiednimi prefiksami — przykładem jest cecha -webkit-device-min-pixel-ratio stanowiąca dodatek wprowadzony przez firmę Apple i umożliwiająca tworzenie stylów przeznaczonych dla urządzeń z ekranami Retina. Trzeba także pamiętać, że oprócz prefiksu -webkit- jest także wiele innych, których można używać. Oto kilka przykładów: @media only screen and (-webkit-min-device-pixel-ratio: 2) and (min-width: 320px), only screen and (min—moz-device-pixel-ratio: 2) and (min-width: 320px), only screen and (-o-min-device-pixel-ratio: 2/1) and (min-width: 320px), only screen and (min-device-pixel-ratio: 2) and (min-width: 320px) { /* style dla małych ekranów Retina lub AMOLED */ }
Podobnie jak w przypadku standardowych prefiksów przeglądarek, także i tutaj ostatnia właściwość nie ma żadnego prefiksu — została ona podana w nadziei, że kiedyś prefiksy te nie będą potrzebne i do określenia docelowej grupy urządzeń wystarczy sama właściwość. Dawno już minęły czasy, gdy rozwiązaniem wszelkich problemów było używanie typu handheld. Obecnie trzeba uwzględniać i stosować wszystkie możliwe sposoby określania urządzeń docelowych oraz uważnie planować budżet dostępny na stworzenie projektu i samej aplikacji. Zważywszy na ciągłą tendencję do stosowania przesadnie szczegółowych zapytań medialnych, analiza ta staje się coraz to bardziej złożona i trudna. Równocześnie z wprowadzeniem na rynek telefonu iPhone 5 z systemem iOS6 pojawiła się nowa grupa urządzeń, których ekrany mają dodatkowe 176 pikseli wysokości. Jednak jest raczej mało prawdopodobne, byśmy starali się tworzyć style przeznaczone dla tych urządzeń, stosując zapytania max-device-height: 960px. W takim przypadku pominęlibyśmy bowiem wszystkie telefony iPhone 5S. Przyjrzyjmy się przykładowi przedstawionemu na rysunku 4.3. To prawda, że dziś możemy odróżniać telefony iPhone 5 od ich poprzedników, używając w tym celu cechy device-height, jednak trzeba by też uwzględnić zagrożenie, że stopka, tak skrupulatnie umieszczona na samym dole ekranu iPhone’a 4S i wcześniejszych modeli tego telefonu, teraz znajdzie się 176 pikseli powyżej dolnej krawędzi ekranu. Oprócz tego skoro iPhone 5 zyskał dodatkowe 176 pikseli wysokości ekranu, to czego możemy oczekiwać po jego kolejnej generacji? Albo po jej następcach? Trzeba wciąż pamiętać o tym, co jest
ZROZUMIEĆ ZAPYTANIA MEDIALNE
Rysunek 4.3. Porównanie wielkości ekranów telefonów iPhone 4 oraz iPhone 5
naszym celem — zaufanie, że nasze style będą działać na wszystkich urządzeniach: zarówno tych obecnych, jak i przyszłych, i to bez konieczności przepisywania kodu dla każdej nowej wielkości ekranów. W takim razie warto rzucić okiem na składnię używaną do wybierania różnych cech. Lista zapytań medialnych jest łańcuchem znaków, którego fragmenty są od siebie oddzielone przecinkami i który zawiera serię zapytań medialnych precyzyjnie określających cechy docelowego urządzenia:
Jeśli przynajmniej jedno zapytanie umieszczone na tej liście będzie prawdziwe, to przyjmuje się, że cała lista będzie prawdziwa, a wszystkie spełnione cechy zostaną uwzględnione. Na przykład jeśli na liście takiej jak "screen and (color), projection and (color)" zapytanie "screen and (color)" będzie prawdziwe, to także cała lista zostanie uznana za prawdziwą. Przecinki oddzielające poszczególne zapytania medialne odpowiadają logicznej alternatywie (OR), a każde zapytanie może używać słowa kluczowego AND reprezentującego logiczną koniunkcję. Aby zapytanie z logiczną alternatywą zostało spełnione, musi być dostępna którakolwiek z wymienionych cech, natomiast w przypadku użycia logicznej koniunkcji muszą być dostępne wszystkie wymienione cechy. Poprzednie zapytanie zadziała w sytuacji, gdy aplikacja zostanie uruchomiona na ekranie lub projektorze zdolnym do wyświetlania obrazów w kolorze. Jeśli używane urządzenie spełnia te kryteria, to zostanie zastosowany arkusz stylów podany w elemencie link.
89
90
Responsywne strony WWW
Aby odrzucić wybraną cechę, należy użyć słowa kluczowego not. Na przykład poniższe zapytanie zadziała na telefonach iPhone, lecz jedynie na tych, które NIE są wyposażone w ekrany Retina; innymi słowy: zadziała na iPhonie 3, lecz nie na iPhonie 5: @media only screen (min-device-width: 640px) and not (-webkit-min-device-pixel-ratio: 2) { /* style dla urządzeń z ekranami o niskiej gęstości */ }
Ogólnie rzecz biorąc, składnia zapytań medialnych jest bardzo prosta, czytelna i można ją łatwo zrozumieć, trzeba tylko uważać na te niejawne logiczne alternatywy. Gdyby W3C oraz WHATWG zdecydowały się na przyjęcie elementu picture, a nie atrybutu srcset, to dodatkowe możliwości zastosowania, jakie zyskałyby zapytania medialne, sprawiłyby, że ich poznawanie byłoby jeszcze bardziej warte zachodu.
Obsługa cech Z powodzeniem można wiele osiągnąć, stosując wyłącznie zapytania medialne testujące cechy związane z wymiarami ekranów — width, height, device-width oraz device-height. Zapewniają one dwojakie korzyści: są łatwe do zrozumienia i powszechnie obsługiwane przez przeglądarki. Oczywiście łatwo je zrozumieć, jeśli tylko będziemy pamiętać, że width określa szerokość przeglądarki, a device-width — szerokość ekranu zgłaszaną przez urządzenie (rysunek 4.4).
Rysunek 4.4. Porównanie cech width oraz device-width
Przyjrzyjmy się także pozostałym dostępnym cechom, aby zorientować się, jak można by ich używać.
92
Responsywne strony WWW
mogą nie być dobrze znane projektantom tworzącym strony przeznaczone dla komputerów stacjonarnych, są one bowiem dedykowane dla innych urządzeń i będą doskonale znane osobom tworzącym rozwiązania zaprojektowane właśnie dla nich. Na przykład jeśli nasza praca jest związana z tworzeniem aplikacji prezentowanych na odbiornikach telewizyjnych, to będziemy doskonale wiedzieli, czego dotyczy cecha scan oraz czym jest skanowanie progresywne6. Używanie zapytań medialnych oraz list zapytań jest najlepszym sposobem zrozumienia, jak należy się nimi posługiwać, zatem przejdźmy do ćwiczeń praktycznych.
Zapytania medialne w działaniu Strona Web Directions South (WDS), która wielokrotnie pojawiała się jako przykład w tej książce, od samego początku istnienia używała pewnych zapytań medialnych. Rysunek 4.5 przedstawia nagłówkowe grafiki, używane w przeglądarkach mających więcej oraz mniej niż 800 pikseli szerokości.
Rysunek 4.5. Obrazy o wymiarach 1565×690 oraz 800×650 pikseli udostępniane przy wykorzystaniu zapytań medialnych
Grafiki te gwarantują, że witryna będzie mieć spójny wygląd, a co ważniejsze, że przeglądarki będą pobierać możliwie jak najmniej danych. A co jest naszym celem? Spójrzmy na rysunek 4.6.
6
http://pl.wikipedia.org/wiki/Skanowanie_progresywne.
ZROZUMIEĆ ZAPYTANIA MEDIALNE
Rysunek 4.6. Nasz cel: stopka witryny WDS w przeglądarkach o szerokości 1440, 960, 800 oraz 480 pikseli
Na witrynie Web Directions South zapytania medialne są stosowane przy wykorzystaniu kombinacji elementów link oraz arkuszy CSS. Rozwiązanie to zapewnia, że pierwszą lokalizacją, w której rozpoczyna się określanie stylów CSS, jest sekcja head dokumentu, czyli miejsce, gdzie tradycyjnie już są umieszczane odwołania do plików CSS. Na razie wszystkie te odwołania umieścimy w komentarzach: rozdzial04/wds/index.html (fragment)
Jednym z zagadnień, o których należy pamiętać, stosując tę metodę, jest to, że przeglądarka będzie pobierać nawet te arkusze stylów, w których warunki określane przez zapytania medialne nie zostały spełnione7. Arkusze te nie zostaną jednak zastosowane, a przeglądarka nie pobierze żadnych zasobów, które są w nich używane. Niemniej jednak same arkusze stylów zostaną pobrane, będą zatem mieć wpływ na wydajność działania aplikacji oraz zużycie przepustowości.
7
http://scottjehl.github.com/CSS-Download-Tests/.
93
94
Responsywne strony WWW
Mamy właśnie zamiar usunąć z naszej przykładowej strony wszystkie używane na niej arkusze stylów — jest to rozwiązanie dosyć radykalne, jednak ułatwi nam zmianę struktury stylów. Skoro zapytania medialne używane na produkcyjnej witrynie Web Directions South są umieszczone w nagłówku strony, a dla przeglądarek o mniejszej szerokości wykorzystywana jest po prostu właściwość display: none, skoncentrujemy się na sekcji sponsorów umieszczonej w stopce strony. Później wrócimy do usuniętych arkuszy CSS, by odszukać początkowe style określające postać sekcji sponsorów i nie tylko. Chcemy jedynie zmienić strukturę stylów, a nie opracowywać je od nowa. rozdzial04/wds/index.html (fragment)
Zapytania medialne wykorzystamy w pliku query.css, w pliku z domyślnymi stylami sheet.css, jak również w ostatnim arkuszu stylów reset.css. Dzięki temu wprowadzimy możliwie najmniej zmian w pliku HTML i spróbujemy ułatwić utrzymanie witryny dzięki zastosowaniu sensownych nazw plików. Więcej informacji na temat ostatniego z używanych plików CSS można znaleźć w rozdziale 6., w punkcie „Neutralizacja i normalizacja”, dlatego też w tym rozdziale skoncentrujemy się na stylach umieszczonych w dwóch pierwszych plikach. Jak wiadomo, połączenie zapytań medialnych z domyślnym stylem oznacza, że w efekcie zupełnie za darmo uzyskujemy w naszym domyślnym stylu dodatkowy punkt graniczny (ang. breakpoint). Używamy dwunastu stylów wykorzystujących w selektorze identyfikator sponsors, na szczęście w celu zastosowania zapytań medialnych będziemy musieli zmodyfikować tylko dwa z nich. #sponsors { margin: 2em auto 0 auto; width: 800px; } #sponsors ul li { background-color: #FFF; display: inline-block; float: left; height: auto; margin: 0 0 1.7em 0; min-height: 120px; vertical-align: top; width: 30%; }
W tych dwóch stylach interesować nas będą wyłącznie deklaracje związane z właściwościami width oraz margin, gdyż to właśnie one mają wyznaczać punkty graniczne naszego responsywnego układu:
ZROZUMIEĆ ZAPYTANIA MEDIALNE #sponsors { margin: 2em auto 0 auto; width: 800px; } #sponsors ul li { ... margin: 0 0 1.7em 0; ... width: 30%; }
W pierwszej kolejności zmienimy dotychczasowe style określające postać elementów stopki, zgodnie z założeniem, by najpierw tworzyć rozwiązanie przeznaczone dla urządzeń mobilnych. Efekt tych zmian przedstawia rysunek 4.7.
Rysunek 4.7. Stopka strony wyświetlona w przeglądarce o szerokości 480 pikseli rozdzial04/wds/stylesheets/sheet.css (fragment) #sponsors { margin: 2em auto 0 auto; width: 480px; } #sponsors ul li { ... margin: 0 5px 1.7em 5px; ... width: 470px; }
Jesteśmy na dobrej drodze. Naszym pierwszym zadaniem jest określenie elementu #sponsors w taki sposób, by w razie wyświetlenia strony na urządzeniu mobilnym zawsze miał on 480
95
96
Responsywne strony WWW
pikseli szerokości. Właśnie z tego powodu podaliśmy stałe wymiary szerokości oraz marginesów elementów li. Zastosujemy responsywne rozwiązanie, określając punkty graniczne, jednak teraz uzyskamy pewność, że w naszym domyślnym stylu elementy zawsze będą miały stałą szerokość, a stała szerokość oznacza, że przeglądarka pozycjonując takie elementy, będzie miała łatwiejsze zadanie. Po wprowadzeniu powyższych zmian w pliku sheet.css zajmiemy się dodaniem do arkusza query.css pierwszego punktu granicznego: rozdzial04/wds/stylesheets/query.css (fragment) @media only screen and (min-width: 480px) and (max-width: 960px) { #sponsors { max-width: 960px; width: 100%; } #sponsors ul li { margin: 0 0.4% 1em 0.8%; width: 31.5%; } }
Ze względu na to, że do określenia docelowej grupy urządzeń w zapytaniu medialnym użyliśmy składni @media, dwa selektory zostały odpowiednio wcięte i zagnieżdżone wewnątrz reguły @media. Lista zapytań rozpoczyna się od only screen and, a następnie określa cechy docelowej grupy urządzeń: min-width: 480px oraz max-width: 960px. Uzyskane efekty przedstawia rysunek 4.8.
Rysunek 4.8. Stopka strony wyświetlona w przeglądarce o szerokości 960 pikseli
To jest nasz średni punkt graniczny. Będziemy mieli rację, sądząc, że można by pominąć określenie typu mediów oraz cechy min-width i pomimo to uzyskać takie same rezultaty, jednak podanie obu tych cech znacznie ułatwi nam zrozumienie działania punktu granicz-
ZROZUMIEĆ ZAPYTANIA MEDIALNE
nego w przyszłości, kiedy będziemy chcieli poprawić lub zmodyfikować style. Powyższą listę zapytań można by skrócić do następującej postaci: @media (max-width: 960px) { ... }
Jednak zaleta, jaką jest skrócona postać zapisu, staje się wadą, gdy spojrzymy na powyższy kod pod kątem łatwości utrzymania i modyfikacji. Nieco bardziej rozbudowana forma jest jednocześnie bardziej korzystna: #sponsors { max-width: 960px; width: 100%; } #sponsors ul li { margin: 0 0.4% 1em 0.8%; width: 31.5%; }
Same deklaracje są zwyczajnym, niezawodnym kodem CSS. Nie ma potrzeby modyfikowania właściwości margin w elemencie zawierającym logo sponsorów, dlatego też w arkuszu nie ma deklaracji z tą właściwością; zamiast niej dodaliśmy deklarację max-width: 960px, a właściwości width przypisaliśmy wartość 100%. Jak wiemy z wcześniejszych rozważań dotyczących siatek, takie rozwiązanie sprawia, że element staje się płynny i na wszystkich ekranach o szerokości pomiędzy 480 i 960 pikseli stopka będzie zajmowała całą dostępną szerokość. Aby wykorzystać ten fakt, zapewnimy także responsywność elementów li — w tym celu określimy ich szerokość, używając wartości procentowych, i trochę się z nimi pobawimy, by zmaksymalizować uzyskiwany efekt. Chcemy, by elementy były możliwie jak najszersze, a jednocześnie by nie pojawiały się błędy zaokrągleń opisane w rozdziale 2., w uwadze „Diabeł tkwi w szczegółach”. Jeśli zsumujemy szerokość elementu oraz wielkości jego poziomych marginesów, to uzyskamy 31,5 + 0,4 + 0,8 = 32,7 procent. Dysponujemy zatem „buforem bezpieczeństwa” o szerokości 0,3 procent, który umożliwi nam zniwelowanie ewentualnych różnic w zaokrągleniach w różnych przeglądarkach. Koniecznie trzeba pamiętać, że — z wyjątkiem czytelników tej książki oraz naszego zespołu — mało kto będzie próbował modyfikować szerokość okna przeglądarki, by sprawdzić, jak zmieni się wtedy układ strony. Większość osób zadowoli się wysiłkami, które podjęliśmy, by zapewnić, że wyświetlana strona będzie możliwie najlepsza. Na przykład gdyby ktoś powiększył okno przeglądarki, nadając mu szerokość przekraczającą 960 pikseli (co pokazuje rysunek 4.9), to zostałby zastosowany ostatni z trzech określonych przez nas punktów granicznych.
97
98
Responsywne strony WWW
Rysunek 4.9. Stopka wyświetlona w przeglądarce o szerokości 1024 pikseli rozdzial04/wds/stylesheets/query.css (fragment) @media only screen and (min-width: 960px) { #sponsors { max-width: 1280px; width: 100%; } #sponsors ul li { margin: 0 0.5% 1em 0.6%; width: 23.5%; } }
Także w tym przypadku zastosowane style zapewniają elastyczność układu i elementów, choć pojawiły się w nich pewne korzystne różnice. Przede wszystkim zamiast nadawać elementowi sponsors szerokość odpowiadającą maksymalnej szerokości naszego punktu granicznego, nadaliśmy mu stałą szerokość 1280 pikseli. Oznacza to, że jeśli szerokość okna przeglądarki nie przekroczy 1280 pikseli, element sponsors będzie zajmował całą dostępną szerokość strony. Kiedy jednak okno przeglądarki przekroczy 1280 pikseli szerokości, to szerokość elementu sponsors nie będzie się dalej powiększać, a marginesy określone w pliku sheet.css spowodują, że zostanie on wyśrodkowany (jak pokazaliśmy na rysunku 4.10). Druga zmiana polega na tym, że zrezygnowaliśmy z wyświetlania trzech sponsorów w jednym wierszu na rzecz wyświetlania czterech, choć wciąż korzystamy z tego samego responsywnego rozwiązania. Sumaryczna szerokość elementu wynosi 23,5 + 0,5 + 0,6 = 24,6 procent, co daje nam bufor bezpieczeństwa wielkości 0,4 procent. Nieliczni spośród użytkowników, którzy zdecydują się na zmianę szerokości okna przeglądarki, będą mieli okazję zauważyć, że nasz układ zmienia się dynamicznie od jednej kolumny z logo sponsorów, poprzez trzy kolumny aż do czterech kolumn w oknach o największej szerokości. W ten sposób wszyscy są zadowoleni — sponsorzy, gdyż przeznaczamy na prezentację ich logo maksymalny obszar ekranu, i użytkownicy, dlatego że niezależnie od szerokości okna przeglądarki, czytelnie prezentowane logo stanowią doskonały obiekt zainteresowania.
ZROZUMIEĆ ZAPYTANIA MEDIALNE
Rysunek 4.10. Stopka wyświetlona w przeglądarce o szerokości 1440 pikseli
Dzięki zdecydowaniu się na wykorzystanie kombinacji punktów granicznych oraz płynnego układu strony udało się nam zoptymalizować jej interfejs pod kątem możliwie największej liczby czynników. Udało nam się również spełnić oczekiwania zarówno sponsorów, jak i użytkowników, a zastosowane rozwiązanie korzystające z metodologii RWD zapewnia także tę zaletę, że nie musimy projektować odrębnych układów dla każdego z istniejących ekranów. Choć punkty graniczne mogą się wydawać sposobem na to, by projektanci ponownie odzyskali kontrolę nad układem na niebezpiecznym gruncie bezustannie rozwijanych urządzeń, zdecydowaliśmy się w pełni wykorzystać ich możliwości, a nie jedynie ograniczyć się do serii stałych układów strony. Skoro dotarliśmy już do tego miejsca, to zanim nasze modyfikacje będą gotowe do wdrożenia na produkcyjnej witrynie, zostaje nam do zrobienia jeszcze jedna rzecz. Okazuje się, że choć dzięki zapytaniom medialnym nasza witryna może się podobać tak szerokiemu gronu użytkowników, to jednak istnieje pewna grupa, która jest traktowana po macoszemu. Jeśli użytkownicy wciąż korzystają z przeglądarki Internet Explorer w wersji wcześniejszej niż dziewiąta, to nie będą mogli skorzystać z efektów zastosowania zapytań medialnych, ponieważ obsługa wybranych możliwości CSS38 została dodana dopiero w przeglądarce IE9. Jak sobie poradzić z tym problemem? Oczywiście możemy zachęcać naszych użytkowników do zainstalowania nowszej wersji przeglądarki, jednak gdyby to było możliwe, zapewne już by to zrobili. Moglibyśmy uzupełnić możliwości przeglądarki, stosując rozwiązanie skryptowe, takie jak skrypt Respond.js9 Scotta Jehla, zapewniający możliwość stosowania zapytań medialnych testujących minimalną i maksymalną szerokość nawet w starszych przeglądarkach. Oczywistą wadą takiego rozwiązania jest dodatkowe wydłużenie czasu pobierania stron w przeglądarkach, które i tak nie należą do najszybszych. Zważywszy na to, że biblioteka Modernizr 8
http://caniuse.com/css-mediaqueries.
9
https://github.com/scottjehl/Respond.
99
100
Responsywne strony WWW
zaczynając od wersji 2.5, zrezygnowała z użycia skryptu Respond.js, także i my zrezygnujemy z niego na rzecz innego rozwiązania. Nasze rozwiązanie opiera się na pomyśle, że starsze wersje przeglądarki Internet Explorer mogą działać wyłącznie na komputerach stacjonarnych i laptopach. Możemy zatem skorzystać z komentarzy warunkowych Internet Explorera, by zastosować w tych przeglądarkach układy o stałej szerokości i wykorzystać ich zalety: rozdzial04/wds/index.html (fragment)
A to zawartość arkusza stylów: rozdzial04/wds/stylesheets/ielt9.css (fragment) #sponsors { width: 960px; } #sponsors ul { padding-left: 3px; } #sponsors ul li { margin: 0 6px 15px 6px; width: 302px; }
Style zastosowane w tych przeglądarkach opierają się na płynnym układzie o szerokości 960 pikseli, choć sam układ został zmodyfikowany tak, by miał stałą szerokość. W tym celu usunęliśmy wartości procentowe w szerokościach i marginesach, zastępując je konkretnymi wielkościami podanymi w pikselach. Odpowiada to możliwościom tych starszych przeglądarek (na przykład Internet Explorera przedstawionego na rysunku 4.11), zatem dostarczamy ich użytkownikom stronę o najlepszej postaci, jaką jesteśmy w stanie przygotować. Reagujemy na możliwości, jakimi dysponuje użytkownik, a w tym przypadku reakcja ta polega na wybraniu układu o stałej szerokości.
Dodawanie punktów granicznych Zgodnie z informacjami opublikowanymi na witrynie Responsive Images Community Group10, punkt graniczny jest logicznym odzwierciedleniem cech medium, które aktualizuje style używane na stronie: „Pojedynczy punkt graniczny reprezentuje regułę (lub grupę 10
http://usecases.responsiveimages.org/#design-breakpoints.
ZROZUMIEĆ ZAPYTANIA MEDIALNE
Rysunek 4.11. Stopka naszej witryny wyświetlona w starej przeglądarce Internet Explorer
reguł) określającą punkt, w którym zawartość danego zapytania medialnego zostaje zastosowana w układzie strony”. Mimo że nie jest to oficjalna specyfikacja, zrozumienie jej wcale nie jest proste. Najszybciej będziemy w stanie pojąć, o co w tym chodzi, jeśli wyobrazimy sobie punkty graniczne jako miejsca, w których nasz projekt ulega zmianie. Jeszcze raz wróćmy do przykładu witryny Web Directions South. Jak widać na rysunku 4.12, gdy szerokość okna przeglądarki zmniejszy się do 960 pikseli, czterokolumnowy układ strony ulega zmianie — punkt graniczny zostaje przekroczony, a strona zaczyna korzystać z układu trójkolumnowego.
Rysunek 4.12. W momencie przekroczenia punktu granicznego i zmniejszenia szerokości do 960 pikseli układ czterokolumnowy zostaje zastąpiony układem trójkolumnowym
Oczywiście w tym przypadku używana jest tylko jedna reguła, jednak dodawanie kolejnych punktów granicznych nie sprawia, że stają się one trudniejsze do zrozumienia — powiększa tylko ich liczbę. Poza tym może nasza witryna będzie używała znacznie więcej stylów
101
102
Responsywne strony WWW
przeznaczonych dla konkretnych urządzeń niż tylko jeden? Wprost przeciwnie! Nawet jeśli ograniczymy się wyłącznie do sprawdzania szerokości, może nas kusić, by zastosować aż sześć punktów granicznych: 320px, 480px, 600px, 768px, 1024px oraz 1280px. Korzystając wyłącznie z tych punktów, bylibyśmy w stanie obsłużyć szeroką gamę urządzeń, posługując się przy tym obecnie używanymi, standardowymi szerokościami (wyrażonymi w pikselach). 320px
urządzenia mobilne działające w układzie pionowym
480px
urządzenia mobilne działające w układzie poziomym
600px
małe tablety
768px
tablety działające w układzie pionowym
1024px
tablety działające w układzie pionowym, netbooki, komputery stacjonarne
1280px i więcej
duże komputery stacjonarne
A zatem gdybyśmy chcieli wykorzystać wszystkie te szerokości, nasze elementy link mogłyby mieć następującą postać:
Dobór odpowiednich punktów granicznych może być trudny: jeśli wybierzemy ich zbyt wiele, to utrzymanie witryny mogłoby się stać zbyt kłopotliwe, z kolei jeśli wybierzemy ich zbyt mało, to w efekcie strona nie będzie wyglądać dostatecznie dobrze na urządzeniach, których nie uwzględnialiśmy podczas projektowania. Jako absolutne minimum należy stosować dwa punkty graniczne: mały (przeznaczony dla wszystkich urządzeń poniżej 480 pikseli szerokości) oraz duży (dla wszystkich pozostałych przypadków). Właśnie takie postępowanie jest przykładem projektowania z myślą o urządzeniach mobilnych. Kiedy już uda się nam dopracować te dwa układy, pozostaje pytanie: co zrobić z większymi ekranami? Przekonajmy się, w jaki sposób podzieliliśmy je na średnie, duże i bardzo duże. Układ dla ekranów średnich obejmuje zakres szerokości od 480 do 960 pikseli — jego górną granicę znamy z wcześniejszych rozważań dotyczących siatek. W dużym stopniu układ
ZROZUMIEĆ ZAPYTANIA MEDIALNE
ten będzie używany w przeglądarkach, które nie działają w trybie pełnoekranowym, jak również na wielu urządzeniach przenośnych, zwłaszcza tabletach, takich jak iPady lub urządzenia Kindle. W tych przypadkach niezwykle pomocny okazuje się element meta viewport, pozwalający dostosować układ o szerokości 960 pikseli do pracy na urządzeniach o mniejszych ekranach, takich jak iPady działające w układzie pionowym, których ekran ma szerokość 768 pikseli:
Kolejny, duży punkt graniczny obejmuje większość komputerów stacjonarnych, laptopów oraz tablety działające w układzie poziomym. Zaczyna się on na 960 pikselach szerokości, a kończy na 1280 pikselach. W ten sposób ostatni punkt graniczny — bardzo duży — obejmuje szerokości powyżej 1280 pikseli. Do tej kategorii zaliczają się nowoczesne monitory komputerów stacjonarnych o wielkości powyżej 20 cali, wysokiej klasy laptopy o szerokich ekranach i najnowsze tablety. Te trzy punkty graniczne definiowane przy użyciu zapytań medialnych, w połączeniu z czwartym punktem korzystającym z domyślnych stylów przeznaczonych dla urządzeń mobilnych, wyznaczają cztery grupy ekranów zilustrowane na rysunku 4.13. Zapewniają one solidną obsługę niemal wszystkich naszych użytkowników.
Rysunek 4.13. Nasze cztery punkty graniczne i urządzenia, z myślą o których były tworzone
103
104
Responsywne strony WWW
Powyżej tej granicy przekraczamy punkt malejących dochodów i stajemy wobec problemu określenia równowagi pomiędzy kosztami a zyskami z inwestycji, jakim jest dodawanie kolejnych punktów granicznych. Moglibyśmy dodać kolejny, bardzo mały punkt graniczny dla ekranów o szerokości poniżej 320 pikseli, lub jeszcze jeden punkt — pośredni dla szerokości 768 pikseli, który pozwoliłby dostosować witrynę do potrzeb siedmiocalowych tabletów. Jednak w związku z wykorzystywaniem w tabletach ekranów o coraz większej gęstości i coraz większych możliwościach tworzenie tak szczegółowych punktów granicznych jedynie zwiększyłoby nakłady pracy konieczne do utrzymania witryny, nie dając w zamian dużych korzyści. Niemniej jednak jeśli tworzone aplikacje są przeznaczone dla bardzo szerokiego grona użytkowników urządzeń mobilnych (wśród których mogą się także znaleźć posiadacze urządzeń starych lub o gorszej specyfikacji), to wykorzystanie tych dwóch dodatkowych punktów granicznych (bardzo małego i pośredniego) może być uzasadnione.
Dobór punktów granicznych Należy dokładnie określić docelową grupę urządzeń, z myślą o których będziemy tworzyć naszą aplikację, i oszacować, czy zyski wynikające ze sposobu, w jaki użytkownicy będą z niej korzystać, pozwolą zrównoważyć koszty. To bardzo ważne, nawet jeśli zdecydujemy się używać tylko paru punktów granicznych lub jakiejś kombinacji pięciu punktów wymienionych powyżej: bardzo małego, małego, średniego, dużego i bardzo dużego. Dokładna analiza opłacalności staje się jeszcze ważniejsza, gdy zdecydujemy się porzucić bezpieczeństwo, jakie dają nam punkty graniczne, i w jeszcze większym stopniu dostosować naszą aplikację do konkretnych urządzeń. W bardzo wielu, lub nawet w przeważającej większości przypadków wykorzystanie trzech spośród pięciu wymienionych wcześniej punktów granicznych zapewni nam dostatecznie duży zakres obsługi użytkowników. Nie oznacza to jednak, że zastosowanie bardziej szczegółowego rozwiązania nie gwarantuje naszej aplikacji korzyści. Przyjrzyjmy się zatem solidnemu zestawowi zapytań medialnych, który będzie w stanie zapewnić obsługę szerokiego zakresu urządzeń, i to nawet bez zbytniego angażowania się w obsługę urządzeń z ekranami Retina i AMOLED. Opracowanie stylów i zaprojektowanie układów strony dla każdego z przedstawionych poniżej 12 punktów granicznych okazałoby się zadaniem tytanicznym, a ich późniejsze utrzymanie byłoby równie onieśmielające: /* NIEWIELKIE TELEFONY Z SYSTEMEM ANDROID, TELEFONY SPECJALISTYCZNE – UKŁAD POZIOMY */ @media only screen and (max-width: 240px) { ... } /* SMARTFONY – UKŁAD PIONOWY I POZIOMY */ @media only screen and (min-device-width: 320px) and (max-device-width: 480px), only screen and (min-width: 320px) and (max-width: 480px) { ... }
ZROZUMIEĆ ZAPYTANIA MEDIALNE
/* SMARTFONY – UKŁAD POZIOMY */ @media only screen and (min-width: 321px) { ... } /* SMARTFONY – UKŁAD PIONOWY */ @media only screen and (max-width: 320px) { ... } /* IPADY, TABLETY – UKŁAD PIONOWY I POZIOMY */ @media only screen and (min-device-width: 768px) and (max-device-width: 1024px), only screen and (min-width: 768px) and (max-width: 1024px) { ... } /* IPADY, TABLETY – UKŁAD POZIOMY */ @media only screen and (min-device-width: 768px) and (max-device-width: 1024px) and (orientation: landscape) { ... } /* IPADY, TABLETY – UKŁAD PIONOWY */ @media only screen and (min-device-width: 768px) and (max-device-width: 1024px) and (orientation: portrait) { ... } /* TABLETY, KOMPUTERY STACJONARNE I LAPTOPY */ @media only screen and (min-width: 960px) { ... } /* KOMPUTERY STACJONARNE I LAPTOPY */ @media only screen and (min-width: 1024px) { ... } /* KOMPUTERY STACJONARNE I LAPTOPY */ @media only screen and (min-width: 1224px) { ... } /* DUŻE EKRANY */ @media only screen and (min-width: 1824px) { ... } /* EKRANY RETINA I AMOLED */ @ media only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-device-pixel-ratio: 1.5) { ... }
105
106
Responsywne strony WWW
Zastosowanie powyższych punktów granicznych zapewniłoby naszemu zespołowi zajęcie na czas dłuższy, a poza tym stanowiłoby całkiem poważne wyzwanie. Znacznie lepszym rozwiązaniem byłoby wykorzystanie mniejszej liczby punktów i aktywne poszukiwanie tych, które można by uznać za przestarzałe i odrzucić, gdyż koszty ich utrzymania byłyby większe od zysków. Gdyby się okazało, że wymienione wcześniej punkty graniczne nie spełniają naszych oczekiwań i potrzeb, to nic nie stoi na przeszkodzie, by wybrać inny podzbiór wymienionych 12 punktów. Jeśli koncentrujemy się na rynku urządzeń mobilnych, to prawdopodobnie moglibyśmy dokładniej określić zestaw niezbędnych punktów granicznych, jednak ograniczenie ich liczby jest równie ważne jak używanie składni zapytań medialnych. Istnieje tylko jedna żelazna reguła dotycząca liczby stosowanych punktów granicznych — zaleca ona, by przestać dodawać kolejne, gdy tylko zadowoli nas liczba użytkowników aplikacji.
Sprostać zadaniu Spośród wszystkich technicznych filarów metodologii RWD zapytania medialne są najbardziej rozpowszechnione i najlepiej obsługiwane. Co więcej, z punktu widzenia projektowania aplikacji zapewniają one rozsądne zyski z poniesionych nakładów i możliwość użycia nawet w już istniejących aplikacjach w celu poprawienia ich atrakcyjności. Choć faktycznie obsługa zapytań medialnych w starszych przeglądarkach jest raczej kiepska, należy pamiętać, że przeglądarki te są stosowane w coraz to mniejszym gronie użytkowników komputerów stacjonarnych. Zapytania medialne są oparte na CSS i mogą być używane w przeglądarkach obsługujących tę technologię, dlatego eksperymenty przeprowadzane przez twórców przeglądarek doprowadziły do uzyskania takiego poziomu kontroli, który wyraźnie pokazuje ogromne możliwości, jakie daje stosowanie prefiksów przeglądarek. Oczywiście taki poziom kontroli sprawia, że trudno jest uniknąć pokusy zastosowania zapytań medialnych w celu dodawania coraz to nowych punktów granicznych. Jednak opierając się pędowi do nadużywania punktów granicznych i stosując wybrane punkty w stałych układach, projektanci mogą uzyskać możliwości tworzenia fantastycznych rozwiązań zaprojektowanych pod kątem użytkowników. Sami będziemy sobie wdzięczni, jeśli opanujemy chęć nadużywania punktów granicznych i skupimy się na wykorzystaniu tylko wybranych spośród nich. Dzięki temu łatwiej będzie zarządzać stosowanymi zapytaniami medialnymi i skoncentrować się na tworzeniu wspaniałych stron dla tych punktów granicznych, których zdecydowaliśmy się użyć.
Rozdział
Responsywna treść Treść to stosunkowo szerokie i niejasne pojęcie, dlatego poniżej przedstawiliśmy definicję, którą będziemy się posługiwać w tej książce. „Treść to wszystko, co użytkownik witryny konsumuje podczas interakcji z naszymi usługami”. Według tej definicji treścią jest wszystko, zaczynając od obrazków, poprzez elementy nawigacyjne, formularze, słowa po klipy wideo. Ograniczenie naszego wyobrażenia treści wyłącznie do danych umieszczonych w głównym elemencie div absolutnie nie wystarczy. Przyjęcie punktu widzenia związanego z konsumpcją pozwala nam uwzględniać także tych użytkowników witryny, którzy nie są ludźmi, takich jak boty i programy. Responsywna treść (ang. responsive content, w skrócie: RC) jest zatem sposobem pozwalającym na to, by zawartość naszej witryny dostosowywała się lub zmieniała na podstawie behawioralnego kontekstu użytkownika. Najbardziej oczywistym przykładem praktycznego zastosowania tego rozwiązania jest wyświetlanie innych układów, informacji, a nawet modyfikowanie możliwości witryny w zależności od tego, czy użytkownik ogląda ją na urządzeniu mobilnym, czy też na komputerze stacjonarnym. Oczywiście nie oznacza to, że musimy się ograniczać do kontekstu urządzenia, treść witryny może się bowiem zmieniać także w zależności od tego, czy dana osoba odwiedziła ją po raz pierwszy, czy też jest doświadczonym użytkownikiem. Warto przyjrzeć się, jak Twitter prowadzi nowych użytkowników przez proces dodawania nowego konta do swojego strumienia (rysunek 5.1) zaraz po zarejestrowaniu się ich na portalu, dzięki czemu szybko mogą stać się aktywnymi uczestnikami społeczności. Zupełnie odwrotnie postępuje GitHub, który doświadczonym użytkownikom udostępnia w polu wyszukiwania listę często używanych funkcji przypominającą systemowy wiersz poleceń; przedstawiliśmy ją na rysunku 5.2.
108
Responsywne strony WWW
Rysunek 5.1. Początek prezentacji możliwości Twittera dostępnej dla nowych użytkowników
Rysunek 5.2. Pole wyszukiwania serwisu GitHub przypomina wiersz poleceń
Istnieją pewne rozbieżności w opiniach, czy responsywna treść jest „czymś rzeczywistym”, czy nie1. Wpływowy projektant Mark Boulton bardzo elokwentnie opowiedział się po stronie przeciwników takiego traktowania treści, jednak może to wynikać z faktu, że jako projektant od lat zajmujący się materiałami drukowanymi i pismem w naturalny sposób na pierwszym miejscu stawia właśnie treść. Jeśli przyjąć, że responsywna treść zmusza zespół projektantów do omawiania, uwzględniania i przyjmowania strategii mającej na celu zapewnienie lepszych wrażeń, dokładniej dostosowanych do użytkownika, to takie podejście jest ze wszech miar słuszne (i prawdopodobnie odpowiada podejściu Boultona do tworzenia responsywnych systemów). Skoncentrowanie uwagi w pierwszej kolejności na treści poprawi witrynę. Dbanie o to, by była ona prawidłowa, podnosi wrażenia użytkowników w równie dużym stopniu co dobry projekt oraz właściwie zaimplementowana technologia. A zatem w jaki sposób można dopasować treść do nowoczesnego, respnsywnego świata? Czy wystarczy napisać kod, który usunie z naszego systemu zarządzania treścią wszystkie 1
http://www.markboulton.co.uk/journal/responsive-content-is-not-a-thing.
RESPONSYWNA TREŚĆ
filmy Flash, tak by nasze treści działały na tych nieznośnych mobilnych przeglądarkach? A może należy arbitralnie określić limit długości i przycinać wszystkie teksty, które przekroczą zadaną liczbę znaków? (Podpowiedź: to raczej kiepski pomysł, nawet jeśli potraktujemy go jako ostatnią deskę ratunku). Różne wymagania prowadzą do zastosowania różnych rozwiązań. W niektórych przypadkach zredukowanie treści będzie właściwym rozwiązaniem, w innych nie. Najważniejsze jest to, by aktywnie poszukiwać dostępnych możliwości i podjąć jakąś decyzję — w końcu właśnie na tym polega proces projektowania, a projektowanie treści nie jest wyjątkiem.
Strukturyzacja nas wyzwoli Określenie struktury jest kluczowym zagadnieniem związanym z zapewnianiem responsywności treści. Nadanie treści odpowiedniej struktury zapewnia nam możliwość jej wielokrotnego wykorzystania i zmiany sposobu jej działania na wiele sposobów i na wielu różnych platformach. Pisanie jest procesem strukturalnym. Podczas pisania zawsze mamy do czynienia z jakimiś strukturami: słowami, znakami przestankowymi, zdaniami, akapitami — wszystkie one gwarantują, że nasze treści będą miały odpowiedni początek, rozwinięcie i zakończenie. Zastosowanie sensownej struktury może pomóc w rozpoczęciu procesu, gdyż zapewnia odpowiednią podbudowę. Bez tej struktury nasza treść będzie bezużyteczna. Jeśli zastosujemy arbitralną lub źle przemyślaną strukturę, stanie się ona jedynie zbiorem reguł, których należy przestrzegać, a reguł nikt nie lubi. A zatem rozmawiając o strukturze, będziemy rozważali następujące zagadnienia: strukturę dokumentu, metadane, treści wspomagające.
Jeśli pomożemy autorom zrozumieć te pojęcia i jednocześnie zastosujemy solidną strukturę, to będzie nam znacznie łatwiej zapewnić responsywność tworzonych treści (zarówno w chwili obecnej, jak i w przyszłości) i wyzwolić je.
Struktura dokumentu Zacznijmy od treści, które tworzymy bezpośrednio, i przeanalizujmy ich strukturę. Tworzenie treści stron WWW nigdy nie polega na losowym umieszczaniu na nich słów i odnośników. Chcąc przekazać komuś nasze myśli, zawsze trzeba je zorganizować. Zabawne jest to, że dzisiejsza Sieć świetnie sobie z tym radzi: możemy korzystać z semantycznych znaczników, pozwalających dzielić treści na artykuły, sekcje, akapity, tworzyć nagłówki i stopki.
109
110
Responsywne strony WWW
Pokazanie zespołowi autorów nowych możliwości języka HTML5 zapewni nam możliwość znacznie bardziej szczegółowego określania struktury treści, niż pozwala na to większość edytorów tekstów.
Bloki logiczne Wykorzystanie bloków logicznych zwiększa możliwość fragmentacji treści, co z kolei pozwala dzielić ją na różne sposoby zależnie od konkretnego zastosowania. W takich przypadkach pomocne jest także użycie odpowiednich elementów semantycznych, gdyż pozwalają one określić znaczenie konkretnego bloku (na przykład akapit wyraźnie odróżnia się od nagłówka)2. W przypadku strony prelegentów na witrynie Web Directions South takim logicznym komponentem będą informacje o konkretnej osobie, jednak nawet on składa się z grupy logicznych podkomponentów, przedstawionych na rysunku 5.3. Są nimi: zdjęcie (1), imię i nazwisko (2), tytuł sesji (3), biografia (4), odnośnik do strony na Twitterze (5) oraz opis sesji (6).
Rysunek 5.3. Informacje o jednym prelegencie składają się z sześciu logicznych podkomponentów
Dzięki stworzeniu odpowiedniej struktury wokół tych elementów będzie je można dowolnie organizować w ramach układu, dostosowując do danego kontekstu. Logiczna modularność jest kluczowym aspektem projektowania i tworzenia witryn oraz aplikacji internetowych. Podobne postępowanie w przypadku danych wzmacnia siłę Sieci i zapewnia możliwość wielokrotnego stosowania i dowolnego łączenia naszych treści na wiele różnych sposobów, bez konieczności pisania za każdym razem wszystkiego od początku. Doskonałym przykładem takiego postępowania jest zapewnienie możliwości podziału prezentowanych treści na wiele stron. Agencje informacyjne stosują to rozwiązanie z wielu róż2
Ten doskonały film Karen McGrane pokazuje, jak dostosowywać proces produkcyjny do tworzenia „elastycznych” treści: http://aneventapart.com/news/post/aea-video-karen-mcgrane-adapting-ourselves-to-adaptive-content.
RESPONSYWNA TREŚĆ
nych powodów, związanych głównie z reklamami, jednak możliwość podziału szczególnie długiego artykułu na kilka stron jest także korzystna dla osób używających przeglądarek mobilnych, w których wyświetlanie treści jest nieco wolniejsze. Przeciwieństwem tego rozwiązania jest wykorzystanie tego samego procesu do zapewnienia możliwości „nieskończonego przewijania”, której przykłady można znaleźć na witrynach Twitter lub Tumblr. Zapewnianie użytkownikom wrażeń tego typu jest możliwe wyłącznie w przypadku stosowania wysoce modularnych treści.
Hierarchia Boty, CSS oraz programiści uwielbiają treści uporządkowane hierarchicznie. Hierarchia znacznie ułatwia określanie kolejności pierwszeństwa w sytuacjach, gdy pojawia się taka konieczność. Możliwość stwierdzenia, że to jest nagłówek poziomu 1., a to poziomu 2., jest bardzo wygodna, jednak także możliwość stwierdzenia, że dany akapit to część konkretnej sekcji, należącej do konkretnego artykułu, jest potężnym narzędziem pozwalającym na określanie struktury treści oraz zapewniającym jej responsywność i możliwości wielokrotnego użycia. Przeanalizujmy teraz przykład strony prelegentów z witryny Web Directions South, okrojonej do podstawowej struktury, przedstawionej na rysunku 5.4. W tym przypadku informacje o jednym prelegencie są niezależną jednostką, którą można dowolnie przesuwać na stronie bądź łączyć z innymi stronami lub systemami. Informacje te zawierają z kolei inne jednostki informacyjne, takie jak obrazy, biografie, sekcje szczegółów, jednak wszystkie one należą do treści dotyczących konkretnego prelegenta.
Rysunek 5.4. Blok prelegenta ma zdefiniowaną hierarchię informacji, której jednostki mogą zawierać inne hierarchiczne treści
111
112
Responsywne strony WWW
Sami prelegenci należą z kolei do ścieżek tematycznych, takich jak na przykład Design and Development (projektowanie i tworzenie). System hierarchiczny o takiej strukturze pozwala z kolei na przesuwanie całych ścieżek, które także można potraktować jako jednostki treści. Hierarchia zapewnia nam możliwość organizacji treści wykraczającą poza traktowanie ich jako losowego zbioru logicznych obiektów tworzących dokument.
Metadane Metadane to coś więcej niż jedynie zbiór elementów, które umieszczamy w sekcji head dokumentu, by pomóc wyszukiwarkom w zrozumieniu zawartości strony. Są to raczej opisowe informacje dotyczące treści, mogące istnieć na różnych poziomach jej hierarchii. Prelegent może być elementem ścieżki umieszczonej na stronie sesji, a każdy z tych elementów treści może mieć własne metadane. Przyjrzyjmy się każdemu elementowi treści i zastanówmy się, jakie metadane można by mu przypisać. Elementy treści, jak również metadane, zapiszemy w formacie JSON (choć równie dobrze moglibyśmy je zapisać, używając języka XML), gdyż dzięki temu podczas ich analizy nie będzie nas rozpraszać ani struktura, ani formatowanie kodu HTML3. Na poziomie strony możemy znaleźć raczej standardowe metadane: kto jest jej autorem, kiedy została stworzona, kiedy została ostatni raz zaktualizowana, kiedy ostatnio weryfikowano jej zawartość oraz czy określono docelowy sposób wyświetlania. Dane te mają następującą postać: { "page": { "tracks": [ "Design", "Development", "Big Picture", ] }, "name": "Web Directions South 2012", "tags": "Event, Conference", "Author": "Maxine Sherrin", "lastupdated": "201209160300Z10", "created": "201204160300Z10", "nextreview": "201211160300Z10", "publicationtargets": [ "Desktop", "Mobile", "Tablet", ] }
3
Doskonałym miejscem, od którego można zacząć poznawanie formatu JSON, jest strona Wikipedii: http://pl.wikipedia.org/wiki/JSON.
RESPONSYWNA TREŚĆ
A co z metadanymi dotyczącymi ścieżki? Gdyby wszystkie sesje były przeprowadzane w jednym miejscu, moglibyśmy dodać informacje o nim do metadanych. Moglibyśmy również dodać znaczniki opisujące ogólną tematykę ścieżki lub jej opis, ułatwiając w ten sposób użytkownikom możliwość jej sklasyfikowania (na przykład użyte powyżej słowo Design oznacza w tym przypadku projektowanie stron WWW, można by je zatem wykorzystywać jako narzędzie do klasyfikacji). Poniższy przykład pokazuje, jak można by opisać ścieżkę: { "track": { "sessions": [ "session_id1", "session_id2" ] }, "name": "Design", "tags": "Design, Web Design, Information Architecture, Responsive Design, Content", "Location": "Sydney Convention Centre, Sydney, Australia"
}
Poniższy fragment kodu pokazuje, jak mogłyby wyglądać metadane sesji i prelegenta (biografia oraz szczegółowy opis sesji zostały skrócone, by zaoszczędzić miejsca na stronie): { "session": { "title": "Getting unstuck: content strategy for the future", "sessiontime": "201210160300Z10", "location": "Sydney Conference Centre, Main Stage.", "description": "Responsive. Adaptive. Mobile first. Cross-channe l. We all want a web that’s more flexible, future-friendly, and re ady for unknowns...", "slidenotes": " http://www.slideshare.net/Saraboettcher/gettingunstuck-content-strategy-for-the-future", "postvideo": " http://www.youtube.com/watch?v=bPAamdlwQ94", "livestream": "", "track": "Design", "tags": "RWD, Responsive Design, Content, IA, UX, Design", "speaker": { "name": "Sara Wachter-Boettcher", "twitter": "sara_ann_marie", "bio": "Sara Wachter-Boettcher is an independent content strat egist, writer, and rabble-rouser based in Lancaster, Pennsylvania. She got this way after stints as a journalist, copywriter, and web writer, during which she became increasingly dissatisfied with th e chaos typically found in web content projects... .", "blog": "http://sarawb.com", "photo": "speaker-s-wachter-boettcher.jpg" } } }
113
114
Responsywne strony WWW
Podstawowe informacje o sesji i prelegencie zostały uzupełnione o następujące metadane: data i godzina rozpoczęcia sesji zapisane w formacie zrozumiałym dla komputera
(i zawierającym informacje o strefie czasowej); dane opisowe wyjaśniające przeznaczenie sesji, dodane w formie znaczników; informacje o lokalizacji pozwalające na wskazanie fizycznej lokalizacji sesji; informacje o strumieniach medialnych i notatkach do slajdów, stanowiących mate-
riały konferencyjne dostępne po zakończeniu sesji. Po dodatkowych przemyśleniach bez większych problemów można by także dodać kolejne metadane. Kluczem jest konsekwencja. Pierwszym elementem tego procesu jest zapewnienie łatwości zarządzania metadanymi, a drugim stworzenie takiego modelu pracy, który wspiera tworzenie metadanych oraz ogranicza rodzaj treści, jakie mogą być publikowane bez nich. Teraz, kiedy dysponujemy już treścią o określonej strukturze uzupełnioną metadanymi, możemy zacząć zastanawiać się nad tym, jak modyfikować sposób ich prezentacji w zależności od kontekstu. Przykład zmodyfikowanej postaci strony prelegentów na witrynie Web Directions South przedstawia rysunek 5.5.
Rysunek 5.5. Użytkownicy urządzeń mobilnych (lub komputerów stacjonarnych) mogą korzystać z prezentacji dostosowanej do kontekstu
Tych samych treści można użyć podczas trwania konferencji na stronie What’s On, prezentującej informacje o tym, co w tej chwili się dzieje. Przykład tej strony przedstawia rysunek 5.6.
RESPONSYWNA TREŚĆ
Rysunek 5.6. Treść ułatwiająca uczestnikom odszukanie sesji, które mogą ich zainteresować
Treści wspomagające Treści wspomagające (ang. supporting content) nie są ani metadanymi, ani treściami podstawowymi. Poniżej przedstawiliśmy kilka przykładów takich treści: większość treści multimedialnych, obramowania i nagłówki, dymki i wyróżnione cytaty, odwołania.
Treści tego typu wzbogacają wrażenia użytkowników (zwłaszcza na stronach WWW, gdzie bez żadnych problemów można stosować wiele warstw treści), jednak ich brak w żadnym stopniu nie wpływa negatywnie na treść podstawową. Jawne określenie tych treści jako „wspomagających” ułatwia tworzenie struktury, która będzie bardziej modularna i logiczna. W wielu dokumentach te treści wspomagające są nieprawidłowo umieszczone bezpośrednio w treści podstawowej. To właśnie tego rodzaju treści najczęściej przysparzają problemów podczas prób aktualizacji projektu strony, gdyż zawierają formatowanie lub inny kod, który je uzupełnia. Należy się zatem upewnić, że wszystkie treści wspomagające są dołączone do treści podstawowej, a jednocześnie od niej odseparowane — okaże się wtedy, że łatwiej można ich używać na wiele różnych sposobów. To są właśnie korzyści, jakie zapewnia możliwość podziału treści na fragmenty.
115
118
Responsywne strony WWW
zapytania medialne, obrazy adaptacyjne oraz siatki — by je odpowiednio rozmieszczać i prezentować na stronach. Czy możemy zrobić coś jeszcze, by poprawić responsywność treści?
Leniwe wczytywanie Technika leniwego wczytywania (ang. lazy loading) pozwala poprawić szybkość wczytywania strony poprzez pobieranie tylko tych obrazów, które są widoczne w obszarze prezentacyjnym6. Kiedy użytkownik zacznie przewijać stronę w dół, pozostałe obrazy będą pobierane, gdy stanie się to konieczne. Wcześniej czy później wszystkie pliki zewnętrzne zostaną pobrane i użyte, niemniej jednak jest to znacznie bardziej inteligentny sposób ich wykorzystania — zwłaszcza z punktu widzenia użytkowników dysponujących łączem o ograniczonej przepustowości.
Selektywne wczytywanie treści Selektywne wczytywanie treści (ang. Selective Content Loading, w skrócie: SCL) polega na wczytywaniu przez stronę niewielkich fragmentów treści po tym, jak użytkownik zażądał jej wyświetlenia, a nie na jednokrotnym pobraniu całej jej zawartości. Stosowanie tej techniki może przyczynić się do znacznego poprawienia wydajności działania, zwłaszcza w przypadkach gdy używane jest łącze o ograniczonej przepustowości, na przykład w razie korzystania z telefonów komórkowych lub kiepskiej sieci. Poniżej przedstawiliśmy zasadę działania tego rozwiązania. 1. W ramach obsługi pierwszego żądania odwołującego się do danej strony przesyłana jest jej podstawowa zawartość, na którą składają się elementy nawigacyjne, fragment treści, arkusze stylów oraz pliki JavaScript. 2. Po wyczytaniu strony modyfikowane są wszystkie odnośniki, tak by zamiast standardowych żądań były generowane żądania XMLHttpRequest (czyli żądania XHR). 3. Następnie obsługiwana jest odpowiedź (odpowiedzi XHR będą zawierać wyłącznie fragmenty treści umieszczanych na stronie, a nie całą jej zawartość), a bieżąca treść strony zostaje zastąpiona nową, przygotowaną z wykorzystaniem szablonów7. 4. Następnie można użyć metody pushState() należącej do API obsługującego historię przeglądarki, by zmodyfikować historię przeglądanych stron (dzięki temu w danych odwiedzonych stron zostanie zapisany odpowiedni adres URL, który będzie można udostępnić, a w razie potrzeby także ponownie wyświetlić). Trzeba jednak pamiętać, że w niektórych okolicznościach opisywane tu rozwiązanie może nie działać lub będzie powodować problemy. Bez zachowania należytej ostrożności może 6
Oto doskonały dostosowany do urządzeń mobilnych przykład wykorzystania leniwego wczytywania: http://www.metaltoad.com/blog/improved-lazy-loading-mobile-devices-iphone-android-lazy-load-17.
7
Doskonałym przykładem narzędzia do obsługi takich szablonów jest Handlebars.js: http://handlebarsjs.com.
120
Responsywne strony WWW
mobilnych oraz komputerów stacjonarnych, jednak w coraz większym stopniu w taki sposób zaczynają być obsługiwane także tablety. W rozwiązaniach tego typu, zależnie od kontekstu, do użytkowników przekazywane są zupełnie inne dokumenty HTML, CSS i skrypty JavaScript. Mimo że używana jest ta sama treść podstawowa, to w zależności od kontekstu będzie ona wyświetlana w zupełnie inny sposób. Największą zaletą tego rozwiązania jest możliwość przygotowania podstawowych szablonów i zoptymalizowania ich pod kątem konkretnej platformy. Zazwyczaj definiuje się w tym celu zestaw podstawowych kontekstów, a następnie dla każdego z nich stosuje się podstawowe zasady metodologii RWD. Na przykład takimi kontekstami mogłyby być: „komputery stacjonarne”, „telefony komórkowe” oraz „tablety”. W ramach każdego z tych kontekstów można następnie zastosować podstawowe techniki RWD, by dostosować aplikację do wszelkich zmian w obrębie danego kontekstu (takich jak układ poziomy i pionowy w przypadku telefonów komórkowych lub różne wielkości ekranów w przypadku tabletów). Skoro tworzone szablony są unikalne, możemy pójść jeszcze dalej i w razie potrzeby w każdym z kontekstów zastosować odpowiednio zoptymalizowane biblioteki. Na przykład na stronach wyświetlanych na komputerach stacjonarnych moglibyśmy używać jQuery, a na stronach dla urządzeń mobilnych — Zepto9. W ten sposób będziemy w stanie wybrać i zastosować optymalne techniki dla konkretnego kontekstu, zapewniając użytkownikom możliwie najlepsze wrażenia.
Decyzje dotyczące domeny Powinniśmy unikać zmieniania używanych adresów URI10. Przemawiają za tym ważkie powody, na przykład w przypadku powielania treści wyszukiwarki mogą mieć problemy z określeniem, który adres URI jest prawidłowy, a oprócz tego możemy mieć kłopoty z otrzymaniem pewności, że użytkownicy będą wiedzieli, jaką stronę mają wyświetlić. Wiele aplikacji internetowych (w tym także aplikacje firmy Google) używa wielu domen, by łatwiej dostosować wrażenia użytkowników do stosowanej platformy. Jeśli okaże się, że musimy udostępniać treści, używając kilku domen (na przykład www. przyklad.com.pl oraz m.przyklad.com.pl), a jednocześnie treść na każdej z tych domen jest taka sama, to dalsze części wzorców URI należy pozostawić w takiej postaci, by sobie odpowiadały. Innymi słowy: pod względem treści strony m.przyklad.com.pl/sciezka/do/pliku oraz www.przyklad.com.pl/sciezka/do/pliku powinny oznaczać to samo. Pierwsza z nich powinna prezentować treści w sposób dostosowany do urządzeń mobilnych, natomiast druga — do komputerów stacjonarnych.
9
http://zeptojs.com/.
10
Na stronie: http://www.w3.org/Provider/Style/URI.html można znaleźć wypowiedź Tima Burnersa-Lee na ten temat.
RESPONSYWNA TREŚĆ
Zaletą korzystania z wielu domen jest możliwość wykorzystania różnych serwerów aplikacji do udostępniania i obsługi aplikacji oraz zapewnienia ich niezależności, co pozwala na podejmowanie decyzji architektonicznych związanych ze sposobem działania każdego z kontekstów (takich jak na przykład wykorzystanie pamięci podręcznej czy potrzeby każdego z serwerów). Oprócz tego jeszcze jedną, niewielką zaletą jest możliwość umieszczenia w materiałach reklamowych informacji o mobilnej wersji witryny (na przykład m.przyklad.com.pl), sygnalizując tym samym użytkownikom urządzeń mobilnych, że z myślą o nich przygotowaliśmy specjalną wersję aplikacji. Zabieg ten szybko jednak straci swój efekt, gdyż użytkownicy w coraz większym stopniu zaczynają oczekiwać takiego traktowania. Czasami w poszczególnych domenach będziemy dostarczać całkowicie unikalnych wrażeń, dlatego też stosowanie identycznych ścieżek w adresach URI w poszczególnych domenach (na przykład m.przyklad.com.pl/mobilne/unikalna/strona oraz www.przyklad.com.pl/stacjo narne/unikalna/strona) nie będzie miało większego sensu. Jeśli tak się dzieje w naszym rozwiązaniu, to musimy zapewnić, że te same treści w poszczególnych kontekstach mają identyczne wzorce adresów URI, tam zaś, gdzie treści są różne, należy zastosować alternatywną strukturę adresów. Dzięki temu można nieco zmniejszyć zamieszanie, które wśród użytkowników, botów oraz innych konsumentów naszych treści może wywołać zastosowanie wielu domen.
Trasowanie przeglądarek Jeśli dotrzemy do punktu, w którym nasze treści są udostępniane przy wykorzystaniu dwóch (lub większej liczby) domen, to szybko okaże się, że staniemy przed problemem wyboru jednej z nich do obsługi użytkowników, którzy odwiedzili witrynę, używając urządzenia „nieodpowiedniego” typu. Można to zrobić na kilka sposobów, zależnie od używanych serwerów WWW oraz dokładnej natury zastosowanej konfiguracji. Jeśli chodzi o algorytm postępowania, to problem odpowiedniego kierowania użytkowników został zilustrowany na rysunku 5.7. Poniżej opisaliśmy ten schemat nieco bardziej szczegółowo. 1. Jeśli użytkownik wyraził swoje preferencje, ogólne bądź dotyczące bieżącej sesji, co do konkretnej wersji witryny, należy je zaakceptować i udostępnić mu to, o co prosi. Zawsze należy także udostępnić dobrze widoczną i zrozumiałą opcję pozwalającą na zmianę preferencji. 2. Wykrywamy typ urządzenia, którym posługuje się użytkownik (jednym ze sposobów jest określenie przeglądarki, jednak wybór można także potwierdzić, wykorzystując zapytania medialne oraz skrypty JavaScript, i na ich podstawie wymusić odpowiednie przekierowanie). W razie jakichkolwiek wątpliwości należy przyjąć, że użytkownik posługuje się jakimś urządzeniem mobilnym, gdyż są one o wiele bardziej zróżnicowane niż komputery stacjonarne i laptopy. Oprócz tego przekazanie użytkownikom mobilnym wersji witryny przeznaczonej dla komputerów stacjonarnych ma znacznie większy wpływ na doznania użytkowników niż przekazanie użytkownikom komputerów stacjonarnych witryny w wersji mobilnej.
121
122
Responsywne strony WWW
Rysunek 5.7. Proces ułatwiający określenie, którą wersję konkretnej strony należy udostępnić
3. Jeśli użytkownik korzysta z „nieodpowiedniego” urządzenia, to należy sprawdzić, czy istnieje jakaś wersja witryny, która lepiej odpowiada temu urządzeniu (można to zrobić stosunkowo łatwo, jeśli adresy URI używane w poszczególnych wersjach witryny będą identyczne, gdyż w takim przypadku wszystkie strony powinny istnieć w każdej wersji witryny). Jeśli uda się ją znaleźć, to można skierować użytkownika na odpowiednią stronę, używając przekierowania HTTP. 4. Jeśli jednak nie ma żadnej lepszej wersji strony o tej samej treści, to należy wyświetlić użytkownikowi stronę, o którą prosił. Trzeba unikać przekierowywania użytkowników na stronę informującą o błędzie 404 lub na stronę główną docelowej domeny. Użytkownik nie popełnił żadnego błędu — popełni go aplikacja, przekierowując użytkownika na nieistniejącą stronę. 5. Należy zapewnić, że wersja witryny przeznaczona dla komputerów stacjonarnych będzie korzystać przynajmniej z podstawowych zapytań medialnych. Dzięki temu jeśli na tę wersję strony trafią użytkownicy mobilni, zapytania medialne odegrają rolę ostatniego skutecznego zabezpieczenia.
RESPONSYWNA TREŚĆ
6. Na każdej stronie (na przykład w stopce) powinniśmy udostępnić opcję pozwalającą na wyświetlenie innej wersji witryny. Jeśli użytkownik ją kliknie, to przynajmniej na okres trwania bieżącej sesji powinien zostać przeniesiony na wybraną wersję witryny (chyba że w inny sposób wymusi zmianę). Jeśli będziemy postępować zgodnie z tymi regułami, użytkownicy powinni trafiać na tę wersję witryny, która zapewnia im najlepsze wrażenia, i to nawet w przypadku wystąpienia jakichś problemów. Szczególną uwagę należy zwrócić na czwarty punkt powyższej listy, dotyczący wyświetlania strony błędów. Większość użytkowników mobilnych doświadczyło kiedyś błędnych przekierowań — problemy te najczęściej występują na tych witrynach, na których adresy URI stosowane w wersji mobilnej i w wersjach pozostałych nie są idealnie zsynchronizowane.
Trasowanie szablonów O trasowaniu szablonów mówimy, gdy jedna domena udostępnia treści oraz kompletne szablony (HTML, CSS, JavaScript i inne) dostosowane do danego kontekstu. Wszyscy użytkownicy odwołują się do tej samej domeny i logiki aplikacji, jednak do obsługi żądań używa się szablonów w pełni dostosowanych do konkretnej używanej platformy, tak jak pokazano na rysunku 5.8.
Rysunek 5.8. Udostępnianie treści dostosowanych do urządzeń mobilnych, tabletów i komputerów stacjonarnych
Trasowanie szablonów działa wyłącznie w tych scenariuszach, gdy cała witryna oraz jej funkcjonalności są przedstawiane we wszystkich kontekstach (innymi słowy: zamiast udostępniać całkowicie inne typy wrażeń, udostępniane są jedynie sposoby ich przedstawienia). Aby takie rozwiązanie było możliwe, używane szablony oraz treści muszą być całkowicie od siebie oddzielone. Nowoczesne platformy do tworzenia aplikacji, takie jak Django11 lub 11
http://www.djangoproject.com.
123
124
Responsywne strony WWW
Ruby on Rails12, wymuszają tę separację, stosując wzorzec MVC (model – widok – kontroler), dzięki któremu można ją dość łatwo zapewnić. Podobne rozwiązania istnieją w języku PHP13 oraz na platformie .NET14. W takim przypadku widok obsługuje całą logikę biznesową aplikacji oraz interakcję z użytkownikiem, natomiast rolą kontrolera jest określenie sposobu prezentacji treści statycznych. W standardowych aplikacjach oznacza to określenie typu urządzenia odwołującego się do witryny (takiego jak telefon komórkowy, tablet lub komputer stacjonarny) oraz wybór odpowiedniego szablonu, który powinien zostać użyty do wyświetlenia treści. Technika trasowania szablonów zapewnia następujące korzyści: wszyscy użytkownicy (w tym także boty) są obsługiwani przy użyciu jednej domeny; istnieje możliwość zapewnienia konkretnych wrażeń dla poszczególnych platform; nie występuje marnowanie treści (oznacza ono, że treści, które są dostarczone do
przeglądarki, nie zostają użyte, gdyż są nieodpowiednie dla danej platformy); różne wrażenia użytkowników mogą mieć różne priorytety, w zależności od platformy; cała logika aplikacji jest umieszczona w jednym miejscu.
Kiedy już zaczniemy podążać tą drogą, uzyskamy możliwość skorzystania z innych opcji, takich jak rozważania o innych typach kontekstów i szablonach, których można by w nich używać. Na przykład zachowując tę samą, podstawową logikę działania widoków, można by stworzyć kontroler wraz z zestawem szablonów przeznaczony specjalnie dla „nowych użytkowników” oraz ich szczególnych potrzeb. W przypadku mobilnej witryny Cotton On, przedstawionej na rysunku 5.9, bardzo duże znaczenie mają mechanizmy wyszukiwania, pozwalające na szybkie przenoszenie użytkowników na strony produktów, z kolei wersja witryny przeznaczona na komputery stacjonarne i tablety, ze względu na większy format, prezentuje szerszą gamę produktów i promocji. Obie wersje witryny korzystają z tych samych danych i są obsługiwane przez tę samą domenę, która w różnych kontekstach używa innych szablonów.
Określanie, jak daleko można się posunąć Zamiast decyzji o zapewnieniu responsywności wszystkich elementów składających się na treść witryny, rozsądnym punktem wyjścia jest wyznaczenie pewnych granic — na przykład możemy założyć, że początkowo będziemy obsługiwać jedną dodatkową platformę. Zdobywanie doświadczenia i wyciąganie wniosków z sukcesów i porażek może nam pomóc
12
http://rubyonrails.org/.
13
http://www.tinymvc.com/.
14
http://www.asp.net/mvc.
RESPONSYWNA TREŚĆ
Rysunek 5.9. W mobilnej wersji witryny Cotton On duże znaczenie mają narzędzia wyszukiwania
w wypracowaniu sposobu, w jaki stopniowo będziemy rozszerzali responsywność naszych systemów. Jedynym sposobem, w jaki można to zrobić, jest zabranie w tę podróż także firmy, w której pracujemy. Poniższe pytania pomogą nam określić, jak daleko możemy się posunąć i co możemy osiągnąć. Jakie korzyści lub rozwiązania zapewnia naszym użytkownikom responsywna treść? Użytkownicy zawsze są najważniejsi. Priorytety treści i funkcjonalności należy określić na podstawie tego, jakie wrażenia użytkownicy chcą czerpać z naszych usług. Jakimi umiejętnościami związanymi z tworzeniem treści dysponuje nasz zespół? Zapewnienie responsywności treści często oznacza przynajmniej nadanie jej odpowiedniej struktury, i to nawet w przypadku, gdy tworzenie nowej treści nie jest konieczne. Czy dysponujemy pracownikami lub umiejętnościami, które nam na to pozwolą? Czy konieczne będzie odpowiednie przeszkolenie autorów lub dodanie nowych procesów, które by pomogły im w pracy? Należy także określić, czy pożądanym celem będzie współpraca z autorami dysponującymi znajomością języka HTML. (Wskazówka: umiejętności związane z tworzeniem stron WWW zawsze są pożądane, jeśli zatem spotkamy się z oporem, to warto je przyjąć jako wymóg współpracy). Co możemy osiągnąć poprzez użycie odpowiedniego rozwiązania technicznego? Wiele systemów zarządzania treścią zostało zaprojektowanych bez zwracania uwagi na responsywność treści — dotyczy to w szczególności dużych, korporacyjnych rozwiązań przeznaczonych do dostarczania treści dla komputerów stacjonarnych. Podstawowym
125
126
Responsywne strony WWW
celem większości systemów CMS jest maksymalne ułatwienie procesu tworzenia treści i wyeliminowanie konieczności, by osoby tworzące strony znały język HTML. Poznanie możliwości używanego rozwiązania pozwala określić, czy trzeba w nim będzie wprowadzić jakieś zmiany, czy nie. Czy powinniśmy stosować dostosowane treści, czy całkowicie odmienne wrażenia? To trudna decyzja, w dodatku jedna z tych, które mogą być przyczyną wielu sporów. Podstawowym pytaniem jest, w jakim stopniu nasze usługi będą przydatne dla użytkowników we wszystkich kontekstach. Zrozumienie i określenie, czego użytkownicy mogą używać w poszczególnych kontekstach, może pomóc w podjęciu decyzji o dostosowywaniu treści. Jeśli w jednym z kontekstów wrażenia będą dostosowywane poprzez ograniczanie funkcjonalności lub treści, to należy zapewnić użytkownikom możliwość przejścia do „pełnej” wersji witryny. Jak obecnie wygląda interakcja użytkowników z witryną? Zdobądź informacje na ten temat, używając istniejących danych. Tam, gdzie to możliwe, warto skorzystać z istniejących danych, by ułatwić sobie podjęcie decyzji o modyfikowaniu treści na podstawie kontekstu użytkownika. Analizując popularne ścieżki, jakimi poruszają się użytkownicy po witrynie, zanim jeszcze zaczniemy optymalizować ją pod kątem różnych platform, można zdobyć interesujące informacje na temat tego, czego użytkownicy oczekują w poszczególnych kontekstach.
Dostosowanie Zapewnienie responsywności treści jest w równym stopniu zależne od odpowiedniego przeszkolenia autorów i modyfikacji procesu wytwarzan ia treści co od zastosowanych rozwiązań technicznych i projektowych. Pierwsze próby będą zapewne trudne, jednak końcowy efekt na pewno się opłaci: zniknie konieczność ponownego tworzenia treści i będzie można używać jej w innych kontekstach, także tych, które mogą się pojawić w przyszłości15. Oto kluczowe zagadnienia, o których należy pamiętać. Zacznijmy od użytkownika i podążajmy w kierunku treści i systemów. W jaki spo-
sób użytkownik chce korzystać z treści i w jakich kontekstach je przegląda (na telefonach komórkowych czy komputerach stacjonarnych; czy dysponuje szybkim łączem stałym, czy wolnym połączeniem na urządzeniu mobilnym; czy użytkownik jest nowicjuszem, czy doświadczonym ekspertem i tak dalej)?
15
Dołącz do nas i dowiedz się więcej o przystosowywaniu swoich aplikacji pod kątem przyszłych zmian na witrynie http://futurefriendlyweb.com/.
RESPONSYWNA TREŚĆ Czy jesteśmy w stanie (zarówno pod względem technicznym, jak i pod względem
procesu wytwarzania) dostarczać użytkownikom odmiennych wrażeń zależnie od domeny, z jakiej będą korzystać? Jeśli nie, to należy zadbać o to, by kod HTML był możliwie prosty, a dla użytkowników dysponujących większymi możliwościami zapewnić wczytywanie dodatkowych treści. Zawsze trzeba zadbać o konsekwentne stosowanie adresów URI we wszystkich usłu-
gach. Nigdy nie należy kierować użytkowników na stronę z komunikatem o błędzie w wyniku problemów z wygenerowanym przez aplikację przekierowaniem pomiędzy jej różnymi wersjami. Należy wyjaśnić całemu zespołowi korzyści, jakie zapewnia prawidłowa struktura
treści, zwracając szczególną uwagę na to, że możliwość dzielenia treści na fragmenty pozwala na ich wielokrotne stosowanie i reorganizację bez konieczności ich ponownego tworzenia.
127
128
Responsywne strony WWW
130
Responsywne strony WWW
szablonów, w tym także wspólne cele, jakim służą popularne szablony używane do tworzenia stron WWW. Następnie zajmiemy się czynnikami, jakie należy brać pod uwagę podczas projektowania własnego szablonu. Wiedząc, jak zbudować własny szablon, będziemy w stanie stworzyć spersonalizowany zestaw szablonów dostosowanych do potrzeb naszych projektów i jednocześnie w maksymalnym stopniu wykorzystujących możliwości wielokrotnego użycia kodu, na przykład: jeden szablon dla projektów przeznaczonych dla jednego klienta i zależny od jego docelowej grupy użytkowników, jeden dla aplikacji przeznaczonych dla firm związanych z przemysłem internetowym, jeden dla małych i średnich firm i jeszcze jeden przeznaczony do modernizacji złożonych, starych witryn korporacyjnych. Efektywne zastosowanie szablonów może nam pomóc w błyskawicznym tworzeniu nowych, responsywnych witryn oraz w modernizacji i zapewnianiu responsywności witryn już istniejących. Na samym końcu rozdziału zajmiemy się zagadnieniem włączania respnsywnych szablonów do naszego cyklu pracy, wykorzystując przy tym preprocesory, narzędzia do zarządzania zależnościami oraz inne narzędzia programistyczne.
Tworzenie prostego szablonu strony WWW Prosty szablon może mieć następującą, przykładową postać:
W jednym pliku umieściliśmy prawidłową deklarację typu dokumentu oraz dobrą pod względem semantycznym, choć prostą strukturę składającą się z elementu title w sekcji head i pustego elementu body. Oprócz tego określiliśmy sposób kodowania dokumentu. Niemal każdy, kto zajmuje się tworzeniem stron WWW, zna taki szablon na pamięć lub ma w edytorze skrót pozwalający na jego wygenerowanie.
Gotowe szablony Zajmijmy się teraz nieco bardziej zaawansowanymi rozwiązaniami. Istnieje wiele szablonów przeznaczonych do tworzenia responsywnych stron WWW. Bardzo wiele można się nauczyć, analizując je i wyodrębniając z nich te elementy, które mogą nam się przydać.
132
Responsywne strony WWW
Bootstrap Bootstrap zapewnia znacznie większe możliwości funkcjonalne niż HTML5 Boilerplate. H5BP jest minimalnym szablonem (choć są tacy, którzy nie zgadzają się z tym twierdzeniem4) przeznaczonym dla osób, które chcą mieć maksymalną kontrolę. Bootstrap przyjmuje przeciwny punkt widzenia i udostępnia nie tylko sam szablon, lecz także wiele innych narzędzi, które mogą nam się przydać. Oznacza to, że wraz z nim uzyskujemy ustawienia wielkości czcionek, system siatek oraz responsywność. Jeśli domyślne ustawienia Bootstrapa nam nie odpowiadają, to korzystając z niewielkiego narzędzia na jego witrynie5, możemy określić, które jego elementy nas interesują. Dzięki temu, że Bootstrap jest generowany przy użyciu narzędzia LESS 6, pozwala na podawanie wartości zmiennych i na ich podstawie tworzy spersonalizowany arkusz stylów, który możemy pobrać i zastosować w naszym projekcie. Efekty zastosowania takiego arkusza przedstawia rysunek 6.2.
Rysunek 6.2. Ten sam kod HTML, nowy wygląd, minimalny nakład pracy
Używając tego samego kodu HTML i wprowadzając jedynie kilka głównych zmiennych na witrynie Bootstrapa, możemy utworzyć całkowicie spersonalizowany temat bez konieczności własnoręcznego używania narzędzia LESS.
Foundation Foundation7 to responsywny szablon stworzony przez zespół ZURB, zaprojektowany, by od razu zapewniać responsywność, i oparty na siatce mogącej dostosowywać się do różnych urządzeń. Jego najnowsza wersja została stworzona zgodnie z ideą, by w pierwszej kolejności tworzyć rozwiązania przeznaczone dla urządzeń mobilnych, i nie korzysta z jQuery, lecz z zajmującej mniej miejsca biblioteki Zepto. Szablon Foundation jest w znacznej mierze przeznaczony do szybkiego tworzenia prototypów, zachęca do modyfikacji projektów
4
http://csswizardry.com/2011/01/the-real-html5-boilerplate/.
5
http://twitter.github.com/bootstrap/customize.html.
6
http://lesscss.org.
7
http://foundation.zurb.com/.
RESPONSYWNY SZABLON
i pozwala unikać powszechnego problemu szablonu Bootstrap, polegającego na tym, że wszystkie witryny tworzone przy jego użyciu mają podobny wygląd. Choć początkowo jego przeznaczeniem było tworzenie prototypów, stopniowo rozwija się i przekształca w doskonałą platformę do projektowania stron.
Skeleton Skeleton8 jest minimalistyczną platformą przeznaczoną głównie do tworzenia stron wyświetlanych na niewielkich ekranach, takich jak te w telefonach komórkowych, choć pozwala także na skalowanie do większych wymiarów. W większych rozdzielczościach Skeleton jest oparty na rozwiązaniu podobnym do 960 Grid System, natomiast w mniejszych rozmieszcza elementy jeden nad drugim lub całkowicie je usuwa. Platforma ta najlepiej nadaje się do tworzenia witryn o charakterze mobilnym, które mogą zapewniać użytkownikom całkowicie inne wrażenia niż te na komputerach stacjonarnych.
Semantic Grid System Projekt Semantic Grid System9 przyjmuje inne podejście do tworzenia standardowego systemu siatki, wykorzystując do tego celu potęgę preprocesorów CSS (obsługiwane są takie narzędzia, jak LESS, Sass/SCSS10 oraz Stylus11) oraz bardziej semantyczny kod HTML. Jego głównym celem jest zapewnienie możliwości pozbycia się tradycyjnych rozwiązań przypominających poniższy fragment kodu: ...
W powyższym przykładzie kod HTML jest zaśmiecony instrukcjami określającymi postać układu, które przestają mieć znaczenie, gdy wygląd strony zaczyna się elastycznie dostosowywać do dostępnego obszaru. Na przykład na niewielkich urządzeniach mobilnych klasy span3 oraz span4 najprawdopodobniej będą zajmowały całą dostępną szerokość. Niestety, w ostatnim czasie aktywność prac nad projektem była bardzo mała. Mimo to jego podstawowe możliwości są dobre i stanowi on godną rozważenia alternatywę, jeśli poszukujemy eleganckiego rozwiązania wykorzystującego strukturalny kod HTML i jeśli zależy nam na stosowaniu różnych arkuszy CSS w zależności od typu urządzenia.
8
http://www.getskeleton.com/.
9
http://semantic.gs.
10
http://sass-lang.com/.
11
http://learnboost.github.com/stylus/.
133
134
Responsywne strony WWW
320 and Up Ten projekt został stworzony przez Andy’ego Clarka12, by zaspokoić zapotrzebowanie na responsywną platformę, napisaną z myślą o tworzeniu aplikacji dla urządzeń mobilnych, a następnie progresywnie rozszerzaną, aby nadawała się także do tworzenia stron przeznaczonych dla komputerów stacjonarnych, a nie na odwrót — ograniczaną, aby nadawała się do użycia na urządzeniach mobilnych. Sam projekt jest wzorowany na HTML5 Boilerplate, Bootstrapie oraz innych podobnych rozwiązaniach. Godne odnotowania jest udostępnienie powiązań z tą platformą w takich narzędziach, jak LESS, Sass/SCSS oraz Compass, co znacznie ułatwia korzystanie z niego wszystkim osobom, które znają któryś z tych preprocesorów.
Tworzenie własnego szablonu Każde gotowe rozwiązanie będzie się opierać na pewnych założeniach dotyczących projektu. Takie rozwiązania nie będą się nadawały do wykorzystania w niektórych projektach i zespołach wykorzystujących określony tok pracy lub pewne style kodowania. Spróbujmy zatem stworzyć własny szablon i podczas pracy nad nim przeanalizować jego podstawowe elementy, takie jak: struktura katalogów, neutralizacja CSS, podstawowy kod i biblioteki (struktura kodu HTML, CSS i JS), przygotowywanie pakietu.
Struktura katalogów oraz podstawowe pliki Dobra aplikacja internetowa składa się z bardzo wielu plików, dlatego nadanie im odpowiedniej struktury może nam pomóc w zachowaniu logicznej spójności projektu oraz ułatwić jego utrzymanie. Standardowym rozwiązaniem jest umieszczenie niewielkiej liczby plików w katalogu głównym, a wszystkich pozostałych w logicznej strukturze podkatalogów, takich jak te przedstawione na rysunku 6.3. Katalog główny powinien być przejrzysty i uporządkowany, gdyż jest on punktem wyjścia do całego projektu i musi zawierać wiele różnych plików i metadanych, takich jak: główny plik witryny; plik robots.txt; pliki ikon; przeróżne ikony stosowane w systemie iOS; pliki używane przez serwer, takie jak .htaccess oraz inne pliki konfiguracyjne;
12
http://stuffandnonsense.co.uk/projects/320andup/.
RESPONSYWNY SZABLON
Rysunek 6.3. Zadbaj o porządek w katalogu głównym pliki używane przez systemy kontroli wersji, takie jak .gitignore; plik crossdomain.xml w razie konieczności zapewnienia dostępu pomiędzy różnymi
domenami w takich technologiach, jak Flash lub Silverlight (lub innych technologiach, które go używają). Ogólnie przyjęte dobre praktyki zalecają także utworzenie następujących plików: humans.txt, zawierającego informacje o zespole tworzącym projekt; readme, zawierającego informacje o projekcie; LICENSE (dotyczy to zwłaszcza projektów udostępnianych jako otwarte oprogra-
mowanie); CONTRIBUTING, zawierającego informacje o tym, w jaki sposób programiści mogą
pomagać w rozwoju otwartego projektu; pliki zależności, takie jak requirements.txt, Gemfile lub package.json13.
To całkiem sporo plików, które powinny znajdować się w katalogu głównym witryny, łatwo zatem zrozumieć, dlaczego umieszczenie wszystkich pozostałych w odpowiednio zorganizowanej strukturze podkatalogów może być bardzo pomocne. Zazwyczaj w najprostszym przypadku tworzone są następujące katalogi: katalog przeznaczony dla obrazów (zazwyczaj nadaje mu się nazwę img, images lub i); katalog plików CSS (zazwyczaj nosi on nazwę css, styles lub stylesheets); katalog skryptów JavaScript (zwyczajowo nazywany js, scripts lub javascripts).
Oprócz tego, zależnie od używanej platformy oraz bibliotek, można zdecydować się także na utworzenie innych katalogów. Na przykład można utworzyć osobne katalogi dla plików statycznych lub strukturalnych — podstawowych plików używanych przez witrynę — oraz 13
Takie pliki są powszechnie używane na platformach wyposażonych w narzędzia do zarządzania pakietami, służące do instalowania zależności; przykładami takich narzędzi są: PyPI (Python Package Index) stosowany w języku Python (http://pypi.python.org/pypi), RubyGems (http://rubygems.org/) używany w języku Ruby oraz NMP (https://npmjs.org/) stosowany na platformie Node.js.
135
136
Responsywne strony WWW
plików multimedialnych, takich jak obrazy i wszelkie inne pliki przesyłane na serwer przy użyciu systemu CMS lub przez użytkowników. Zastosowanie takiego podziału ułatwia zachowanie porządku oraz zarządzanie dodatkowymi plikami wykorzystywanymi na witrynie.
Pliki i struktura katalogów na witrynie Web Directions South Zobaczmy, jak to działa w praktyce. Wciąż będziemy posługiwali się wybraną wcześniej jako przykład stroną Web Directions South, na której zdecydowaliśmy się zastosować zwarte nazwy katalogów, by nieco skrócić adresy URL (w każdym z nich zaoszczędzimy kilka bajtów!): katalog img zawiera wszystkie używane obrazy; katalog css zawiera wszystkie arkusze stylów; katalog js zawiera skrypty; katalog lib zawiera dodatkowe biblioteki JavaScript.
Jeśli chodzi o podstawowe pliki, to poniżej przedstawimy kilka wybranych spośród nich, a w dalszej kolejności napiszemy dokument index.html. Z platformy 320 and Up wykorzystamy domyślny plik robots.txt: rozdzial06/boilerplate/robots.txt # www.robotstxt.org/ # http://code.google.com/web/controlcrawlindex/ User-agent: *
oraz plik humans.txt: rozdzial06/boilerplate/humans.txt (fragment) /* humanstxt.org */ /* TEAM */ Name: eg: Andy Clarke Site: eg: http://stuffandnonsense.co.uk Twitter: eg: @malarkey Location: eg: UK /* THANKS */ Conor MacNeill (http://twitter.com/thefella) for the responsive type PHP port. https://github.com/thefella/Responsive-type-references Lennart Schoors (http://twitter.com/lensco) for the responsive design test page https://gist.github.com/1685127 /* SITE */ Standards: HTML5
RESPONSYWNY SZABLON CSS3 Components: 320 and Up: http://stuffandnonsense.co.uk/projects/320andup ...
Jeśli dwa powyższe pliki są dla kogoś czymś zupełnie nowym, to powinien zajrzeć pod adresy stron zawartych w przedstawionych fragmentach, gdzie znajduje się więcej informacji na ich temat. Aby z powodzeniem zastosować ikony witryny na wielu różnych urządzeniach i zapewnić sobie przy tym ich piękny wygląd, funkcjonalność oraz możliwość umieszczania na ekranach głównych telefonów komórkowych, konieczne jest użycie właściwej kombinacji elementów link oraz obrazów o różnych wielkościach. Skorzystamy z platformy H5BP, by zdobyć plik favicon.ico i kilka sugestii dotyczących zbioru ikon, które będą używane na urządzeniach firmy Apple. To, które ikony udostępnimy oraz w jaki sposób zostaną one dołączone do witryny, jest ściśle powiązane z przeglądarkami oraz urządzeniami, które mają być przez tę witrynę obsługiwane. W tej książce zdecydowaliśmy się na kombinację elementów i atrybutów link, zapewniających stosunkowo dużą zgodność wstecz, niemniej jednak sugerujemy, by czytelnik sam poszukał dodatkowych informacji na ten temat. Połączymy dwa solidne sposoby udostępniania ikon14 w jednym rozwiązaniu, które można by uznać za mocno przesadzone. Wymaga ono dodania do naszej strony index.html następującego zestawu elementów link: rozdzial06/boilerplate/index.html (fragment)
14
http://mathiasbynens.be/notes/touch-icons oraz http://www.jonathantneal.com/blog/ understand-the-favicon/.
137
138
Responsywne strony WWW
Powyższy zestaw znaczników powinien prawidłowo obsługiwać różne urządzenia firmy Apple, urządzenia z systemem Android, przeglądarkę IE6+ oraz wszystkie nowoczesne przeglądarki. W komentarzach umieściliśmy także adresy stron, na których można znaleźć dodatkowe informacje dotyczące podjętych przez nas decyzji projektowych oraz dodatkowe wyjaśnienia (na przykład ). Umieszczanie takich komentarzy w kodzie szablonu może służyć podczas dalszych etapów prac jako przypomnienie wyjaśniające, dlaczego podjęliśmy konkretne decyzje. W przyszłości, wraz ze zmianami w technologii i stopniowym rezygnowaniem ze wsparcia starszych przeglądarek, mogą one posłużyć jako flagi wskazujące te komponenty szablonu, które będą wymagały aktualizacji. Wykorzystamy także wskazówki z HTML5 Boilerplate i dodamy do naszego szablonu pliki 404.html, .gitignore oraz corssdomain.xml, stanowiące przypomnienie o tych aspektach programistycznych, co do których powinniśmy podjąć jakieś decyzje. I w końcu, z tych samych powodów, dodamy do projektu także pliki CONTRIBUTING.md, LICENSE.md oraz README.md.
Neutralizacja i normalizacja Neutralizujące arkusze CSS (ang. CSS reset) to specjalne arkusze stylów opracowane w celu zniwelowania różnic pomiędzy domyślnymi stylami elementów HTML stosowanymi w różnych przeglądarkach. Ich działanie sprowadza się właściwie do usunięcia wszystkich domyślnych stylów tych elementów, których domyślny wygląd w różnych przeglądarkach jest odmienny. Na podobnej zasadzie działają normalizujące pliki CSS; także one służą do poprawiania niezgodności między przeglądarkami. Jednak zamiast usuwać wszystkie domyślne style, jak to się dzieje w przypadku arkuszy neutralizujących, pliki normalizujące zachowują wiele ustawień domyślnych, starając się przy tym zapewnić ich spójny wygląd w różnych przeglądarkach. Dzięki wykorzystaniu solidnych arkuszy neutralizujących lub normalizujących możemy zacząć tworzenie witryny od znanego, spójnego stanu początkowego. Na przykład możemy mieć pewność, że we wszystkich przeglądarkach marginesy i wypełnienia na naszej stronie będą takie same. Biorąc pod uwagę coraz lepsze wykorzystanie standardów przez twórców przeglądarek, należy przypuszczać, że dni całkowitego neutralizowania wszystkich właściwości modelu pudełkowego są już policzone, niemniej jednak w przeglądarkach wciąż występują pewne dziwactwa, które należy poprawiać.
RESPONSYWNY SZABLON
Dostępnych jest wiele rozwiązań służących do neutralizacji CSS, zaczynając od szacownego „Mayerweb Reset”, które neutralizuje wszystko15, a kończąc na normalize.css16. To ostatnie jest używane w takich projektach jak Bootstrap oraz H5BP i w większym stopniu dąży do zapewnienia spójności wyglądu w różnych przeglądarkach. Jeśli kogoś interesują dostępne rozwiązania służące do neutralizacji stylów, to ich obszerną listę można znaleźć na witrynie CSS Reset17. Ogólnie rzecz biorąc, należy zacząć od użycia jednego ze standardowych arkuszy neutralizujących, a następnie, w razie konieczności, wprowadzać w nim własne poprawki. W razie zastosowania całkowitej neutralizacji (lub normalizując style w celu zapewnienia jednolitego wyglądu stron w różnych przeglądarkach) należy unikać narzucania własnych stylów, takich jak firmowe czcionki lub kolory. Jeśli przekroczymy tę granicę, to prawdopodobnie zdecydujemy się umieszczać te reguły w bazowym arkuszu stylów, który przedstawimy już niebawem, w punkcie „Bazowy arkusz stylów”.
Neutralizacja na witrynie Web Directions South W naszym przykładzie zdecydowaliśmy się na zastosowanie pliku reset.css przedstawionego w rozdziale 4., w punkcie „Zapytania medialne w działaniu”, dlatego dodaliśmy do pliku index.html następujący element link: rozdzial06/boilerplate/index.html (fragment)
Podstawowe biblioteki Tworzenie solidnych podstaw nie ogranicza się do wyeliminowania różnic pomiędzy przeglądarkami w celu zapewnienia prawidłowego pozycjonowania elementów, miejsc na często pojawiające się fragmenty kodu, sposobów wykrywania możliwości urządzeń, na których jest wyświetlana strona, i tym podobnych. Oprócz neutralizacji stylów CSS do projektu można dodać także plik base.css, w którym zostaną zdefiniowane style określające wygląd podstawowych komponentów stron stosowanych w całej witrynie. Te podstawy mogą także obejmować kod HTML o odpowiedniej strukturze, globalne style CSS używane w całej witrynie oraz pliki JavaScript.
Strukturalny kod HTML Zależnie od przyjętej filozofii, dołączenie do szablonu podstawowego kodu HTML może być bardzo użyteczne. Na przykład w skład szablonu H5BP wchodzi gotowy kod HTML, udostępniany głównie po to, by wymuszać stosowanie najlepszych praktyk dotyczących 15 16 17
http://necolas.github.com/normalize.css/. http://www.cssreset.com/. http://www.cssreset.com/.
139
140
Responsywne strony WWW
rozmieszczania elementów na stronach, minimalizujących liczbę błędów i poprawiających wydajność stron18. Z drugiej strony umieszczanie w szablonie rozbudowanego kodu HTML będzie zazwyczaj niepotrzebną przesadą. Na przykład umieszczanie w szablonie paska nawigacyjnego byłoby zupełnie zbędne, gdyby cała tworzona aplikacja miała się składać z jednej strony, choć nawet w tym przypadku można by wypracować pewien kompromis: rozdzial06/boilerplate/index.html (fragment) ... ... ...
18
http://www.phpied.com/conditional-comments-block-downloads/.
RESPONSYWNY SZABLON
Ten stosunkowo minimalistyczny szablon powstał na podstawie wzorów zaczerpniętych z wielu źródeł, w tym także z HTML5 Boilerplate oraz Modernizr. Zgodnie z założeniem, by w pierwszej kolejności tworzyć rozwiązanie przeznaczone dla urządzeń mobilnych, komentarze warunkowe używane do wykrywania przeglądarek Internet Explorer dołączają do strony zapytania medialne testujące warunek !(IEMobile). Powyższy szablon zapewnia także prawidłowe pozycjonowanie elementów, zawiera miejsca na często występujące fragmenty kodu i przypomina o podaniu innych, podstawowych elementów witryny (takich jak pliki CSS, biblioteki JavaScript) oraz elementów zawartości (tytuł, nagłówek, główna treść strony i stopka).
Bazowy arkusz stylów Bazowy arkusz stylów powinien zawierać wszystkie globalne ustawienia określające postać witryny. W przypadku responsywnych witryn zapewne będziemy chcieli umieścić w tym pliku używany system siatki. Wybór konkretnego systemu będzie zależał od kodu, którego on wymaga, oraz od tego, czy witryna jest tworzona od początku, czy jedynie modernizowana. Na przykład przenoszenie starego, niesemantycznego kodu HTML do systemu siatki, który w znacznej mierze opiera się na klasach określających układ (takich jak .span4 i jej koleżanki), może być kiepskim pomysłem. Co więcej, jeśli nasza responsywna witryna powstaje zgodnie z założeniem, by w pierwszej kolejności tworzyć rozwiązanie dla urządzeń mobilnych, to ten bazowy arkusz stylów będzie czasami zawierał także definicje stylów przeznaczonych do użycia na konkretnych urządzeniach. Należy zadbać o to, by od tego arkusza nie wymagać zbyt wiele, gdyż jego przeładowanie może doprowadzić do poważnych problemów z dziedziczeniem stylów. Zamiast tego można tworzyć style, wykorzystując przy tym modularne, obiektowe podejście. Niestety, separacja plików, taka jak ta, którą zastosowaliśmy, prowadzi do zwiększenia liczby żądań niezbędnych do wyświetlenia strony. Ten problem można jednak rozwiązać, wykorzystując preprocesory CSS, którym przyjrzymy się dokładniej w dalszej części rozdziału, „Preprocesory CSS”.
Warto zwrócić uwagę na umieszczony w powyższym kodzie znacznik script. Modernizr jest przykładem biblioteki JavaScript służącej do progresywnego ulepszania witryn WWW przy wykorzystaniu wykrywania dostępnych możliwości. Choć biblioteka ta nie należy do małych, to jednak jest wyjątkowo użyteczna w przypadku tworzenia witryn wykorzystujących nowe możliwości języka HTML5, takie jak obsługa dotyku lub Device API. Ze względu na to, że biblioteka ta jest ściśle związana ze stylami, odwołanie do niej nie jest umieszczane
141
142
Responsywne strony WWW
na końcu strony (co stanowi popularne rozwiązanie stosowane w celu poprawy wydajności), lecz na samym początku, co pozwala uniknąć „efektu FOUC”19 (ang. flash of unstyled content — chwilowe wyświetlenie treści bez zastosowania stylów).
JavaScript Większość osób zajmujących się tworzeniem stron WWW ma własne preferencje dotyczące zestawu domyślnie używanych bibliotek JavaScript. Obecnie do najpopularniejszych bibliotek należą: jQuery, Zepto, YUI20, MooTools21 oraz Prototype22. Często konkretny programista lub zespół używa tylko jednej z tych bibliotek, dzięki czemu dysponuje doskonałą wiedzą odnośnie do możliwości danej biblioteki w obszarze jej zastosowań. Umiejętności te możemy wykorzystać do własnych celów. W większości przypadków najpopularniejsze biblioteki są uważnie rozwijane i utrzymywane, można je więc aktualizować od razu w momencie udostępniania kolejnych wersji. Dzięki temu, że są one powszechnie używane, wszystkie błędy są wykrywane i poprawiane bardzo szybko: gdy wiele osób analizuje kod, błędy stają się „płytsze”23. Okazuje się jednak, że biblioteki nie zawsze nadają się do użycia. Na przykład czy do powiązania procedury obsługi zdarzeń z odnośnikiem potrzebna jest cała biblioteka jQuery? Kiedy w szablonie używamy cudzych bibliotek JavaScript, zawsze należy pamiętać, by korzystać z ich najnowszej wersji. Dzięki temu uzyskamy dostęp do „łatek” naprawiających wykryte błędy i będziemy mogli cieszyć się najnowszymi możliwościami. To z kolei może wymagać dodatkowego nakładu pracy, związanego z aktualizacją szablonu. Jeśli zauważymy, że poświęcamy zbyt wiele czasu na dostosowywanie szablonu do potrzeb poszczególnych projektów, będzie to oznaczać, że musimy zmienić swój sposób pracy. Informacje dotyczące przygotowywania szablonu oraz procesu produkcyjnego zamieściliśmy w następnym podrozdziale.
Przygotowywanie pod kątem wielokrotnego stosowania Pierwszym zadaniem wykonywanym w ramach prac nad szablonem jest przeanalizowanie używanego procesu produkcyjnego. Co jest pierwszą rzeczą, którą robimy podczas prac nad każdym projektem? Może to być utworzenie struktury katalogów lub skopiowanie wybranych plików. Dobrym sposobem udokumentowania tych czynności jest wykorzystanie 19
http://en.wikipedia.org/wiki/Flash_of_unstyled_content.
20
http://yuilibrary.com/.
21
http://mootools.net/.
22
http://prototypejs.org/.
23
http://en.wikipedia.org/wiki/Linus's_Law.
RESPONSYWNY SZABLON
systemu kontroli wersji — wystarczy rozpocząć nowy projekt, a następnie zatwierdzać w systemie wszystkie kolejne kroki, które nie zawierają kodu charakterystycznego dla danego projektu. Można także użyć znaczników do wyróżniania konkretnych punktów i ułatwić sobie w ten sposób wyszukiwanie kodu, który nie jest powiązany z projektem i który można zastosować do stworzenia szablonu. Dzięki analizie procesu produkcyjnego łatwiej nam będzie wskazać wzorce powtarzających się zadań. Kiedy już dobrze poznamy nasz proces produkcyjny, będziemy mogli zastanowić się nad krokami, jakie podjąć, by go zautomatyzować, takimi jak scalenie całego kodu w formie szkieletu projektu lub przygotowanie skryptów służących do generowania potrzebnego kodu.
Preprocesory CSS Przetwarzanie wstępne (ang. preprocessing) jest formą metaprogramowania. Wykorzystanie preprocesorów do generowania arkuszy stylów jest rozwiązaniem sensownym, choć może wymusić na nas zmianę toku pracy. W tym przypadku, zamiast standardowych stylów CSS, tworzone są pliki pośrednie, używające innego formatu zapisu i składni, które następnie są kompilowane. Proces kompilacji może być wykonywany na serwerze (poprzez wydanie odpowiedniego polecenia lub przy użyciu programów dysponujących graficznym interfejsem użytkownika) bądź w przeglądarce użytkownika (choć to rozwiązanie nie jest zalecane do zastosowań produkcyjnych), a jego efektem jest przekształcenie plików pośrednich na zwyczajny kod CSS. W razie stosowania nowoczesnych arkuszy stylów takie rozwiązanie może w ogromnym stopniu przyspieszyć prace nad projektem. Popularne preprocesory CSS, takie jak Sass/SCSS lub LESS24, pozwalają między innymi na definiowanie dla danej właściwości CSS wszystkich prefiksów przeglądarek, dzięki czemu w kodzie wystarczy użyć jej tylko raz, co znacząco zmniejsza bałagan w pliku źródłowym. Często można także używać zagnieżdżania (dzięki czemu kod CSS może odpowiadać strukturze DOM) oraz wielu innych użytecznych rozwiązań przyspieszających prace, takich jak wywołania funkcji lub wstawki (ang. mixins). Zastosowanie tych preprocesorów CSS można przenieść na jeszcze wyższy poziom — można ich używać do obserwowania katalogów i automatycznej kompilacji plików. Preprocesory CSS dysponują nawet możliwością zarządzania wersjami arkuszy stylów, wspomagając tym samym zarówno ich tworzenie, jak i przechowywanie w pamięci podręcznej. Aby poprawić wydajność witryny, a tym samym także wrażenia użytkownika, preprocesory CSS pozwalają również na scalanie oraz minimalizację wynikowych arkuszy stylów, przy jednoczesnym zachowaniu modularności i dużej łatwości zarządzania plikami źródłowymi. Teraz przyjrzymy się niektórym z możliwości, jakie zapewniają nam te narzędzia. 24
Powstrzymamy się tutaj od wyrażania opinii i porównywania narzędzi Sass i LESS, gdyż byłaby to dyskusja podobna do rozważań o wyższości przeglądarki Chrome nad Firefoksem lub edytora Emacs nad Vim. Doskonały artykuł wyjaśniający, dlaczego Twitter zdecydował się na wykorzystanie preprocesora LESS, można znaleźć na stronie: http://www.wordsbyf.at/2012/03/08/why-less/, jednak gorąco zachęcam do wypróbowania obu tych narzędzi.
143
144
Responsywne strony WWW
Przetwarzanie wstępne CSS na witrynie WDS Na stronie głównej Sass zostały zamieszczone polecenia pozwalające na rozpoczęcie przygody z tym preprocesorem CSS: $ gem install sass $ mv style.css style.scss $ sass --watch style.scss:style.css
Powyższe polecenia powodują zainstalowanie preprocesora Sass na komputerze, zmianę nazwy pliku .css na .scss oraz uruchomienie mechanizmu obserwowania i wykrywania zmian wprowadzanych w pliku .scss. Jeśli zawartość obserwowanego pliku ulegnie zmianie, zostanie on automatycznie skompilowany, a to z kolei spowoduje aktualizację pliku .css. Dodatkowe informacje na temat instalacji oraz sposobów korzystania z preprocesorów CSS można znaleźć na ich witrynach WWW. Na razie przekonajmy się, co będziemy w stanie zrobić z naszym szablonem. Poniższy przykład przedstawia nasz plik CSS przekształcony do postaci kodu SCSS: rozdzial06/boilerplate/css/base.scss (fragment) #content div.speaker img { border-radius: 45px; width: 90px; } @media only screen and (-webkit-min-device-pixel-ratio: 2) { #content div.speaker img { border-radius: 90px; width: 180px; } }
A czy można w jakiś sposób wyeliminować powtórzenia występujące w tym kodzie? W tym celu wypróbujemy działanie zmiennych i wstawek. W pierwszej kolejności zadeklarujemy dwie zmienne. Użyjemy do tego celu znaku $ ($avatar-radius oraz $scale). Aby nie było problemów z odszukaniem tych zmiennych, obie zmienne umieścimy na samym początku pliku: rozdzial06/boilerplate/css/base.scss (fragment) $avatar-radius: 45px; $scale: 1;
Następnie użyjemy tych zmiennych w kodzie i wykonamy kilka prostych operacji arytmetycznych:
RESPONSYWNY SZABLON rozdzial06/boilerplate/css/base.scss (fragment) #content div.speaker img { border-radius: $avatar-radius; width: $avatar-radius*2; }
Skoro szerokość obrazu prelegenta (width) jest dokładnie dwa razy większa od promienia wierzchołków obramowania (border-radius), to aby uzyskać potrzebną wartość 90px, wystarczy pomnożyć wartość zmiennej $avatar-radius (czyli 45px) przez 2. Jeśli wykonujemy te przykłady, możemy się upewnić, że wyniki wygenerowane przez Sass faktycznie odpowiadają początkowym deklaracjom stylów. Teraz postaramy się przystosować deklaracje border-radius oraz width do wielokrotnego użycia. W tym celu przeniesiemy je do wstawki: rozdzial06/boilerplate/css/base.scss (fragment) @mixin avatar { border-radius: $avatar-radius; width: $avatar-radius*2; } #content div.speaker img { @include avatar; }
Jak widać, do pobrania zawartości wstawki o nazwie avatar i umieszczeniu jej wewnątrz deklaracji stylu używana jest konstrukcja @include. W końcu dodamy do naszej wstawki parametr, używając w tym celu pary nawiasów: rozdzial06/boilerplate/css/base.scss (fragment) @mixin avatar($scale) { border-radius: $avatar-radius*$scale; width: $avatar-radius*2*$scale; } #content div.speaker img { @include avatar(1); } @media only screen and (-webkit-min-device-pixel-ratio: 2) { #content div.speaker img { @include avatar(2); } }
Jak widać, zadeklarowana wcześniej zmienna $scale została przekształcona na parametr, którego wartość jest przekazywana do wstawki przy użyciu konstrukcji @include(). Teraz
145
146
Responsywne strony WWW
możemy programowo podwoić szerokość promienia wierzchołka obramowania oraz szerokość obrazka dla urządzeń definiujących prefiks -webkit- i mających dwukrotnie większą gęstość pikseli. Dzięki zastosowaniu preprocesora możemy zadeklarować style obrazka prelegenta tylko raz i modyfikować wartości zmiennych dla różnych kontekstów sprzętowych. W ten sposób unikamy powtórzeń, oszczędzając sobie nieco czasu i poprawiając modularność kodu. Przekształcając kod dalej w taki sposób, moglibyśmy w końcu stworzyć rozwiązanie, w którym wystarczyłoby określić nowy punkt graniczny, używając zapytań medialnych, i podać wartości zmiennych wyznaczających docelową szerokość ekranu, a odpowiedni arkusz stylów zostałby bezproblemowo wygenerowany. Rozwiązanie to zapewniłoby nam możliwość dostosowywania punktów granicznych bez konieczności powiększania zasobów niezbędnych do zarządzania wieloma układami i korzystania z nich.
Zarządzanie skryptami Kolejnym zagadnieniem, które należy rozważyć, jest uzależnienie naszego szablonu od innych rozwiązań. Na przykład wraz z HTML5 Boilerplate dostarczana jest biblioteka Modernizr. Na podobnej zasadzie wiele innych bibliotek wymaga zastosowania jQuery. Jeśli w naszym systemie korzystamy z kilku takich bibliotek, to może się okazać, że jQuery będzie pobierana kilkakrotnie. Czy zawsze chcemy używać najnowszej wersji biblioteki? A może wolimy korzystać z konkretnej wersji aż do momentu, gdy zostanie ona oficjalnie zaktualizowana? Stosowanie najnowszych wersji innych projektów, od których nasz kod jest uzależniony, może wymagać czasochłonnych działań, takich jak sprawdzanie listy wprowadzonych zmian, ręczne przeprowadzanie testów oraz aktualizacja naszego kodu w celu zapewnienia zgodności. Choć wykorzystanie nowych wersji może poprawiać stabilność i pozwalać na wykorzystanie nowych możliwości, to jednak takie zmiany mogą być sporym utrudnieniem. Mając na uwadze te zagadnienia, możemy zdecydować się na zastosowanie jednego z dedykowanych menedżerów pakietów, przeznaczonych do zarządzania skryptami JavaScript, takich jak Ender25 lub Jam26. Wyobraźmy sobie, że chcielibyśmy używać wszystkich doskonałych mikroplatform dostępnych na stronie Microjs27 — w takim przypadku zastosowanie menedżera pakietów mogłoby nam zaoszczędzić sporo problemów. Także Bower28 jest użytecznym menedżerem pakietów umożliwiającym zarządzanie różnymi zasobami związanymi z interfejsem użytkownika stron — obrazami, arkuszami stylów i plikami JavaScript. Dzięki niemu nie trzeba już własnoręcznie pobierać skryptów i arkuszy stylów oraz nimi 25
https://github.com/ender-js/Ender.
26
http://jamjs.org/.
27
http://microjs.com.
28
http://twitter.github.com/bower/.
RESPONSYWNY SZABLON
zarządzać. Warto także zastanowić się nad zautomatyzowaniem wykonywanych czynności przy użyciu jednego z dostępnych narzędzi służących do wykonywania poleceń, takiego jak na przykład Grunt29. Gdybyśmy chcieli używać najnowszej wersji któregoś z takich narzędzi w każdym z tworzonych projektów, to warto rozważyć instalowanie ich przy wykorzystaniu podmodułów lub metaprogramowania.
Przygotowanie do użycia i udostępnianie W jaki sposób można przygotować nasz szablon do wielokrotnego użycia, kiedy jego kod będzie już gotowy? Oczywiście wystarczyłoby zapisać go w katalogu na komputerze, jednak warto się zastanowić nad umieszczeniem go w jakimś repozytorium systemu kontroli wersji (takim jak na przykład Git). Jeśli w naszym kodzie nie ma żadnych informacji, które miałyby jakieś znaczenie komercyjne, to można rozważyć udostępnienie go w formie kodu otwartego. Jeśli będziemy udostępniać nasz kod publicznie po raz pierwszy, to należy przy tej okazji poznać i zrozumieć różnice pomiędzy różnymi licencjami (doskonałym miejscem, od którego można zacząć zdobywanie tych informacji, jest witryna TLDRLegal30). Archiwum kodu używanego w tej książce, w tym także nasz nowy szablon, jest przechowywane w repozytorium Git.
Kiedy wszystko będzie już gotowe… Szablony udostępniają kod, dzięki któremu możemy szybko i wygodnie rozpocząć pracę nad nową aplikacją. Ich przeznaczeniem jest stworzenie początkowego zbioru wspólnych standardów związanych z zarządzaniem zasobami, arkuszami stylów, skryptami JavaScript i określających strukturę kodu HTML. Poniżej przedstawiliśmy kilka najważniejszych informacji, które warto zapamiętać po przeczytaniu tego rozdziału. Tworząc własny szablon, możemy mieć pewność, że będzie on odpowiadał naszym
wymaganiom i używanemu stylowi programowania, nie będzie zawierał powtarzającego się kodu oraz że będziemy doskonale wiedzieli, jak działa i co robi (nie powinien robić nic ponad to, co musi). Jeśli zdecydujemy się na stworzenie własnego szablonu, to powinien on wyznaczać
pewien standard, skracać czas realizacji projektów i zapewniać stabilność. Jeżeli podczas realizacji kolejnych projektów zbyt wiele czasu poświęcamy na adaptację szablonu, oznacza to, że musimy go zmodyfikować. Jeśli docelowe szablony lub projekty tworzymy przy wykorzystaniu trasowania sza-
blonów, to zastosowanie przetwarzania wstępnego pozwoli nam poprawić ich kod.
29
http://gruntjs.com/.
30
http://www.tldrlegal.com/.
147
148
Responsywne strony WWW W internecie można znaleźć wiele doskonałych gotowych szablonów, dlatego warto
zrobić to, co uczyniło już wielu innych twórców stron, czyli skorzystać z jednego z gotowych rozwiązań — w ten sposób będziemy się mogli przekonać, co one potrafią (a czego nie). Nie zawsze trzeba korzystać z gotowych rozwiązań. Jeśli nasze zamiary różnią się od
oczekiwań innych programistów, wcale nie oznacza to, że się mylimy — po prostu nasze potrzeby mogą być nieco inne.
Odpowiadaj na potrzeby Projektowanie responsywnych stron WWW to coś więcej niż tylko metodologia, która poprzez udostępnianie zbioru najlepszych praktyk pomaga nam skoncentrować się na użytkownikach. Oczywiście w rzeczywistości jest ona takim zbiorem najlepszych praktyk, jednak nie powinny one być najważniejsze — mają nam jedynie zapewniać możliwość jak najszybszego podejmowania decyzji. Praktyki te mają wspomagać projektowanie witryn i aplikacji internetowych, a nie ograniczać je. W odróżnieniu od innych metodologii, w których kluczową rolę odgrywają twórcy, dla metodologii RWD najważniejsze jest to, co tworzymy — nasi użytkownicy odczują korzyści, jakie im to daje, gdyż łatwiej im będzie używać aplikacji. Podczas gdy inne metodologie zajmują się nawiasami klamrowymi i średnikami, metodologia RWD pozwala rozwiązywać bardzo praktyczny problem różnorodności urządzeń używanych do przeglądania naszych witryn i aplikacji. Metodologia RWD to coś więcej niż płynne siatki, obrazy adaptacyjne, zapytania medialne i dynamiczne treści — jest ona rakietowym plecakiem, który przenosi naszych użytkowników do projektów przyszłości.
Skorowidz 320 and Up, 29, 50, 53, 56, 57, 134 960 Grid System, 50, 51, 133 960.gs, 17
A adres URI, 120
B Balsamiq, 50 biblioteka Modernizr, Patrz: Modernizr wersja, 146 boilerplate, Patrz: szablon Bootstrap, 50, 52, 53, 58, 63, 132, 139 Bootswatch, 53 Boulton Mark, 54, 108 Bower, 146
C Chrome, 30, 68 Chrome Frame, 131 Clarke Andy, 57, 134 CSS, 17, 24, 58, 68, 85 image-set, 68, 70 na podstawie zapytań medialnych, 85 neutralizacja, 134, 138, 139 normalizacja, 138 preprocesor, 143 reguła @import, 85 upraszczanie, 25 CSS reset, Patrz: CSS neutralizacja czcionka, 38 skalowanie, 39 wielkość domyślna, 41, 42 względna, 39, 40
DOM, 24, 51, 143 domena, 120
E ekran AMOLED, 67, 104 bardzo duży, 102, 103 cechy, 87, 90 duży, 102, 103 Retina, 67, 68, 88, 104 rozdzielczość, 13, 18, 38, 90 powiększona, 18, 67, 68, 69 średni, 102 telewizora, 13, 91 wymiar, 13, 18, 30, 33, 38, 74, 90 element article, 24 aside, 73 body, 41 div, 26, 71 img, 71, 75, 78 atrybut srcset, 74, 75, 76, 77, 79, 90 li, 97 link, 85 meta viewport, 15, 30, 87, 103 nav, 73 picture, 71, 73, 74, 78, 87, 90 section, 24, 73 source, 71, 78 video, 78
F Firefox, 68 Fireworks, 50 Flash, 116, 117, 135 fluid grid, Patrz: siatka płynna Foundation, 132 funkcja image-set, 68, 70
D Density-Independent Pixels, Patrz: DIP DIP, 69 Django, 123
G GitHub, 52 Google TV, 14 Gridset, 50, 54, 55
150
Responsywne strony WWW
H H5BP, 131, 139, 141 Hickson Ian, 74 HTML, 17 HTML5, 18, 19, 72, 73 standard, 24, 76 wideo, 117 HTML5 Boilerplate, 56, 131, 139, 141 HTML5 Mobile Boilerplate, 131 HTML5 Rocks, 18
I Initializr, 131 interfejs graficzny WYSIWYG, 55
J JavaScript, 29, 121, 142 zarządzanie, 146 jednostki em, 40 punkt, 41 rem, 40 względne, 39, 40 Jehl Scott, 70, 99 język PHP, 124 jQuery, 142, 146
metadane, 109, 112, 113, 114, 116, 134 metaprogramowanie, 143 Microjs, 146 mobile-first design, Patrz: projektowanie na urządzenie mobilne Modernizr, 29, 99, 141, 146 MooTools, 142
N neutralizacja, 134, 138, 139 normalizacja, 138 normalize.css, 139
O O’Connor Ted, 74 obraz adaptacyjny, Patrz: obraz responsywny responsywny, 14, 15, 16, 18, 32, 67, 72, 79 lista łańcuchów, 74 obsługiwany skryptowo, 70 źródło, 18, 72, 74, 75, 76 odbiornik telewizyjny, Patrz: ekran telewizora Omnigraffle, 50 Opera, 68 osoba niedowidząca, 40
P K
klasa, 24 komentarz warunkowy, 29 krój pisma, Patrz: czcionka, typografia
L Lawson Bruce, 73 lazy loading, Patrz: wczytywanie leniwe LESS, 143 logika biznesowa, 124
M Marcotte Ethan, 14, 15, 38 Mayerweb Reset, 139 media query, Patrz: zapytanie medialne menedżer pakietów, 146
Photoshop, 50 PHP, 124 Picturefill, 70, 72, 79 piksel niezależny od gęstości, 69 plik .gitignore, 135 .htaccess, 134 base.css, 139 CONTRIBUTING, 135 crossdomain.xml, 135 Gemfile, 135 humans.txt, 135 konfiguracyjny, 134 LICENSE, 135 package.json, 135 readme, 135 requirements.txt, 135 robots.txt, 134 zależności, 135