Images per page

How many images the page renders and their over-the-wire weight.

Field data PhoneDesktopAll Scope All sites Q2 2026 edition · Phone field outcomes
Metric LCP INP CLS
1

At a glance the headline numbers for Images per page

How many images the page renders and their over-the-wire weight.

1.1 MB
Median (p50)
185,438 sites
2.8 MB
p75
26.3 MB
p99
Long tail

The typical page serves images weighing 1.1 MB.

The State of Web Vitals · Q2 2026 · 189,915 sites · phone field datacorewebvitals.io/state-of-cwv
2

Distribution & median CLS site count and median CLS at each level of images per page — size

0.00 0.04 0.08 0.11 0.15
0.1
0 29090 58179
0–499 500–999 1000–1499 1500–1999 2000–2499 2500–2999 3000–3499 3500–3999 4000–4499 4500–4999 5000–5499 5500–5999 6000–6499 6500+
Good (≤0.1) Needs improvement Poor (>0.25) Site count
The State of Web Vitals · Q2 2026 · 189,915 sites · phone field datacorewebvitals.io/state-of-cwv
3

Passing CLS by images per page — size which level passes the CLS most often

Images per page — sizeSitesPassing CLSCLS
0–499 58,179 89% 0.00
500–999 30,515 90% 0.00
1000–1499 20,139 89% 0.00
1500–1999 14,364 89% 0.00
2000–2499 10,613 89% 0.00
2500–2999 7,879 89% 0.00
3000–3499 6,229 88% 0.00
3500–3999 4,909 88% 0.00
4000–4499 4,071 87% 0.00
4500–4999 3,170 88% 0.00
5000–5499 2,836 88% 0.00
5500–5999 2,359 88% 0.00
6000–6499 1,999 87% 0.00
6500+ 18,176 87% 0.00
Good Needs Improvement Poor Faded rows: under 100 sites

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

The State of Web Vitals · Q2 2026 · 189,915 sites · phone field datacorewebvitals.io/state-of-cwv
4

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.

Related signals Iframes per page → Bytes by resource type → Stylesheet loading mix → Iframe loading → Chrome field data from 189,915 sites, representing millions of real page loads · How we measured
Live queries (3) — admin only
Query #1: 14.3 ms
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;
Query #2: 289.6 ms
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;
Query #3: 210.2 ms
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;
JSON file lookups (4)
20260625/meta.json 0.04 ms
20260625/types.json 0.80 ms
20260625/loaf-scripts.json 0.65 ms
20260625/menu.json 0.22 ms