Direct answer: of 25 homepages, 16 declare @font-face in their first three stylesheets, for 227 faces; they reference 63 unique font URLs, 51 of which return 200, and declared bytes total 145,002,817 B (about 145 MB). The largest single file is 16.4 MB and five sites exceed 10 MB. No site sets font-display on every face; three use swap on some faces and none preload a font.
This study parses @font-face declarations in the homepage's first three stylesheets and reads only the response headers of font URLs for bytes; it does not store font bodies or measure rendering, FOIT or CLS.
Method: homepage plus the first three stylesheets
On 2026-11-08 between 10:40 and 10:42 each of the 25 homepages from study 4 received one GET (15-second timeout); rel="stylesheet" links were extracted and the first three were fetched (12-second timeout) to parse the family, font-display, source host and format of every @font-face. Font files were not requested and whether a face is used above the fold was not judged.
| Item | Rule | Boundary |
|---|---|---|
| @font-face | Declared in the first three stylesheets | Fourth and later stylesheets unchecked |
| swap | At least one face uses font-display: swap | Does not mean every face is set |
| Third-party host | src host differs from the homepage host | Private CDNs are not distinguished |
| woff2 | Any src ends in .woff2 | Transfer size not measured |
Result: 16 of 25 declare fonts, faces are highly concentrated
| Metric | Sites / value | Note |
|---|---|---|
| With @font-face | 16 | Nine without; three of those have no external stylesheet |
| Total faces | 227 | Across the 16 sites |
| Median faces per site | 4 | E17's 164 dominates the total |
| Median families | 3.5 | E17 has 153 families |
E17's 164 faces and 153 families look like an icon or glyph library rather than text faces; that adds stylesheet weight and font requests without much above-the-fold value. The other sites mostly sit between 1 and 14 faces.
Font files: 63 URLs and 145 MB in total
From the first three stylesheets of 15 sites we extracted 63 unique font URLs (at most eight per site) and requested them with the homepage Referer: 51 returned 200, 10 returned 404 and 2 returned 502; 13 sites exposed a Content-Length. Declared font bytes total 145,002,817 B, the largest single file is 16,353,128 B (E14), and five sites exceed 10 MB (E09, E14, E19, E22, E23), with E22 around 63 MB.
| Item | Value | Note |
|---|---|---|
| Unique font URLs | 63 | 15 sites, at most eight each |
| HTTP 200 / 404 / 502 | 51 / 10 / 2 | Requested with the homepage Referer |
| Sites with byte data | 13 | Content-Length present |
| Declared bytes | 145,002,817 B | About 145 MB; only declared files |
| Largest file | 16,353,128 B | E14, about 16.4 MB |
| Sites over 10 MB | 5 | E09, E14, E19, E22, E23 |
Declared bytes are not first-screen traffic: browsers fetch only the files needed for the characters used, guided by unicode-range, so unused faces are not requested. A single 10 MB+ file still shows the font was not subset or split by character set, so the first hit downloads the whole file — a risk for mobile networks and first-screen time.
font-display: no site sets it everywhere, three use swap somewhere
| font-display | Sites | Note |
|---|---|---|
| Set on every face | 0 | — |
| swap on at least one face | 3 | E17, E22, E23 |
| At least one face missing | 16 | Every site with @font-face |
Without font-display, browsers may hide text until the font loads (FOIT); swap shows a fallback first. The three sites only set swap on some faces, so the policy is not applied at the stylesheet level.
Third parties, formats and preload: seven, five and zero
| Item | Sites | Note |
|---|---|---|
| Third-party font host | 7 | Font host differs from the homepage host |
| woff2 | 5 | Others show no woff2 |
| Font preload | 0 | No preload with as="font" |
A third-party font host adds DNS/TLS and connection cost; woff2 on only five sites may mean heavy use of system or icon fonts. Zero preload is not automatically wrong: if a font does not block the first screen, preloading can waste bandwidth, but a critical above-the-fold font is worth evaluating separately.
What this means for acceptance
- Set font-display on every @font-face. None of the 16 sites does; a consistent
swaporoptionalreduces FOIT. - Prefer woff2. Only five sites show it; new setups should ship woff2 with a fallback format.
- Control the number of faces. E17's 164 faces need review: can icon fonts become SVG, can weights be consolidated?
- Time third-party fonts separately. Seven sites reference external font hosts, adding a dependency for DNS, TLS and availability.
- Evaluate preload per first screen. None use it; if a font blocks the first screen, preload one critical face with
crossorigin. See the website development service checklist. - Look at bytes before face count. E14 has a 16.4 MB file and five sites exceed 10 MB; CJK fonts need subsetting or unicode-range splitting.
Limits
- First three stylesheets only: later CSS may declare more faces; this study does not judge completeness.
- No font bodies: bytes come from Content-Length; actual loading, FOIT/CLS and the font finally used are not measured.
- Three sites without external CSS: E18, E20 and E25 had no parsable stylesheet, so their font use is unknown.
- One snapshot: 2026-11-08 10:40–10:42; CDN and redesigns can change results.
- 25-site pilot: no industry claim.
- Byte scope: first three stylesheets and at most eight font URLs per site; declared bytes are not actual downloads; the 10 404s and two 502s are not attributed individually.
Data and reproduction
Anonymised data: equipment-homepage-font-delivery-2026.csv (25 rows × 12 columns: stylesheets, faces/families, swap, third-party hosts, woff2, preload). Font bytes: equipment-homepage-font-bytes-2026.csv (25 rows × 10 columns: font URLs, 200/non-200, sites with bytes, total bytes, largest file, third-party). The repository keeps docs/research/2026-11-homepage-font-delivery.csv and 2026-11-homepage-font-bytes.csv.
Parser: scripts/font_delivery_probe.py; unit tests: scripts/test_content_font_delivery.py (9 tests, no network). Run:
python -m unittest scripts.test_content_font_delivery
Related: the homepage resource inventory pilot, the homepage performance proxy pilot, and the homepage cache, compression and revalidation pilot, and the homepage blocking-resource pilot.
Sources and definitions
- Sample: the 25 homepages from study 4 (same sample_id).
- Fetch: 2026-11-08 10:40–10:42 Asia/Shanghai, serial, 0.5 s apart, 15/12-second timeouts.
- CSS: the first three
rel="stylesheet"links in document order. - Metrics: family, display, src host and format of each @font-face; font files are not requested.
- Font bytes: 2026-11-08 11:44–11:46; font URLs from the first three stylesheets (at most eight per site), requested with the homepage Referer, headers and Content-Length only.
Frequently asked questions
What happens without font-display?
Browsers may hide text until the font loads (FOIT); swap shows a fallback font first and replaces it with the custom font.
Why does E17 have 164 @font-face blocks?
Mostly icon fonts and large weight/glyph sets; icon fonts can often be replaced with SVG or inline icons to cut requests and bytes.
What does woff2 on only five sites mean?
The others may use system fonts, icon fonts or older formats; woff2 compresses better and should be preferred in new setups.
Should fonts be preloaded?
Preloading a critical above-the-fold font can cut delay; whether it helps depends on whether the font blocks the first screen. No site does it here.
Do 25 sites represent the industry?
No. This is the same 25 equipment-company homepages from study 4; it describes only these pages.
Can the data be re-checked?
Yes. The stylesheet data has 25 rows by 12 columns and the byte data 25 by 10; font_delivery_probe.py has 13 offline unit tests.
Will all 145 MB be downloaded?
No. Browsers request only the files needed for the characters used, guided by unicode-range; a single 10 MB+ file still means no subsetting or splitting, so the first hit fetches the whole file.