Stylesheet initiator

What injected each stylesheet: parser, script, or inline.

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

At a glance the headline numbers for Stylesheet initiator

What injected each stylesheet: parser, script, or inline.

4
Categories
In the distribution
49.6%
Fleet share
Top: inline
Sites with any
Of inline

3.7% of stylesheets are injected by JavaScript.

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

The stylesheet initiator mix who uses what, and how fast each group loads

VariantShare of requestsMedian
Inline
50%
Parser
46%
Script
4%
Other
1%

Stylesheet initiator. On the fleet: 49.6% inline, 46.1% parser, 3.7% script.

By count inline leads (49.6%); by bytes it is parser (58.8%). computed

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

Passing INP per bucket every category and count level at once - color is the pass rate

1
2
3
4
5
6
7
8
9
10
11
12
Inline 49.6%
90
93
94
95
95
94
94
94
93
90
91
87
Parser 46.1%
89
93
95
95
95
97
96
97
96
96
96
95
Script 3.7%
92
93
93
89
88
83
Other 0.5%
94
90
90
88
89
90
86
← few of this category on the pagemany →
60%95%+ of sites passing INP Faded cells: under 100 sites

Each row is a category, each column its own count bucket (few on the left, many on the right); the cell is the share of those sites passing INP.

Script swings the hardest: 92% of sites pass INP with few, 83% with many. computed

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

Few vs many - does quantity cost INP? the pass rate with few vs many of each category

60%70%80%90%100% few → many
Script 3.7% 92%83%
Other 0.5% 94%86%
Inline 49.6% 90%87%
Parser 46.1% 89%95%
% of sites passing INP · hollow ring = pages with few, solid dot = pages with many

Per category: the pass rate among pages with FEW of it (hollow ring) against pages with MANY (solid dot), worst trend first. Thin buckets are excluded from the endpoints.

More Script costs the most: the INP pass rate falls from 92% with few to 83% with many. computed

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

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

Script-injected CSS is late CSS. The preload scanner cannot see it, it downloads only after the injecting script ran, and when it finally applies it can restyle content that was already painted. Parser-discovered link tags are known from the first bytes of HTML and download immediately.

Late stylesheets are also a CLS source: content rendered with the early styles jumps when the late sheet lands. If a script must inject styles for a widget, scope them to the widget so the rest of the page cannot move.

Related signals Image dimensions set → Script initiator → Stylesheets per page → Scripts per page → Chrome field data from 189,915 sites, representing millions of real page loads · How we measured
Live queries (2) — admin only
Query #1: 63.8 ms
SELECT 1 AS ok FROM site_metric_bags LIMIT 0;
Query #2: 578.3 ms
WITH flat AS (
                SELECT b.cat, b.n, b.size, s.crux."phone".inp AS cwv_val
                FROM site_metric_bags b
                JOIN sites s ON s.origin = b.origin
                WHERE b.path = 'stylesheets.initiator'
                  AND b.cat IS NOT NULL
            ),
            totals AS (
                SELECT cat,
                    SUM(n) AS fleet_n,
                    SUM(size) AS fleet_size,
                    COUNT(*) FILTER (WHERE n IS NOT NULL) AS sample,
                    COUNT(*) FILTER (WHERE n > 0) AS with_any,
                    quantile_disc(n, 0.95) AS p95,
                    COUNT(*) AS n_rows
                FROM flat
                GROUP BY cat
                HAVING COUNT(*) >= (SELECT COUNT(DISTINCT origin) FROM site_metric_bags WHERE path = 'stylesheets.initiator') * 0.005
            ),
            widths AS (
                SELECT *,
                    GREATEST(1, CAST(round(COALESCE(p95, 0)) AS INTEGER)) AS cap,
                    LEAST(GREATEST(1, CAST(round(COALESCE(p95, 0)) AS INTEGER)), 12 - 1) AS regular_buckets
                FROM totals
            ),
            widths2 AS (
                SELECT *,
                    GREATEST(1, CAST(ceil(cap * 1.0 / regular_buckets) AS INTEGER)) AS width
                FROM widths
            ),
            binned AS (
                SELECT f.cat, f.cwv_val, w.fleet_n, w.fleet_size, w.sample, w.with_any, w.width, w.regular_buckets,
                    CASE WHEN f.n IS NULL THEN NULL
                        ELSE LEAST(CAST(FLOOR(f.n * 1.0 / w.width) AS INTEGER), w.regular_buckets)
                    END AS bucket_idx
                FROM flat f
                JOIN widths2 w ON f.cat = w.cat
            )
            SELECT cat, fleet_n, fleet_size, sample, with_any, width, regular_buckets,
                bucket_idx,
                COUNT(*) AS n,
                quantile_disc(cwv_val, 0.5) AS median,
                COUNT(*) FILTER (WHERE cwv_val IS NOT NULL) AS total_cwv,
                COUNT(*) FILTER (WHERE cwv_val IS NOT NULL AND cwv_val <= 200) AS good
            FROM binned
            WHERE bucket_idx IS NOT NULL
            GROUP BY cat, fleet_n, fleet_size, sample, with_any, width, regular_buckets, bucket_idx
            ORDER BY cat, bucket_idx;
JSON file lookups (4)
20260625/meta.json 0.04 ms
20260625/types.json 1.68 ms
20260625/loaf-scripts.json 0.45 ms
20260625/menu.json 0.18 ms