Images per page
How many images the page renders and their over-the-wire weight.
At a glance the headline numbers for Images per page
How many images the page renders and their over-the-wire weight.
The typical page serves images weighing 1.1 MB.
Distribution & median CLS site count and median CLS at each level of images per page — size
Passing CLS by images per page — size which level passes the CLS most often
Images per page — size 1.1 MB. p75 2.8 MB. p99 26.3 MB. At the low end (0–499 KB): CLS 0.00. At the high end (6500+ KB): CLS 0.00. computed
Why this matters for the Core Web Vitals, and where to start fixing it
Image count and image weight are the bulk of most pages. Those bytes compete with the LCP image for bandwidth: the browser downloads gallery thumbnails while the hero is still streaming. More images also means more decode work, and decoding is not free on a cheap phone.
Fewer, smaller, later. Cut the decorative ones, right-size the rest, lazy-load below the fold. The format and loading splits in the explorer show where to start.
Chrome field data from 189,915 sites, representing millions of real page loads. How we measured.
Live queries (3) — admin only
SELECT COUNT(*) AS count,
quantile_disc(m.images.total.n, 0.10) AS p10,
quantile_disc(m.images.total.n, 0.25) AS p25,
quantile_disc(m.images.total.n, 0.50) AS p50,
quantile_disc(m.images.total.n, 0.75) AS p75,
quantile_disc(m.images.total.n, 0.90) AS p90,
quantile_disc(m.images.total.n, 0.99) AS p99
FROM sites WHERE m.images.total.n IS NOT NULL;
SELECT COUNT(*) AS count,
quantile_disc(m.images.total.size, 0.10) AS p10,
quantile_disc(m.images.total.size, 0.25) AS p25,
quantile_disc(m.images.total.size, 0.50) AS p50,
quantile_disc(m.images.total.size, 0.75) AS p75,
quantile_disc(m.images.total.size, 0.90) AS p90,
quantile_disc(m.images.total.size, 0.99) AS p99
FROM sites WHERE m.images.total.size IS NOT NULL;
SELECT CASE WHEN m.images.total.size >= 0 AND m.images.total.size < 500 THEN 0 WHEN m.images.total.size >= 500 AND m.images.total.size < 1000 THEN 1 WHEN m.images.total.size >= 1000 AND m.images.total.size < 1500 THEN 2 WHEN m.images.total.size >= 1500 AND m.images.total.size < 2000 THEN 3 WHEN m.images.total.size >= 2000 AND m.images.total.size < 2500 THEN 4 WHEN m.images.total.size >= 2500 AND m.images.total.size < 3000 THEN 5 WHEN m.images.total.size >= 3000 AND m.images.total.size < 3500 THEN 6 WHEN m.images.total.size >= 3500 AND m.images.total.size < 4000 THEN 7 WHEN m.images.total.size >= 4000 AND m.images.total.size < 4500 THEN 8 WHEN m.images.total.size >= 4500 AND m.images.total.size < 5000 THEN 9 WHEN m.images.total.size >= 5000 AND m.images.total.size < 5500 THEN 10 WHEN m.images.total.size >= 5500 AND m.images.total.size < 6000 THEN 11 WHEN m.images.total.size >= 6000 AND m.images.total.size < 6500 THEN 12 WHEN m.images.total.size >= 6500 THEN 13 END AS bucket_idx, COUNT(*) AS n,
quantile_disc(crux."phone".cls, 0.5) AS median,
COUNT(*) FILTER (WHERE crux."phone".cls IS NOT NULL AND crux."phone".cls <= 0.1) * 1.0 / NULLIF(COUNT(*) FILTER (WHERE crux."phone".cls IS NOT NULL), 0) AS good_pct
FROM sites WHERE m.images.total.size IS NOT NULL GROUP BY bucket_idx;