Wzorzec 09
Obrazy, które nie pchają
Obraz bez wymiarów to najczęstsze źródło skoków layoutu w sieci. Atrybuty width i height dają przeglądarce proporcje przed pobraniem pliku, srcset dobiera rozdzielczość do ekranu, a placeholder wypełnia zarezerwowane miejsce do czasu dekodowania.
Galeria z zarezerwowanymi proporcjami
Przeładuj i patrz na podpisy pod obrazami: nie drgną, bo aspect-ratio trzyma miejsce, zanim piksele dotrą.
Reguły
- Każdy img ma width i height albo aspect-ratio, zanim przyjdzie plik.
- srcset i sizes dobierają plik do ekranu, zamiast wysyłać desktopowy plik na telefon.
- Obrazy poniżej pierwszego ekranu mają loading lazy, hero ma fetchpriority high.
- Placeholder dziedziczy proporcje obrazu i znika płynnie po dekodowaniu.
Wzorzec w kodzie
<img
src="/atlas-1600.avif"
srcSet="/atlas-800.avif 800w, /atlas-1600.avif 1600w"
sizes="(min-width: 1024px) 50vw, 100vw"
width={1600}
height={900}
alt="Kadr z sesji brandingowej Atlas"
loading="lazy"
className="size-full rounded-xl object-cover"
/><div className="grid aspect-video overflow-hidden rounded-xl">
<div className="skeleton col-start-1 row-start-1" />
<img
onLoad={(event) => event.currentTarget.classList.add("opacity-100")}
className="col-start-1 row-start-1 size-full object-cover opacity-0 transition-opacity"
{...attrs}
/>
</div>