Scroll inside the viewport box below. Images start loading before they're visible — at the browser's distance threshold — so they're ready when you reach them. Watch the status badges.
Both pages have the same hero image. Left lazy-loads it; right uses fetchpriority="high". Click "Load page" to simulate the render sequence and watch when LCP fires.
Both columns lazy-load an image mid-content. Left has no width/height; right has them. Click "Load image" and watch the text below jump on the left (CLS) but stay still on the right.
Native lazy loading only works on <img> and <iframe>. A CSS background-image loads immediately, no matter what. Here's the failure and the three fixes.
.hero { background-image: url(...) }
<img loading="lazy" style="object-fit:cover">
<img> with object-fit:cover behind content. Gets native lazy loading.background-image from data-bg only when the element nears the viewport.A YouTube iframe ships 800KB+ of JS even when lazy-loaded. The facade shows a thumbnail and only loads the real iframe on click. Click each to compare the payload.