Obrazy elastyczne

Obraz wart jest 1000 słów, a obrazy stanowią integralną część każdej strony. Często jednak odpowiadają one za większość pobranych bajtów. Dzięki elastycznemu projektowaniu stron internetowych układy mogą się zmieniać w zależności od cech urządzenia, ale także obrazów.

Elastyczne projektowanie witryn oznacza, że nasze układy mogą się nie tylko zmieniać w zależności od specyfiki urządzenia, ale także zmieniać się zawartość stron. Na przykład na wyświetlaczach o wysokiej rozdzielczości (2x) ostre obrazy zapewniają grafika o wysokiej rozdzielczości. Obraz o szerokości 50% może się sprawdzić przy szerokości przeglądarki o szerokości 800 pikseli, ale w przypadku wąskiego telefonu zużywa zbyt dużo miejsca i wymaga takiej samej przepustowości po zmniejszeniu, by zmieścił się na mniejszym ekranie.

Kierowanie pracami nad grafiką

Przykład kierowania artystycznego

Czasami obraz wymaga bardziej radykalnej zmiany: proporcji, przycięcia, a nawet zastąpienia całego obrazu. W takim przypadku zmiana obrazu jest zwykle określana jako kierowanie artystyczne. Więcej przykładów znajdziesz na stronie responsiveimages.org/demos/.

Obrazy elastyczne

Zrzut ekranu z kursu Udacity

Czy wiesz, że obrazy stanowią średnio ponad 60% bajtów potrzebnych do załadowania strony internetowej?

W tym kursie dowiesz się, jak pracować z obrazami w nowoczesnej sieci, aby wyglądały świetnie i szybko się wczytywały na dowolnym urządzeniu.

Przy okazji nauczysz się różnych umiejętności i technik, które pozwolą Ci płynnie zintegrować elastyczne obrazy w procesie programowania. Na zakończenie kursu będziesz tworzyć obrazy, które dostosowują się do różnych rozmiarów widocznego obszaru i sytuacji użycia.

To bezpłatny kurs dostępny w Udacity

Weź udział w kursie

Obrazy w znacznikach

Element img jest potężny – pobiera, dekoduje i renderuje treści. Nowoczesne przeglądarki obsługują wiele formatów obrazów. Dodawanie obrazów, które działają na różnych urządzeniach, nie różni się od dodawania obrazów na komputery. Wystarczy wprowadzić kilka drobnych zmian, aby zapewnić użytkownikom wygodę.

Podsumowanie

  • Używaj względnych rozmiarów obrazów, aby zapobiec ich przypadkowemu wylewaniu się poza kontener.
  • Użyj elementu picture, jeśli chcesz określić różne obrazy w zależności od cech urządzenia (np. kierunek artystyczny).
  • Użyj deskryptora srcset i deskryptora x w elemencie img, aby przekazać przeglądarce wskazówki dotyczące najlepszego obrazu do wyboru przy wyborze spośród różnych gęstości.
  • Jeśli strona zawiera tylko 1 lub 2 obrazy i nie są one używane w innym miejscu witryny, rozważ użycie obrazów w tekście, aby zmniejszyć liczbę żądań plików.

Używanie względnych rozmiarów obrazów

Pamiętaj, aby podczas określania szerokości obrazów używać jednostek względnych, aby zapobiec ich przypadkowemu wydostawaniu się poza obszar widoku. Na przykład width: 50%; powoduje, że szerokość obrazu wynosi 50% szerokości elementu zawierającego (a nie 50% szerokości widoku ani 50% rzeczywistego rozmiaru w pikselach).

Ponieważ kod CSS pozwala na wylewanie się treści poza kontener, aby zapobiec wylewaniu się obrazów i innych treści, może być konieczne użycie atrybutu max-width: 100%. Na przykład:

img, embed, object, video {
    max-width: 100%;
}

Pamiętaj, aby w atrybucie alt elementów img podać trafne opisy. Dzięki temu Twoja witryna będzie bardziej dostępna, ponieważ czytniki ekranu i inne technologie wspomagające będą miały kontekst.

Ulepszenie img za pomocą srcset na urządzeniach z wysoką rozdzielczością

Atrybut srcset ulepsza działanie elementu img, ułatwiając przesyłanie wielu plików graficznych dla różnych cech urządzenia. Podobnie jak w przypadku image-set funkcji CSS dostępnej w CSS, srcset pozwala przeglądarce wybrać najlepszy obraz w zależności od właściwości urządzenia, np. używając obrazu 2x na wyświetlaczu 2x, a potencjalnie w przyszłości obrazu 1x na urządzeniu 2x, gdy sieć ma ograniczoną przepustowość.

<img src="photo.png" srcset="photo@2x.png 2x" ...>

W przeglądarkach, które nie obsługują atrybutu srcset, przeglądarka po prostu używa domyślnego pliku obrazu określonego przez atrybut src. Dlatego ważne jest, aby zawsze dołączać obraz w rozdzielczości 1x, który można wyświetlić na dowolnym urządzeniu, niezależnie od jego możliwości. Jeśli obiekt srcset jest obsługiwany, lista rozdzielonych przecinkami obrazów/warunków jest analizowana przed wysłaniem jakichkolwiek żądań i pobierany jest i wyświetlany tylko najbardziej odpowiedni obraz.

Warunki mogą obejmować wszystko, od gęstości pikseli po szerokość i wysokość, ale obecnie dobrze obsługiwana jest tylko gęstość pikseli. Aby zachować równowagę między obecnym działaniem a przyszłościowymi funkcjami, po prostu podaj obraz w rozdzielczości 2x w atrybucie.

Kierunek sztuki w elastycznych obrazach z picture

Przykład kierowania artystycznego

Aby zmieniać obrazy w zależności od charakterystyki urządzenia (tzw. wskazówki artystyczne), użyj elementu picture. Element picture określa deklaratywne rozwiązanie do przesyłania wielu wersji obrazu na podstawie różnych cech, takich jak rozmiar urządzenia, rozdzielczość urządzenia czy orientacja.

Użyj elementu picture, gdy źródło obrazu występuje w kilku gęstości lub gdy projektowanie responsywne powoduje wyświetlanie nieco innego obrazu na niektórych rodzajach ekranów. Podobnie jak w przypadku elementu video, możesz użyć wielu elementów source, aby określić różne pliki obrazów w zależności od zapytań dotyczących multimediów lub formatu obrazu.

<picture>
  <source media="(min-width: 800px)" srcset="head.jpg, head-2x.jpg 2x">
  <source media="(min-width: 450px)" srcset="head-small.jpg, head-small-2x.jpg 2x">
  <img src="head-fb.jpg" srcset="head-fb-2x.jpg 2x" alt="a head carved out of wood">
</picture>

Wypróbuj

W powyższym przykładzie, jeśli szerokość przeglądarki wynosi co najmniej 800 pikseli, używana jest wartość head.jpg lub head-2x.jpg, w zależności od rozdzielczości urządzenia. Jeśli przeglądarka ma od 450 do 800 pikseli, używana jest wartość head-small.jpg lub head-small- 2x.jpg, zależnie od rozdzielczości urządzenia. W przypadku ekranów o szerokości mniejszej niż 450 pikseli i zgodności wstecznej, gdy element picture nie jest obsługiwany, przeglądarka zamiast niego renderuje element img, który powinien być zawsze uwzględniany.

Obrazy o zbliżonych rozmiarach

Gdy ostateczny rozmiar obrazu nie jest znany, określenie deskryptora gęstości dla źródeł obrazów może być trudne. Dotyczy to zwłaszcza obrazów, które zajmują proporcjonalną szerokość przeglądarki i są elastyczne, czyli dostosowują się do rozmiaru przeglądarki.

Zamiast podawać stałe rozmiary i gęstości obrazów możesz określić rozmiar każdego dostarczonego obrazu, dodając opis szerokości wraz z rozmiarami elementu obrazu. Dzięki temu przeglądarka może automatycznie obliczyć efektywną gęstość pikseli i wybrać najlepszy obraz do pobrania.

<img src="lighthouse-200.jpg" sizes="50vw"
     srcset="lighthouse-100.jpg 100w, lighthouse-200.jpg 200w,
             lighthouse-400.jpg 400w, lighthouse-800.jpg 800w,
             lighthouse-1000.jpg 1000w, lighthouse-1400.jpg 1400w,
             lighthouse-1800.jpg 1800w" alt="a lighthouse">

Wypróbuj

W tym przykładzie obraz jest renderowany do połowy szerokości widocznego obszaru (sizes="50vw"). W zależności od szerokości przeglądarki i jej współczynnika proporcji pikseli przeglądarka wybiera odpowiedni obraz niezależnie od rozmiaru okna przeglądarki. Na przykład w tabeli poniżej widać, który obraz zostanie wybrany:

Szerokość przeglądarki Współczynnik pikseli urządzenia Użyty obraz Skuteczne rozwiązanie
400 pikseli 1 200.jpg 1x
400 pikseli 2 400.jpg 2 x
320 pikseli 2 400.jpg 2,5×
600 piks. 2 800.jpg 2,67x
640 pikseli 3 1000.jpg 3,125x
1100 pikseli 1 800.png 1,45x

Uwzględnij punkty przerwania w obrazach elastycznych

W wielu przypadkach rozmiar obrazu może się zmieniać w zależności od punktów przełamania układu witryny. Na przykład na małym ekranie obraz może zajmować całą szerokość widocznego obszaru, a na większych ekranach tylko niewielką część.

<img src="400.png"
     sizes="(min-width: 600px) 25vw, (min-width: 500px) 50vw, 100vw"
     srcset="100.png 100w, 200.png 200w, 400.png 400w,
             800.png 800w, 1600.png 1600w, 2000.png 2000w" alt="an example image">

Wypróbuj

W powyższym przykładzie atrybut sizes używa kilku zapytań dotyczących multimediów, aby określić rozmiar obrazu. Jeśli szerokość przeglądarki jest większa niż 600 pikseli, obraz zajmuje 25% szerokości widoku. Jeśli jest między 500 a 600 piks., obraz zajmuje 50% szerokości widoku. Jeśli jest mniejszy niż 500 piks., obraz zajmuje całą szerokość.

Umożliwienie rozwijania zdjęć produktów

J. Witryna Crews z rozwijanym zdjęciem produktu
J. Strona internetowa firmy Crew ze zdjęciem produktu, które można rozwinąć.

Klienci chcą widzieć, co kupują. W sklepach stacjonarnych użytkownicy oczekują, że będą mogli oglądać zbliżenia produktów w wysokiej rozdzielczości, aby lepiej przyjrzeć się szczegółom, a uczestnicy badania byli frustrowani, jeśli im się to nie udało.

Dobrym przykładem klikalnych, rozwijanych obrazów jest J. Witryna ekipy. Znikająca nakładka oznacza, że obraz można kliknąć, czyli powiększony obraz z widocznymi drobnymi szczegółami.

Inne techniki tworzenia obrazów

Kompresowanie obrazów

Metoda kompresji obrazu powoduje wyświetlanie bardzo skompresowanego obrazu 2x na wszystkich urządzeniach, niezależnie od ich możliwości. W zależności od typu obrazu i poziomu kompresji jakość obrazu może się nie zmienić, ale rozmiar pliku znacznie się zmniejszy.

Wypróbuj

Zastępowanie obrazów za pomocą kodu JavaScript

Funkcja zastępowania obrazów w języku JavaScript sprawdza możliwości urządzenia i „robi to, co należy”. Możesz określić współczynnik pikseli urządzenia za pomocą funkcji window.devicePixelRatio, uzyskać szerokość i wysokość ekranu, a nawet przeprowadzić skanowanie połączeń sieciowych za pomocą funkcji navigator.connection lub wysyłając fałszywe żądanie. Po zebraniu wszystkich tych informacji możesz zdecydować, które zdjęcie ma się wczytać.

Jedną z dużych wad tego podejścia jest to, że w języku JavaScript ładowanie obrazów jest opóźnione, dopóki nie zakończy się jego interpretacja z wyprzedzeniem. Oznacza to, że pobieranie zdjęć rozpocznie się dopiero po wywołaniu zdarzenia pageload. Ponadto przeglądarka prawdopodobnie pobierze obrazy w wersji 1x i 2x, co zwiększy rozmiar strony.

Wstawianie obrazów: rastrowe i wektory

Istnieją 2 zasadniczo różne sposoby tworzenia i przechowywania obrazów. Ma to wpływ na elastyczne wdrażanie obrazów.

Obraz rastrowy, np. fotografia lub inny obraz, jest reprezentowany jako siatka pojedynczych kolorowych punktów. Obrazy rastrowe mogą pochodzić z aparatu lub skanera albo zostać utworzone za pomocą elementu HTML canvas. Formaty takie jak PNG, JPEG i WebP służą do przechowywania obrazów rastrowych.

Obrazy wektorowe, takie jak logo i rysunki wektorowe, są definiowane jako zestaw krzywych, linii, kształtów, kolorów wypełnienia i gradientów. Obrazy wektorowe można tworzyć w programach takich jak Adobe Illustrator czy Inkscape, a także odręcznie pisać w kodzie w formacie wektorowym, np. SVG.

SVG

Format SVG pozwala umieścić na stronie internetowej elastyczną grafikę wektorową. Zaletą formatów plików wektorowych w porównaniu z formatami plików rastrowych jest to, że przeglądarka może renderować obraz wektorowy w dowolnym rozmiarze. Formaty wektorowe opisują geometrię obrazu – sposób jego utworzenia z linii, krzywych, kolorów itd. Formaty rastrowe zawierają natomiast tylko informacje o pojedynczych pikselach, więc przeglądarka musi zgadywać, jak wypełnić puste miejsca podczas skalowania.

Poniżej znajdują się 2 wersje tego samego obrazu: po lewej stronie obraz PNG, a po prawej SVG. Format SVG wygląda świetnie w każdym rozmiarze, podczas gdy format PNG obok niego zaczyna być rozmyty przy większych rozmiarach wyświetlacza.

Logo HTML5 w formacie PNG
Logo HTML5 w formacie SVG

Jeśli chcesz zmniejszyć liczbę żądań plików wysyłanych przez stronę, możesz kodować obrazy w tekście za pomocą formatu SVG lub identyfikatora URI danych. Jeśli wyświetlisz źródło tej strony, zobaczysz, że oba logo są zadeklarowane jako wbudowane: identyfikator URI danych i element SVG.

Format SVG świetnie działa na urządzeniach mobilnych i komputerach, a narzędzia do optymalizacji mogą znacznie zmniejszyć rozmiar SVG. Te 2 logo SVG wyglądają identycznie, ale jedno ma rozmiar około 3 KB, a drugie tylko 2 KB:

Identyfikator URI danych

Identyfikatory URI danych pozwalają wstawiać pliki (np. obrazy) w treści za pomocą parametru src elementu img w postaci ciągu z kodowaniem Base64 zgodnie z tym formatem:

<img src="data:image/svg+xml;base64,[data]">

Początek kodu logo HTML5 wygląda tak:

<img src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiB
BZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW ...">

(pełna wersja ma ponad 5000 znaków)

Za pomocą narzędzi przeciągania i upuszczania, takich jak jpillora.com/base64-encoder, można konwertować pliki binarne, na przykład obrazy, na identyfikatory URI danych. Podobnie jak w przypadku plików SVG, identyfikatory URI danych są dobrze obsługiwane w przeglądarkach mobilnych i na komputery.

Wbudowanie w CSS

Identyfikatory URI danych i pliki SVG mogą też być wstawiane w arkuszu CSS. Jest to obsługiwane zarówno na urządzeniach mobilnych, jak i na komputerach. Oto 2 identycznie wyglądające obrazy zaimplementowane jako obrazy tła w CSS: jeden z identyfikatorem URI danych, drugi w formacie SVG:

Wstawianie zalet i wad

Kod w tekście obrazów może być bardzo szczegółowy – zwłaszcza identyfikatory URI danych – dlaczego warto go używać? Aby zmniejszyć liczbę żądań HTTP. Dzięki plikom SVG i identyfikatorom URI danych można pobrać całą stronę internetową, w tym obrazy, arkusze CSS i skrypty JavaScript, za pomocą jednego żądania.

Minusy:

  • Na urządzeniach mobilnych identyfikatory URI danych mogą się wyświetlać znacznie wolniej niż obrazy z zewnętrznego src.
  • Identyfikatory URI danych mogą znacznie zwiększyć rozmiar żądania HTML.
  • Sprawiają, że znaczniki i przepływ pracy są bardziej złożone.
  • Format URI danych jest znacznie większy niż format binarny (do 30%), a zatem nie zmniejsza łącznego rozmiaru pobierania.
  • Adresy URI danych nie mogą być przechowywane w pamięci podręcznej, dlatego muszą być pobierane na każdej stronie, na której są używane.
  • Nie są obsługiwane w IE 6 i 7; IE8 nie jest w pełni obsługiwane.
  • W przypadku HTTP/2 zmniejszanie liczby żądań zasobów będzie miało mniejszy priorytet.

Tak jak w przypadku responsywności, musisz sprawdzić, co sprawdza się najlepiej. Użyj narzędzi dla programistów, aby zmierzyć rozmiar pliku do pobrania, liczbę żądań i całkowity czas oczekiwania. Identyfikatory URI danych mogą być czasem przydatne w przypadku obrazów rastrowych, np. na stronie głównej, na której znajdują się tylko 1 lub 2 zdjęcia, które nie są używane nigdzie indziej. Jeśli chcesz wstawiać obrazy wektorowe, SVG jest znacznie lepszym rozwiązaniem.

Obrazy w CSS

Właściwość CSS background to potężne narzędzie do dodawania złożonych obrazów do elementów. Ułatwia dodawanie wielu obrazów i ich powtarzanie. W połączeniu z zapytaniami o multimedia właściwość „tle” staje się jeszcze bardziej zaawansowana, umożliwiając warunkowe wczytywanie obrazów uzależnione od rozdzielczości ekranu, rozmiaru widocznego obszaru itp.

Podsumowanie

  • Użyj obrazu najlepiej dopasowanego do specyfikacji wyświetlacza, biorąc pod uwagę rozmiar ekranu, rozdzielczość urządzenia i układ strony.
  • Zmień właściwość background-image w CSS w przypadku wyświetlaczy o wysokiej rozdzielczości DPI, używając zapytań o media z parametrami min-resolution i -webkit-min-device-pixel-ratio.
  • Użyj atrybutu srcset, aby oprócz obrazu 1x w znaczniku udostępnić obrazy w wysokiej rozdzielczości.
  • Pamiętaj, że korzystanie z technik zastępowania obrazów za pomocą JavaScriptu lub wyświetlanie na urządzeniach o niższej rozdzielczości obrazów o wysokiej rozdzielczości i bardzo skompresowanych może mieć wpływ na wydajność.

Używanie zapytań o multimedia do warunkowego wczytywania obrazów lub kierowania artystycznego

Zapytania o multimedia wpływają nie tylko na układ strony, ale możesz ich też używać do warunkowego wczytywania obrazów lub do określania kierunków artystycznych w zależności od szerokości widocznego obszaru.

Na przykład w przykładzie poniżej na mniejszych ekranach pobierany jest tylko element small.png i jest on stosowany do treści div, a na większych ekranach element background-image: url(body.png) jest stosowany do treści div, a element background-image: url(large.png) do treści div.

.example {
  height: 400px;
  background-image: url(small.png);
  background-repeat: no-repeat;
  background-size: contain;
  background-position-x: center;
}

@media (min-width: 500px) {
  body {
    background-image: url(body.png);
  }
  .example {
    background-image: url(large.png);
  }
}

Wypróbuj

Przesyłanie zdjęć w wysokiej rozdzielczości za pomocą zestawu obrazów

Funkcja image-set() w CSS rozszerza działanie właściwości background, ułatwiając udostępnianie wielu plików graficznych dla różnych cech urządzenia. Pozwala to przeglądarce wybrać najlepszy obraz w zależności od właściwości urządzenia, np. użyć obrazu 2x na wyświetlaczu 2x lub obrazu 1x na urządzeniu 2x w przypadku sieci o ograniczonej przepustowości.

background-image: image-set(
    url(icon1x.jpg) 1x,
    url(icon2x.jpg) 2x
);

Oprócz wczytania prawidłowego obrazu przeglądarka odpowiednio go skaluje. Innymi słowy, przeglądarka zakłada, że obrazy w rozdzielczości 2x są dwa razy większe niż obrazy w rozdzielczości 1x, więc przeskaluje obraz w rozdzielczości 2x o współczynnik 2, aby obraz miał taki sam rozmiar na stronie.

Obsługa image-set() jest wciąż nowa i jest obsługiwana tylko w Chrome i Safari z prefiksem dostawcy -webkit. Pamiętaj o dodaniu obrazu zapasowego, gdy obiekt image-set() nie jest obsługiwany, np.:

.sample {
  width: 128px;
  height: 128px;
  background-image: url(icon1x.png);
  background-image: -webkit-image-set(
    url(icon1x.png) 1x,
    url(icon2x.png) 2x
  );
  background-image: image-set(
    url(icon1x.png) 1x,
    url(icon2x.png) 2x
  );
}

Wypróbuj

W przeglądarkach obsługujących zestawy obrazów wczytuje się odpowiedni zasób. W przeciwnym razie wczytuje się zasób 1x. Oczywiście, chociaż przeglądarkiimage-set() są słabo obsługiwane, większość z nich wyświetla zasób 1x.

Używaj zapytań o multimedia, aby wyświetlać obrazy w wysokiej rozdzielczości lub kierunek artystyczny

Za pomocą zapytań o multimedia można tworzyć reguły na podstawie współczynnika pikseli urządzenia, co umożliwia określenie różnych obrazów dla wyświetlaczy 2x i 1x.

@media (min-resolution: 2dppx),
(-webkit-min-device-pixel-ratio: 2)
{
    /* High dpi styles & resources here */
}

Chrome, Firefox i Opera obsługują standardową wartość (min-resolution: 2dppx), natomiast przeglądarki Safari i Android wymagają starszej składni z prefiksem dostawcy bez jednostki dppx. Pamiętaj, że te style są wczytywane tylko wtedy, gdy urządzenie pasuje do zapytania o multimedia, i musisz określić style dla przypadku podstawowego. Dzięki temu masz pewność, że coś zostanie wyrenderowane, jeśli przeglądarka nie obsługuje zapytań dotyczących multimediów w zależności od rozdzielczości.

.sample {
  width: 128px;
  height: 128px;
  background-image: url(icon1x.png);
}

@media (min-resolution: 2dppx), /* Standard syntax */
(-webkit-min-device-pixel-ratio: 2)  /* Safari & Android Browser */
{
  .sample {
    background-size: contain;
    background-image: url(icon2x.png);
  }
}

Wypróbuj

Możesz też użyć składni min-width, aby wyświetlać obrazy alternatywne w zależności od rozmiaru widocznego obszaru. Ta metoda ma tę zaletę, że obraz nie jest pobierany, jeśli zapytanie o multimedia nie pasuje. Na przykład bg.png jest pobierany i zastosowany do body tylko wtedy, gdy przeglądarka ma szerokość co najmniej 500 pikseli:

@media (min-width: 500px) {
    body {
    background-image: url(bg.png);
    }
}

Używanie formatu SVG do ikon

Podczas dodawania ikon do strony używaj ikon SVG lub w niektórych przypadkach znaków Unicode.

Podsumowanie

  • Zamiast obrazów rastrowych używaj ikon w formacie SVG lub Unicode.

Zastępowanie prostych ikon symbolami Unicode

Wiele czcionek obsługuje mnóstwo znaków Unicode, które można stosować zamiast obrazów. W przeciwieństwie do obrazów czcionki Unicode dobrze się skalują i będą dobrze wyglądać niezależnie od tego, jak małe lub duże będą na ekranie.

Poza normalnym zestawem znaków kod Unicode może zawierać symbole strzałek (←), operatory matematyczne (√), kształty geometryczne (★), obrazki kontrolne (▶), zapis muzyczny (♬), litery greckie (Ω), a nawet szachy (♞).

Wstawianie znaku Unicode odbywa się w taki sam sposób jak w przypadku nazwanych encji: &#XXXX, gdzie XXXX oznacza numer znaku Unicode. Na przykład:

You're a super &#9733;

Jesteś super ★

Zastępowanie złożonych ikon plikami SVG

Jeśli chodzi o bardziej złożone wymagania dotyczące ikon, ikony SVG są zwykle lekkie, łatwe w użyciu i można je dostosowywać do stylu CSS. Format SVG ma wiele zalet w porównaniu z obrazami rastrowymi:

  • Są to grafiki wektorowe, które można nieskończenie skalować.
  • Efekty CSS, takie jak kolor, cieniowanie, przezroczystość i animacje, są proste.
  • Obrazy SVG można wstawiać bezpośrednio w dokumencie.
  • Są semantyczne.
  • Zapewniają one lepszą dostępność dzięki odpowiednim atrybutom.
With SVG icons, you can either add icons using inline SVG, like
this checkmark:
  <svg version="1.1" xmlns="http://www.w3.org/2000/svg"
       xmlns:xlink="http://www.w3.org/1999/xlink"
       width="32" height="32" viewBox="0 0 32 32">
    <path d="M27 4l-15 15-7-7-5 5 12 12 20-20z" fill="#000000"></path>
  </svg>
or by using an image tag, like this credit card icon:
<img src="credit.svg">.

Wypróbuj

Zachowaj ostrożność podczas korzystania z czcionek ikon

Przykład strony, na której są ikony czcionek FontAwesome
Przykład strony, która używa czcionek FontAwesome do tworzenia ikon.

Czcionki ikon są popularne i łatwe w użyciu, ale mają pewne wady w porównaniu z ikonami SVG:

  • Są to grafiki wektorowe, które można skalować w nieskończoność, ale mogą być antyaliasingowane, co powoduje, że ikony nie są tak ostre, jak powinny.
  • Ograniczony styl w CSS.
  • Dokładne pozycjonowanie w pikselach może być trudne w zależności od wysokości linii, odstępów między literami itp.
  • Nie są one semantyczne i mogą być trudne do wykorzystania z czytnikami ekranu lub innymi technologiami wspomagającymi.
  • Jeśli nie zostaną odpowiednio ograniczone, mogą spowodować, że plik będzie duży, mimo że zawiera tylko niewielką podgrupę dostępnych ikon.
With Font Awesome, you can either add icons by using a unicode
entity, like this HTML5 logo (<span class="awesome">&#xf13b;</span>)
or by adding special classes to an &lt;i&gt; element like the CSS3
logo (<i class="fa fa-css3"></i>).

Wypróbuj

Dostępne są setki bezpłatnych i płatnych czcionek ikon, m.in. Font Awesome, PictosGlyphicons.

Pamiętaj, aby zrównoważyć wagę dodatkowego żądania HTTP i rozmiar pliku z potrzebą korzystania z ikon. Jeśli na przykład potrzebujesz tylko kilku ikon, lepiej użyć obrazu lub obiektu sprite.

Optymalizacja obrazów pod kątem wydajności

Obrazy często stanowią większość pobranych bajtów i często zajmują znaczną ilość miejsca wizualnego na stronie. W efekcie optymalizacja obrazów często przekłada się na największą oszczędność bajtów i zwiększenie wydajności witryny: im mniej bajtów musi pobrać przeglądarka, tym mniejsza konkurencja o przepustowość klienta i tym szybciej przeglądarka pobierze i wyświetli wszystkie zasoby.

Podsumowanie

  • Nie ograniczaj się tylko do losowego wyboru formatu obrazu – poznaj różne dostępne formaty i wykorzystaj ten, który najlepiej Ci odpowiada.
  • Użyj narzędzi do optymalizacji i kompresji obrazów, aby zmniejszyć rozmiar plików.
  • Zmniejsz liczbę żądań HTTP, umieszczając często używane obrazy w obrazach sprite.
  • Aby skrócić czas wczytywania początkowej strony i zmniejszyć jej rozmiar, warto wczytywać obrazy dopiero po przewinięciu ich do widoku.

Wybierz odpowiedni format

Istnieją 2 rodzaje obrazów: obrazy wektorowych i obrazów rastrowych. W przypadku obrazów rastrowych musisz też wybrać odpowiedni format kompresji, na przykład GIF, PNG lub JPG.

Obrazy rastrowe, takie jak fotografie i inne obrazy, są reprezentowane jako siatka pojedynczych punktów lub pikseli. Obrazy rastrowe pochodzą zwykle z aparatu lub skanera, ale można je też utworzyć w przeglądarce za pomocą elementu canvas. Wraz ze wzrostem rozmiaru obrazu rośnie też rozmiar pliku. Przy większym rozmiarze obrazy rastrowe stają się rozmyte, ponieważ przeglądarka musi zgadnąć, jak wypełnić brakujące piksele.

Obrazy wektorowe, takie jak logo i rysunki wektorowe, są definiowane przez zestaw krzywych, linii, kształtów i kolorów wypełnienia. Obrazy wektorowe są tworzone w takich programach jak Adobe Illustrator czy Inkscape i zapisywane w formacie wektorowym, np. SVG. Obrazy wektorowe są tworzone na podstawie prostych prymitywów, więc można je skalować bez utraty jakości ani zmiany rozmiaru pliku.

Wybierając odpowiedni format, weź pod uwagę zarówno pochodzenie obrazu (raster lub wektor), jak i jego zawartość (kolory, animację, tekst itp.). Żaden format nie pasuje do wszystkich typów obrazów, a każdy z nich ma swoje mocne i słabe strony.

Wybierając odpowiedni format, zacznij od tych wskazówek:

  • W przypadku obrazów fotograficznych używaj formatu JPG.
  • Użyj SVG do grafik wektorowych i grafik w jednolitym kolorze, takich jak logo i grafika wektorowa. Jeśli grafika wektorowa jest niedostępna, spróbuj WebP lub PNG.
  • Użyj PNG zamiast GIF, ponieważ pozwala na użycie większej liczby kolorów i zapewnia lepsze współczynniki kompresji.
  • W przypadku dłuższych animacji rozważ użycie <video>, co zapewnia lepszą jakość obrazu i daje użytkownikowi kontrolę nad odtwarzaniem.

Zmniejsz rozmiar pliku

Rozmiar pliku obrazu możesz znacznie zmniejszyć, wykonując „przetwarzanie końcowe” po zapisaniu. Do kompresowania obrazów możesz wykorzystać różne narzędzia – w trybie stratnym i bezstratnym, online, GUI i wierszu poleceń. W miarę możliwości najlepiej jest korzystać z automatycznej optymalizacji obrazów, tak aby wbudowana w przepływ pracy.

Dostępnych jest kilka narzędzi, które zapewniają bezstratną kompresję plików JPG i PNG bez wpływu na jakość obrazu. W przypadku JPG spróbuj użyć jpegtran lub jpegoptim (dostępne tylko w systemie Linux; uruchom z opcją --strip-all). W przypadku PNG spróbuj użyć OptiPNG lub PNGOUT.

Używaj sprite’ów graficznych

Arkusz sprite obrazu użyty w przykładzie

Sprite’owanie w CSS to technika, w której wiele obrazów łączy się w jeden obraz „arkusza sprite’ów”. Następnie możesz używać poszczególnych obrazów, określając obraz tła dla elementu (arkusz sprite’ów) oraz przesunięcie, aby wyświetlić odpowiednią część.

.sprite-sheet {
  background-image: url(sprite-sheet.png);
  width: 40px;
  height: 25px;
}

.google-logo {
  width: 125px;
  height: 45px;
  background-position: -190px -170px;
}

.gmail {
  background-position: -150px -210px;
}

.maps {
  height: 40px;
  background-position: -120px -165px;
}

Wypróbuj

Zastosowanie sprintingu ma tę zaletę, że zmniejsza liczbę pobrań wymaganych do uzyskania wielu obrazów, a jednocześnie umożliwia buforowanie.

Rozważ leniwe ładowanie.

Leniwe ładowanie może znacznie przyspieszyć wczytywanie długich stron zawierających wiele obrazów w części strony widocznej po przewinięciu. Obrazy są wczytywane w miarę potrzeby lub po zakończeniu wczytywania i renderowania głównej zawartości. Oprócz poprawy wydajności użycie wczytywania opóźnionego może umożliwić nieograniczone przewijanie.

Zachowaj ostrożność podczas tworzenia stron z nieskończonym przewijaniem. Ponieważ treści są wczytywane w miarę ich wyświetlania, wyszukiwarki mogą ich nigdy nie zobaczyć. Ponadto użytkownicy, którzy szukają informacji, które zwykle znajdują w stopce, nigdy nie widzą stopki, ponieważ zawsze wczytywane są nowe treści.

Unikaj obrazów

Czasami najlepszym obrazem wcale nie jest obraz. W miarę możliwości korzystaj z natywnych możliwości przeglądarki, aby zapewnić takie same lub podobne funkcje. Przeglądarki generują treści wizualne, które wcześniej wymagałyby obrazów. Dzięki temu przeglądarki nie muszą już pobierać oddzielnych plików graficznych, co zapobiega wyświetlaniu obrazów o niezręcznej skali. Do renderowania ikon możesz używać czcionek Unicode lub specjalnych czcionek ikon.

umieszczanie tekstu w tagach zamiast umieszczać go w obrazach;

O ile to możliwe, tekst powinien być tekstem, a nie być wbudowany w obrazy. Na przykład użycie obrazów w nagłówkach lub umieszczanie informacji kontaktowych (np. numerów telefonów lub adresów) bezpośrednio w obrazach uniemożliwia użytkownikom kopiowanie i wklejanie informacji. Sprawia to, że informacje te są niedostępne dla czytników ekranu i są niedostępne. Zamiast tego umieść tekst w swojej metryczce i w razie potrzeby użyj czcionek internetowych, aby uzyskać odpowiedni styl.

Zastępowanie obrazów za pomocą kodu CSS

Nowoczesne przeglądarki mogą używać funkcji CSS do tworzenia stylów, które wcześniej wymagały obrazów. Na przykład za pomocą właściwości background możesz tworzyć złożone gradienty, za pomocą właściwości box-shadow możesz tworzyć cienie, a za pomocą właściwości border-radius możesz dodawać zaokrąglone rogi.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque sit amet augue eu magna scelerisque porta ut ut dolor. Nullam egestas egestas nisl sed sollicitudin. Fusce placerat, ipsum ac vestibulum porta, purus dolor mollis nunc, pharetra vehicula nulla nunc quis elit. Duis ornare fringilla dui non vehicula. In hac habitasse platea dictumst. Donec ipsum lectus, hendrerit malesuada sapien eget, venenatis tempus purus.

<style>
    div#noImage {
    color: white;
    border-radius: 5px;
    box-shadow: 5px 5px 4px 0 rgba(9,130,154,0.2);
    background: linear-gradient(rgba(9, 130, 154, 1), rgba(9, 130, 154, 0.5));
    }
</style>

Pamiętaj, że korzystanie z tych technik wymaga cykli renderowania, co może być istotne na urządzeniach mobilnych. Nadmierne użycie spowoduje utratę korzyści i może obniżyć skuteczność.