Images per page

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

Field data PhoneDesktopAll Scope All sites Q2 2026 edition · All devices 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.

21
image count
on the typical page
1.1 MB
image weight
on the typical page
2.8 MB
1 in 4 pages exceed this
image weight
190,130
sites measured
all-device field data

The typical page serves 21 images weighing 1.1 MB.

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

Distribution & median LCP site count and median LCP at each level of images per page — n

0ms 750ms 1500ms 2250ms 3000ms
2.5s
0 13970 27940
0–4 5–9 10–14 15–19 20–24 25–29 30–34 35–39 40–44 45–49 50–54 55–59 60–64 65+
Good (≤2.5s) Needs improvement Poor (>4s) Site count
The State of Web Vitals · Q2 2026 · 189,915 sites · all devices field datacorewebvitals.io/state-of-cwv
3

Passing LCP by images per page — n which level passes the LCP most often

Images per page — nSitesPassing LCPLCP
0–4 27,940 84% 1.4s
5–9 19,827 87% 1.3s
10–14 22,004 85% 1.4s
15–19 21,116 84% 1.5s
20–24 18,466 83% 1.5s
25–29 15,032 82% 1.5s
30–34 12,107 82% 1.6s
35–39 9,509 81% 1.6s
40–44 7,471 81% 1.6s
45–49 5,905 80% 1.6s
50–54 4,805 79% 1.7s
55–59 3,828 79% 1.7s
60–64 3,097 80% 1.7s
65+ 19,023 77% 1.7s
Good Needs Improvement Poor Faded rows: under 100 sites

Images per page — n 21. p75 38. p99 177. At the low end (0–4): LCP 1.4s. At the high end (65+): LCP 1.7s. computed

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

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

0ms 750ms 1500ms 2250ms 3000ms
2.5s
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 (≤2.5s) Needs improvement Poor (>4s) Site count
The State of Web Vitals · Q2 2026 · 189,915 sites · all devices field datacorewebvitals.io/state-of-cwv
5

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

Images per page — sizeSitesPassing LCPLCP
0–499 58,179 86% 1.3s
500–999 30,515 85% 1.5s
1000–1499 20,139 83% 1.5s
1500–1999 14,364 82% 1.6s
2000–2499 10,613 81% 1.6s
2500–2999 7,879 79% 1.6s
3000–3499 6,229 78% 1.7s
3500–3999 4,909 78% 1.7s
4000–4499 4,071 79% 1.7s
4500–4999 3,170 76% 1.7s
5000–5499 2,836 77% 1.7s
5500–5999 2,359 77% 1.7s
6000–6499 1,999 78% 1.7s
6500+ 18,176 75% 1.8s
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): LCP 1.3s. At the high end (6500+ KB): LCP 1.8s. computed

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

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.

How do images affect the Core Web Vitals?

Images per page correlates with the LCP. Image weight separates passing sites from failing sites more than image count does. Where the image weight is low, 86% of sites pass the LCP. Where it is high, 75% do. The decline is gradual. There is no point where sites suddenly start failing.

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 (4) — admin only
Query #1: 95.2 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: 102.6 ms
SELECT CASE WHEN m.images.total.n >= 0 AND m.images.total.n < 5 THEN 0 WHEN m.images.total.n >= 5 AND m.images.total.n < 10 THEN 1 WHEN m.images.total.n >= 10 AND m.images.total.n < 15 THEN 2 WHEN m.images.total.n >= 15 AND m.images.total.n < 20 THEN 3 WHEN m.images.total.n >= 20 AND m.images.total.n < 25 THEN 4 WHEN m.images.total.n >= 25 AND m.images.total.n < 30 THEN 5 WHEN m.images.total.n >= 30 AND m.images.total.n < 35 THEN 6 WHEN m.images.total.n >= 35 AND m.images.total.n < 40 THEN 7 WHEN m.images.total.n >= 40 AND m.images.total.n < 45 THEN 8 WHEN m.images.total.n >= 45 AND m.images.total.n < 50 THEN 9 WHEN m.images.total.n >= 50 AND m.images.total.n < 55 THEN 10 WHEN m.images.total.n >= 55 AND m.images.total.n < 60 THEN 11 WHEN m.images.total.n >= 60 AND m.images.total.n < 65 THEN 12 WHEN m.images.total.n >= 65 THEN 13 END AS bucket_idx, COUNT(*) AS n,
            quantile_disc(crux."all".lcp, 0.5) AS median,
            COUNT(*) FILTER (WHERE crux."all".lcp IS NOT NULL AND crux."all".lcp <= 2500) * 1.0 / NULLIF(COUNT(*) FILTER (WHERE crux."all".lcp IS NOT NULL), 0) AS good_pct
            FROM sites WHERE m.images.total.n IS NOT NULL GROUP BY bucket_idx;
Query #3: 237.2 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 #4: 229.7 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."all".lcp, 0.5) AS median,
            COUNT(*) FILTER (WHERE crux."all".lcp IS NOT NULL AND crux."all".lcp <= 2500) * 1.0 / NULLIF(COUNT(*) FILTER (WHERE crux."all".lcp 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.89 ms
20260625/loaf-scripts.json 0.54 ms
20260625/menu.json 0.18 ms