Iframes per page

How many iframes the page embeds.

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

At a glance the headline numbers for Iframes per page

How many iframes the page embeds.

0
on the typical site
half of sites sit at or below
2
1 in 4 sites exceed this
the top quarter
8
the heaviest 1%
the long tail
180,899
sites measured
phone field data

The typical page embeds 0 iframes.

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 iframes per page

0.00 0.04 0.08 0.11 0.15
0.1
0 51319 102637
0–0 1–1 2–2 3+
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 iframes per page which level passes the CLS most often

Iframes per pageSitesPassing CLSCLS
0–0 102,637 91% 0.00
1–1 31,433 87% 0.00
2–2 21,235 87% 0.00
3+ 25,594 83% 0.00
Good Needs Improvement Poor Faded rows: under 100 sites

Iframes per page 0. p75 2. p99 8. At the low end (0–0): CLS 0.00. At the high end (3+): 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

Each iframe is a separate document with its own resources, scripts and lifecycle, and its work still competes for the same device. The count is a decent proxy for embed weight: chat widgets, videos, ad slots, forms.

Every embed should justify itself. The heavy default (always-on iframe) has a light replacement for almost every case: a facade for video and chat, a static image for maps, a reserved slot for ads.

How does this affect the Core Web Vitals?

Iframes correlate with the CLS. With few iframes, 91% of sites pass the CLS. With many, 83% do. The decline is gradual. There is no point where sites suddenly start failing.

Related signals Responsive image markup → Image fetchpriority → Script coverage (used vs unused) → Bytes by resource type → Chrome field data from 189,915 sites, representing millions of real page loads · How we measured
Live queries (2) — admin only
Query #1: 261.4 ms
SELECT COUNT(*) AS count,
            quantile_disc(m.iframes.total, 0.10) AS p10,
            quantile_disc(m.iframes.total, 0.25) AS p25,
            quantile_disc(m.iframes.total, 0.50) AS p50,
            quantile_disc(m.iframes.total, 0.75) AS p75,
            quantile_disc(m.iframes.total, 0.90) AS p90,
            quantile_disc(m.iframes.total, 0.99) AS p99
            FROM sites WHERE m.iframes.total IS NOT NULL;
Query #2: 234.3 ms
SELECT CASE WHEN m.iframes.total >= 0 AND m.iframes.total < 1 THEN 0 WHEN m.iframes.total >= 1 AND m.iframes.total < 2 THEN 1 WHEN m.iframes.total >= 2 AND m.iframes.total < 3 THEN 2 WHEN m.iframes.total >= 3 THEN 3 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.iframes.total IS NOT NULL GROUP BY bucket_idx;
JSON file lookups (4)
20260625/meta.json 0.04 ms
20260625/types.json 0.57 ms
20260625/loaf-scripts.json 0.35 ms
20260625/menu.json 0.18 ms