Obrazy elastyczne

Tekst w internecie automatycznie zawija się na krawędzi ekranu, dzięki czemu nie przekracza jego granic. Obrazy mają natomiast rozmiar wewnętrzny. Jeśli obraz jest szerszy niż ekran, wykracza poza niego i użytkownik musi przewijać go w poziomie, aby zobaczyć całość.

Na szczęście CSS udostępnia narzędzia, które temu zapobiegają.

Ograniczanie obrazów

W arkuszu stylów możesz użyć max-inline-size, aby zadeklarować, że obrazy nigdy nie mogą być renderowane w rozmiarze szerszym niż element zawierający.

Browser Support

  • Chrome: 57.
  • Edge: 79.
  • Firefox: 41.
  • Safari: 12.1.

Source

img {
  max-inline-size: 100%;
  block-size: auto;
}

Tę samą regułę możesz zastosować też do innych rodzajów treści umieszczonych na stronie, np. filmów i elementów iframe.

img,
video,
iframe {
  max-inline-size: 100%;
  block-size: auto;
}

Dzięki tej regule przeglądarki automatycznie zmniejszają rozmiar obrazów, aby dopasować je do ekranu.

Dwa zrzuty ekranu: pierwszy pokazuje obraz rozszerzający się poza szerokość przeglądarki, a drugi ten sam obraz ograniczony do obszaru widocznego w przeglądarce.
Ograniczenie rozmiaru obrazu pozwala użytkownikom zobaczyć go w całości bez przewijania.

Dodanie wartości block-size auto oznacza, że przeglądarka zachowuje współczynnik proporcji obrazu podczas zmiany rozmiaru obrazów.

Czasami wymiary obrazu są ustawiane przez system zarządzania treścią (CMS) lub inny system dostarczania treści. Jeśli projekt wymaga innego współczynnika proporcji niż domyślny w systemie CMS, możesz użyć właściwości aspect-ratio, aby zachować wygląd witryny:

img {
  max-inline-size: 100%;
  block-size: auto;
  aspect-ratio: 2/1;
}

Niestety często oznacza to, że przeglądarka musi skompresować lub rozciągnąć obraz, aby dopasować go do zamierzonego miejsca.

Profil szczęśliwego, przystojnego psa z piłką w pysku, ale obraz jest rozciągnięty.
Zmiana formatu obrazu powoduje, że wygląda on na ściśnięty lub rozciągnięty.

Aby zapobiec rozciąganiu i ściskaniu, użyj właściwości object-fit.

Browser Support

  • Chrome: 32.
  • Edge: 79.
  • Firefox: 36.
  • Safari: 10.

Source

Wartość object-fit równa contain informuje przeglądarkę, że ma zachować proporcje obrazu, pozostawiając w razie potrzeby puste miejsce wokół niego.

img {
  max-inline-size: 100%;
  block-size: auto;
  aspect-ratio: 2/1;
  object-fit: contain;
}

Wartość object-fit równa cover informuje przeglądarkę, aby zachowała proporcje obrazu, przycinając go w razie potrzeby.

img {
  max-inline-size: 100%;
  block-size: auto;
  aspect-ratio: 2/1;
  object-fit: cover;
}
Profil szczęśliwego, przystojnego psa z piłką w pysku. Po obu stronach obrazu jest dodatkowa przestrzeń. Profil szczęśliwego, przystojnego psa z piłką w pysku. Obraz jest przycięty u góry i u dołu.
Ten sam obraz z zastosowanymi 2 różnymi wartościami atrybutu `object-fit`. Pierwszy ma wartość `contain` właściwości `object-fit`, a drugi ma wartość `cover`.

Położenie wykadrowanego obrazu możesz zmienić za pomocą właściwości object-position. Dzięki temu możesz dostosować punkt fokalny przycięcia, aby mieć pewność, że najważniejsza część obrazu będzie nadal widoczna.

Browser Support

  • Chrome: 32.
  • Edge: 79.
  • Firefox: 36.
  • Safari: 10.

Source

img {
  max-inline-size: 100%;
  block-size: auto;
  aspect-ratio: 2/1;
  object-fit: cover;
  object-position: top center;
}
Profil szczęśliwego, przystojnego psa z piłką w pysku. Obraz został przycięty tylko u dołu.
Możesz ustawić object-position, aby przycinać tylko jedną stronę obrazu.

Przesyłanie obrazów

Te reguły CSS informują przeglądarkę, jak mają być renderowane obrazy. W kodzie HTML możesz też podać wskazówki dotyczące tego, jak przeglądarka powinna obsługiwać te obrazy.

Wskazówki dotyczące rozmiaru

Jeśli znasz wymiary obrazu, zawsze uwzględniaj atrybuty width i height. Nawet jeśli obraz jest renderowany w innym rozmiarze z powodu reguły max-inline-size, przeglądarka nadal zna stosunek szerokości do wysokości i może zarezerwować odpowiednią ilość miejsca. Dzięki temu inne treści nie będą przeskakiwać, gdy obraz się załaduje.

<img
 src="image.png"
 alt="A description of the image."
 width="300"
 height="200"
>
Pierwszy film przedstawia układ bez zdefiniowanych wymiarów obrazu. Zwróć uwagę, jak tekst przeskakuje po załadowaniu obrazów. W drugim filmie podano wymiary obrazu, więc przeglądarka pozostawia miejsce na obraz, a tekst nie przeskakuje po załadowaniu obrazu.

Wskazówki dotyczące ładowania

Użyj atrybutu loading, aby poinformować przeglądarkę, czy ma opóźnić wczytywanie obrazu, dopóki nie znajdzie się on w obszarze widocznym lub w jego pobliżu. W przypadku obrazów w części strony widocznej po przewinięciu użyj wartości lazy. Przeglądarka nie będzie ładować obrazów leniwych, dopóki użytkownik nie przewinie strony na tyle daleko, aby obraz miał się pojawić. Jeśli użytkownik nigdy nie przewinie strony, obraz się nie załaduje.

<img
 src="image.png"
 alt="A description of the image."
 width="300"
 height="200"
 loading="lazy"
>
Obrazy ładowane leniwie czekają na wczytanie, aż użytkownik zacznie je przewijać.

W przypadku banera powitalnego w części strony widocznej na ekranie nie używaj loading. Jeśli Twoja witryna automatycznie stosuje atrybut loading="lazy", możesz zwykle ustawić atrybut loading na domyślną wartość eager, aby zapobiec leniwemu ładowaniu obrazów:

<img
 src="hero.jpg"
 alt="A description of the image."
 width="1200"
 height="800"
 loading="eager"
>

Priorytet pobierania

W przypadku ważnych obrazów, takich jak obraz LCP, możesz dodatkowo nadać priorytet wczytywaniu za pomocą priorytetu pobierania, ustawiając atrybut fetchpriority na high:

<img
 src="hero.jpg"
 alt="A description of the image."
 width="1200"
 height="800"
 loading="eager"
 fetchpriority="high"
>

Dzięki temu przeglądarka od razu pobierze obraz z wysokim priorytetem, zamiast czekać, aż zakończy układ i pobierze obrazy w normalny sposób.

Gdy jednak poprosisz przeglądarkę o nadanie priorytetu pobieraniu jednego zasobu, np. obrazu, musi ona obniżyć priorytet innego zasobu, takiego jak skrypt lub plik czcionki. Atrybut fetchpriority="high" należy ustawiać tylko w przypadku naprawdę ważnych obrazów.

Wskazówki dotyczące wstępnego wczytywania

W miarę możliwości unikaj wstępnego wczytywania, umieszczając wszystkie obrazy w początkowym pliku HTML. Niektóre obrazy mogą być jednak niedostępne, np. obrazy dodane za pomocą JavaScriptu lub obraz tła CSS.

Możesz użyć wstępnego wczytywania, aby przeglądarka pobrała te ważne obrazy z wyprzedzeniem. W przypadku naprawdę ważnych obrazów możesz połączyć wstępne wczytywanie z atrybutem:fetchpriority

<link rel="preload" href="hero.jpg" as="image" fetchpriority="high">

Pamiętaj, aby używać tych atrybutów oszczędnie, aby nie zastępować zbyt często heurystyki priorytetyzacji przeglądarki. Nadmierne używanie wykluczających słów kluczowych może pogorszyć skuteczność.

Niektóre przeglądarki obsługują wstępne wczytywanie obrazów responsywnych na podstawie atrybutu srcset za pomocą atrybutów imagesrcsetimagesizes. Na przykład:

<link rel="preload" imagesrcset="hero_sm.jpg 1x hero_med.jpg 2x hero_lg.jpg 3x" as="image" fetchpriority="high">

Wykluczając href, możesz mieć pewność, że przeglądarki bez obsługi srcset będą wstępnie wczytywać prawidłowy obraz.

Nie możesz wstępnie wczytywać obrazów w różnych formatach w zależności od obsługi przeglądarki. Próba wykonania tej czynności może spowodować dodatkowe pobieranie danych, co wiąże się z ich marnowaniem.

Obrazy elastyczne z użyciem elementu srcset

Dzięki deklaracji max-inline-size: 100% obrazy nie mogą wykraczać poza swoje kontenery. Jeśli jednak użytkownik ma mały ekran i sieć o niskiej przepustowości, pobieranie przez niego obrazów o takim samym rozmiarze jak w przypadku użytkowników z większymi ekranami powoduje marnowanie danych.

Aby rozwiązać ten problem, dodaj kilka wersji tego samego obrazu w różnych rozmiarach i użyj atrybutu srcset, aby poinformować przeglądarkę, że te rozmiary istnieją i kiedy należy ich używać.

Opis szerokości

Możesz zdefiniować srcset za pomocą listy wartości rozdzielonych przecinkami. Każda wartość to adres URL obrazu, po którym następuje spacja i metadane obrazu, czyli deskryptor.

W tym przykładzie metadane opisują szerokość każdego obrazu za pomocą jednostki w. 1 w to szerokość 1 piksela.

<img
 src="small-image.png"
 alt="A description of the image."
 width="300"
 height="200"
 loading="lazy"
 decoding="async"
 srcset="small-image.png 300w,
  medium-image.png 600w,
  large-image.png 1200w"
>

Atrybut srcset uzupełnia atrybut src, a nie go zastępuje. Nadal musisz mieć prawidłowy atrybut src, ale przeglądarka może zastąpić jego wartość jedną z opcji wymienionych w atrybucie srcset. Aby oszczędzać przepustowość, przeglądarka pobiera większy obraz tylko wtedy, gdy jest on potrzebny.

Rozmiary

Jeśli używasz deskryptora szerokości, musisz też użyć atrybutu sizes , aby przekazać przeglądarce więcej informacji. Informuje to przeglądarkę, w jakim rozmiarze ma wyświetlać obraz w różnych warunkach. Te warunki są określone w zapytaniu o multimedia.

Atrybut sizes przyjmuje listę rozdzieloną przecinkami zapytań o media i szerokości obrazów.

<img
 src="small-image.png"
 alt="A description of the image."
 width="300"
 height="200"
 loading="lazy"
 decoding="async"
 srcset="small-image.png 300w,
  medium-image.png 600w,
  large-image.png 1200w"
 sizes="(min-width: 66em) 33vw,
  (min-width: 44em) 50vw,
  100vw"
>

W tym przykładzie informujesz przeglądarkę, że w obszarze widoku o szerokości powyżej 66em obraz powinien być wyświetlany nie szerzej niż 1/3 ekranu (np. w układzie 3-kolumnowym).

W przypadku szerokości widocznego obszaru od 44em do 66em wyświetlaj obraz na połowie szerokości ekranu (jak w układzie dwukolumnowym).

W przypadku elementów węższych niż 44em obraz powinien być wyświetlany na całej szerokości ekranu.

Oznacza to, że największy obraz niekoniecznie będzie używany na najszerszym ekranie. W przypadku szerokiego okna przeglądarki, w którym można wyświetlić układ wielokolumnowy, używany jest obraz mieszczący się w jednej kolumnie, który może być mniejszy niż obraz używany w układzie jednokolumnowym na węższym ekranie.

Używaj deskryptorów rozmiaru, aby zmieniać układ strony na ekranach o różnych rozmiarach.

Opis gęstości pikseli

Możesz też używać deskryptorów, aby udostępniać alternatywną wersję obrazów do wyświetlania na ekranach o dużej gęstości pikseli. Dzięki temu obrazy będą wyglądać ostro w wyższych rozdzielczościach.

Dwie wersje tego samego zdjęcia szczęśliwego, przystojnego psa z piłką w pysku. Jedno zdjęcie jest wyraźne, a drugie rozmyte.
Obrazy o mniejszej gęstości pikseli mogą być rozmyte.

Użyj deskryptora gęstości, aby opisać gęstość pikseli obrazu w odniesieniu do obrazu w atrybucie src. Deskryptor gęstości to liczba z literą x, np. 1x lub 2x.

<img
 src="small-image.png"
 alt="A description of the image."
 width="300"
 height="200"
 loading="lazy"
 decoding="async"
 srcset="small-image.png 1x,
  medium-image.png 2x,
  large-image.png 3x"
>

Jeśli small-image.png ma rozmiar 300 x 200 pikseli, a medium-image.png ma rozmiar 600 x 400 pikseli, to medium-image.png może występować po 2x na liście srcset.

Nie musisz używać liczb całkowitych. Jeśli inna wersja obrazu ma wymiary 450 x 300 pikseli, możesz ją opisać za pomocą 1.5x.

Obrazy prezentacyjne

Obrazy w HTML-u są treścią. Dlatego dodajesz atrybut alt z opisem obrazu dla czytników ekranu i wyszukiwarek.

Jeśli osadzasz obraz, który ma charakter dekoracyjny i nie zawiera żadnych istotnych treści, możesz użyć pustego atrybutu alt.

<img
 src="flourish.png"
 alt=""
 width="400"
 height="50"
>

Atrybut alt musisz zawsze uwzględniać, nawet jeśli jest pusty. Pusty atrybut alt informuje czytnik ekranu, że obraz ma charakter prezentacyjny. Brak atrybutu alt nie dostarcza tych informacji.

Najlepiej, aby obrazy prezentacyjne lub dekoracyjne były dołączane za pomocą CSS zamiast HTML. HTML służy do tworzenia struktury. CSS służy do prezentacji.

Obrazy tła

Aby wczytywać obrazy prezentacyjne, użyj właściwości background-image w CSS.

element {
  background-image: url(flourish.png);
}

Możesz określić wiele kandydatów na obraz, używając funkcji image-set w przypadku background-image.

Funkcja image-set w CSS działa podobnie do atrybutu srcset w HTML. Podaj listę obrazów z opisem gęstości pikseli dla każdego z nich.

element {
  background-image: image-set(
    small-image.png 1x,
    medium-image.png 2x,
    large-image.png 3x
  );
}

Przeglądarka wybiera obraz najbardziej odpowiedni do gęstości pikseli na urządzeniu.

Podczas dodawania obrazów do witryny należy wziąć pod uwagę wiele czynników, w tym:

  • zarezerwować odpowiednie miejsce na każdy obraz;
  • Określanie liczby potrzebnych rozmiarów.
  • Określanie, czy obraz jest treścią, czy elementem dekoracyjnym.

Warto poświęcić czas na dopracowanie zdjęć. Niewłaściwe strategie dotyczące obrazów mogą irytować i frustrować użytkowników. Dobra strategia dotycząca obrazów sprawia, że witryna działa szybko i wyświetla się w wysokiej jakości niezależnie od urządzenia użytkownika czy połączenia sieciowego.

W zestawie narzędzi masz jeszcze jeden element HTML, który daje większą kontrolę nad obrazami: element picture.

Sprawdź swoją wiedzę

Sprawdź swoją wiedzę o obrazach.

Aby obrazy mieściły się w obszarze wyświetlania, musisz dodać style.

Prawda
Obrazy bez ograniczeń będą miały naturalny rozmiar.
Fałsz
Style są wymagane.

Jeśli wysokość i szerokość obrazu zostały wymuszone w nienaturalnym formacie, które style mogą pomóc dostosować sposób dopasowania obrazu do tych proporcji?

object-fit
Określ, jak obraz pasuje do słów kluczowych, takich jak containcover.
image-fit
Ta usługa nie istnieje, wymyśliłem ją.
fit-image
Ta usługa nie istnieje, wymyśliłem ją.
aspect-ratio
Może to spowodować lub rozwiązać problem z nienaturalnym formatem obrazu.

Umieszczenie znaków heightwidth na obrazach uniemożliwia nadanie im innego stylu za pomocą CSS.

Prawda
Traktuj je raczej jako wskazówki niż reguły.
Fałsz
CSS ma wiele dynamicznych opcji zmiany rozmiaru obrazów, nawet jeśli wysokość i szerokość są wbudowane w tag.

Atrybut srcset nie _______ atrybutu src, ale go _______.

uzupełnia, zastępuje
srcset zdecydowanie nie zastępuje atrybutu src.
zastąpienie, uzupełnienie
Daje to przeglądarce dodatkowe opcje do wyboru, jeśli jest to możliwe.

Brak alt na obrazie jest równoznaczny z pustym alt.

Prawda
Pusty atrybut alt informuje czytnik ekranu, że obraz ma charakter prezentacyjny.
Fałsz
Brak elementu alt nie oznacza nic dla czytnika ekranu.