Pseudoelementy zoptymalizowane pod kątem rozdzielczości

Funkcje internetowe: image-set()

Używanie obrazów zoptymalizowanych pod kątem rozdzielczości w pseudoelementach CSS (takich jak ::before lub ::after) umożliwia dodawanie ikon dekoracyjnych lub grafik strukturalnych bez zaśmiecania kodu HTML dodatkowymi węzłami DOM. Łącząc pseudoelementy z funkcją CSS image-set(), możesz udostępniać przeglądarce wiele formatów (np. AVIF lub WebP) i rozdzielczości (np. 1x i 2x). Przeglądarka automatycznie wybierze obraz najbardziej optymalny dla możliwości urządzenia użytkownika.

Implementacja

Funkcji image-set() możesz używać bezpośrednio we właściwości content pseudoelementu lub w jego właściwości background-image (podczas ustawiania właściwości content: ""). Pamiętaj, że chociaż podanie zarówno formatu pliku graficznego za pomocą właściwości type(), jak i rozdzielczości (np. 1x lub 2x) daje najlepsze wyniki, oba te argumenty są opcjonalne.

.icon-button::before {
  /* Using image-set directly in the content property */
  /* MANDATORY: Always order your formats from most optimized (AVIF) to least optimized (JPEG/PNG). 
     The browser will stop at the first supported format. */
  content: image-set(
    url("icon.avif") type("image/avif") 1x,
    url("icon-2x.avif") type("image/avif") 2x,
    url("icon.webp") type("image/webp") 1x,
    url("icon-2x.webp") type("image/webp") 2x,
    url("icon.png") type("image/png") 1x,
    url("icon-2x.png") type("image/png") 2x
  );
  
  display: inline-block;
  margin-right: 8px;
  vertical-align: middle;
}

Strategie zastępcze

W przypadku starszych przeglądarek, które nie obsługują funkcji image-set(), MUSISZ podać standardową deklarację obrazu przed regułą image-set(). Ta strategia progresywnego ulepszania opiera się na kaskadowym charakterze CSS: nieobsługiwane reguły są ignorowane.

.icon-button::before {
  /* MANDATORY: Fallback for browsers that do not support image-set() */
  content: url("icon.png");
  
  /* Modern browsers will apply this and override the fallback */
  content: image-set(
    url("icon.avif") type("image/avif") 1x,
    url("icon-2x.avif") type("image/avif") 2x,
    url("icon.png") type("image/png") 1x,
    url("icon-2x.png") type("image/png") 2x
  );
}