Stylesheets per page

How many stylesheets the page loads 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 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
phone field data

The typical page loads 14 stylesheets weighing 77 KB.

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 stylesheets per page — n

0.00 0.04 0.08 0.11 0.15
0.1
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 (≤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 stylesheets per page — n which level passes the CLS most often

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

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

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

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

0.00 0.04 0.08 0.11 0.15
0.1
0 29157 58314
0–49 50–99 100–149 150–199 200–249 250–299 300+
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
5

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

Stylesheets per page — sizeSitesPassing CLSCLS
0–49 58,314 90% 0.00
50–99 45,576 90% 0.00
100–149 24,492 88% 0.00
150–199 15,787 88% 0.00
200–249 8,427 87% 0.00
250–299 4,964 85% 0.00
300+ 15,068 87% 0.00
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): CLS 0.00. At the high end (300+ KB): CLS 0.00. computed

The State of Web Vitals · Q2 2026 · 189,915 sites · phone 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: 106.2 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: 99.6 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."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.stylesheets.total.n IS NOT NULL GROUP BY bucket_idx;
Query #3: 273.1 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: 256.6 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."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.stylesheets.total.size IS NOT NULL GROUP BY bucket_idx;
JSON file lookups (4)
20260625/meta.json 0.06 ms
20260625/types.json 0.79 ms
20260625/loaf-scripts.json 0.64 ms
20260625/menu.json 0.20 ms