Stylesheets per page

How many stylesheets the page loads and their over-the-wire weight.

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

At a glance the headline numbers for Stylesheets per page

How many stylesheets the page loads and their over-the-wire weight.

14
stylesheet count
on the typical page
77 KB
CSS weight
on the typical page
153 KB
1 in 4 pages exceed this
CSS weight
190,130
sites measured
desktop field data

The typical page loads 14 stylesheets weighing 77 KB.

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

Distribution & median INP site count and median INP at each level of stylesheets per page — n

0ms 63ms 125ms 188ms 250ms
200ms
0 21070 42139
0–4 5–9 10–14 15–19 20–24 25–29 30–34 35–39 40–44 45–49 50+
Good (≤200ms) Needs improvement Poor (>500ms) Site count
The State of Web Vitals · Q2 2026 · 189,915 sites · desktop field datacorewebvitals.io/state-of-cwv
3

Passing INP by stylesheets per page — n which level passes the INP most often

Stylesheets per page — nSitesPassing INPINP
0–4 42,139 99% 46ms
5–9 32,216 99% 48ms
10–14 23,832 99% 48ms
15–19 17,745 99% 49ms
20–24 15,132 99% 49ms
25–29 11,541 99% 49ms
30–34 9,247 99% 50ms
35–39 7,605 99% 51ms
40–44 6,048 99% 52ms
45–49 4,858 99% 51ms
50+ 19,767 99% 58ms
Good Needs Improvement Poor Faded rows: under 100 sites

Stylesheets per page — n 14. p75 29. p99 118. At the low end (0–4): INP 46ms. At the high end (50+): INP 58ms. computed

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

Distribution & median INP site count and median INP at each level of stylesheets per page — size

0ms 63ms 125ms 188ms 250ms
200ms
0 29157 58314
0–49 50–99 100–149 150–199 200–249 250–299 300+
Good (≤200ms) Needs improvement Poor (>500ms) Site count
The State of Web Vitals · Q2 2026 · 189,915 sites · desktop field datacorewebvitals.io/state-of-cwv
5

Passing INP by stylesheets per page — size which level passes the INP most often

Stylesheets per page — sizeSitesPassing INPINP
0–49 58,314 99% 47ms
50–99 45,576 99% 49ms
100–149 24,492 99% 50ms
150–199 15,787 99% 50ms
200–249 8,427 99% 53ms
250–299 4,964 99% 51ms
300+ 15,068 99% 50ms
Good Needs Improvement Poor Faded rows: under 100 sites

Stylesheets per page — size 77 KB. p75 153 KB. p99 1.2 MB. At the low end (0–49 KB): INP 47ms. At the high end (300+ KB): INP 50ms. computed

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

Why this matters for the Core Web Vitals, and where to start fixing it

Every blocking stylesheet is a render gate. The browser paints nothing until the last one arrives, so the count multiplies the risk: more requests on the critical path, more chances that one of them is the slow one.

Few files beat many here. The request side costs more than the byte side: one round trip on a cold connection outweighs a lot of kilobytes on a warm one. Bundle the critical CSS into as few files as the architecture allows.

Related signals Script loading mix → Font source → Image format 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: 152.3 ms
SELECT COUNT(*) AS count,
            quantile_disc(m.stylesheets.total.n, 0.10) AS p10,
            quantile_disc(m.stylesheets.total.n, 0.25) AS p25,
            quantile_disc(m.stylesheets.total.n, 0.50) AS p50,
            quantile_disc(m.stylesheets.total.n, 0.75) AS p75,
            quantile_disc(m.stylesheets.total.n, 0.90) AS p90,
            quantile_disc(m.stylesheets.total.n, 0.99) AS p99
            FROM sites WHERE m.stylesheets.total.n IS NOT NULL;
Query #2: 109.8 ms
SELECT CASE WHEN m.stylesheets.total.n >= 0 AND m.stylesheets.total.n < 5 THEN 0 WHEN m.stylesheets.total.n >= 5 AND m.stylesheets.total.n < 10 THEN 1 WHEN m.stylesheets.total.n >= 10 AND m.stylesheets.total.n < 15 THEN 2 WHEN m.stylesheets.total.n >= 15 AND m.stylesheets.total.n < 20 THEN 3 WHEN m.stylesheets.total.n >= 20 AND m.stylesheets.total.n < 25 THEN 4 WHEN m.stylesheets.total.n >= 25 AND m.stylesheets.total.n < 30 THEN 5 WHEN m.stylesheets.total.n >= 30 AND m.stylesheets.total.n < 35 THEN 6 WHEN m.stylesheets.total.n >= 35 AND m.stylesheets.total.n < 40 THEN 7 WHEN m.stylesheets.total.n >= 40 AND m.stylesheets.total.n < 45 THEN 8 WHEN m.stylesheets.total.n >= 45 AND m.stylesheets.total.n < 50 THEN 9 WHEN m.stylesheets.total.n >= 50 THEN 10 END AS bucket_idx, COUNT(*) AS n,
            quantile_disc(crux."desktop".inp, 0.5) AS median,
            COUNT(*) FILTER (WHERE crux."desktop".inp IS NOT NULL AND crux."desktop".inp <= 200) * 1.0 / NULLIF(COUNT(*) FILTER (WHERE crux."desktop".inp IS NOT NULL), 0) AS good_pct
            FROM sites WHERE m.stylesheets.total.n IS NOT NULL GROUP BY bucket_idx;
Query #3: 247.4 ms
SELECT COUNT(*) AS count,
            quantile_disc(m.stylesheets.total.size, 0.10) AS p10,
            quantile_disc(m.stylesheets.total.size, 0.25) AS p25,
            quantile_disc(m.stylesheets.total.size, 0.50) AS p50,
            quantile_disc(m.stylesheets.total.size, 0.75) AS p75,
            quantile_disc(m.stylesheets.total.size, 0.90) AS p90,
            quantile_disc(m.stylesheets.total.size, 0.99) AS p99
            FROM sites WHERE m.stylesheets.total.size IS NOT NULL;
Query #4: 223.9 ms
SELECT CASE WHEN m.stylesheets.total.size >= 0 AND m.stylesheets.total.size < 50 THEN 0 WHEN m.stylesheets.total.size >= 50 AND m.stylesheets.total.size < 100 THEN 1 WHEN m.stylesheets.total.size >= 100 AND m.stylesheets.total.size < 150 THEN 2 WHEN m.stylesheets.total.size >= 150 AND m.stylesheets.total.size < 200 THEN 3 WHEN m.stylesheets.total.size >= 200 AND m.stylesheets.total.size < 250 THEN 4 WHEN m.stylesheets.total.size >= 250 AND m.stylesheets.total.size < 300 THEN 5 WHEN m.stylesheets.total.size >= 300 THEN 6 END AS bucket_idx, COUNT(*) AS n,
            quantile_disc(crux."desktop".inp, 0.5) AS median,
            COUNT(*) FILTER (WHERE crux."desktop".inp IS NOT NULL AND crux."desktop".inp <= 200) * 1.0 / NULLIF(COUNT(*) FILTER (WHERE crux."desktop".inp IS NOT NULL), 0) AS good_pct
            FROM sites WHERE m.stylesheets.total.size IS NOT NULL GROUP BY bucket_idx;
JSON file lookups (4)
20260625/meta.json 0.03 ms
20260625/types.json 0.52 ms
20260625/loaf-scripts.json 0.38 ms
20260625/menu.json 2.80 ms