Font loadingBaseline · Widely available
The document.fonts API dynamically loads custom fonts and tracks when fonts are loading or ready to use.
Supported in all major browsers for at least 30 months — safe to use without fallbacks. Baseline since Jan 15, 2020. Widely available since Jul 15, 2022.
Browser support
DesktopChrome
1–34Not supported
35+Supportedsince May 20, 2014
Current: 155Edge
12–18Not supported
79+Supportedsince Jan 15, 2020
Current: 154Firefox
1–40Not supported
41+Supportedsince Sep 22, 2015
Current: 157Safari
1–9.1Not supported
10+Supportedsince Sep 20, 2016
Current: 27MobileChrome Android
18–34Not supported
35+Supportedsince May 20, 2014
Current: 155Firefox Android
4–40Not supported
41+Supportedsince Sep 22, 2015
Current: 157Safari iOS
1–9.3Not supported
10+Supportedsince Sep 13, 2016
Current: 27How to use
This feature is Baseline widely available — use it freely, no fallback needed.
Example
Full syntax and examples are on MDN: fonts.
Feature detection
JS · check before using
if ("onloading" in FontFaceSet.prototype) {
// the loading event is supported
}Documentation (MDN)
Specification
Usage share
Sub-features
Support for each part of the feature (40). The overall table above shows when the whole feature works.
| Sub-feature | Chrome | Edge | Firefox | Safari | Chrome Android | Firefox Android | Safari iOS |
|---|---|---|---|---|---|---|---|
| Document.fonts | 35 | 79 | 41 | 10 | 35 | 41 | 10 |
| FontFace | 35 | 79 | 41 | 10 | 35 | 41 | 10 |
| FontFace.FontFace | 35 | 79 | 41 | 10 | 35 | 41 | 10 |
| FontFace.display | 60 | 79 | 58 | 11.1 | 60 | 58 | 11.3 |
| FontFace.family | 35 | 79 | 41 | 10 | 35 | 41 | 10 |
| FontFace.featureSettings | 140 | 140 | 41 | 10 | 140 | 41 | 10 |
| FontFace.load | 35 | 79 | 41 | 10 | 35 | 41 | 10 |
| FontFace.loaded | 37 | 79 | 41 | 10 | 37 | 41 | 10 |
| FontFace.status | 35 | 79 | 41 | 10 | 35 | 41 | 10 |
| FontFace.stretch | 35 | 79 | 41 | 10 | 35 | 41 | 10 |
| FontFace.style | 35 | 79 | 41 | 10 | 35 | 41 | 10 |
| FontFace.unicodeRange | 35 | 79 | 41 | 10 | 35 | 41 | 10 |
| FontFace.variant | 35 | 79 | 41 | ✕ | 35 | 41 | ✕ |
| FontFace.variationSettings | 140 | 140 | 62 | ✕ | 140 | 62 | ✕ |
| FontFace.weight | 35 | 79 | 41 | 10 | 35 | 41 | 10 |
| FontFace.worker_support | 69 | 79 | 105 | 15 | 69 | 105 | 15 |
| FontFaceSet | 35 | 79 | 41 | 10 | 35 | 41 | 10 |
| FontFaceSet.@@iterator | 48 | 79 | 41 | 10 | 48 | 41 | 10 |
| FontFaceSet.add | 35 | 79 | 41 | 10 | 35 | 41 | 10 |
| FontFaceSet.check | 120 | 120 | 41 | 10 | 120 | 41 | 10 |
Show 20 more
| Sub-feature | Chrome | Edge | Firefox | Safari | Chrome Android | Firefox Android | Safari iOS |
|---|---|---|---|---|---|---|---|
| FontFaceSet.clear | 35 | 79 | 41 | 10 | 35 | 41 | 10 |
| FontFaceSet.delete | 35 | 79 | 41 | 10 | 35 | 41 | 10 |
| FontFaceSet.entries | 48 | 79 | ✕ | 10 | 48 | ✕ | 10 |
| FontFaceSet.forEach | 35 | 79 | 41 | 10 | 35 | 41 | 10 |
| FontFaceSet.has | 35 | 79 | 41 | 10 | 35 | 41 | 10 |
| FontFaceSet.keys | 48 | 79 | ✕ | 10 | 48 | ✕ | 10 |
| FontFaceSet.load | 35 | 79 | 41 | 10 | 35 | 41 | 10 |
| FontFaceSet.loading_event | 35 | 79 | 41 | 26.2 | 35 | 41 | 26.2 |
| FontFaceSet.loadingdone_event | 35 | 79 | 41 | ✕ | 35 | 41 | ✕ |
| FontFaceSet.loadingerror_event | 35 | 79 | 41 | ✕ | 35 | 41 | ✕ |
| FontFaceSet.ready | 35 | 79 | 41 | 10 | 35 | 41 | 10 |
| FontFaceSet.size | 35 | 79 | 41 | 10 | 35 | 41 | 10 |
| FontFaceSet.status | 35 | 79 | 41 | 10 | 35 | 41 | 10 |
| FontFaceSet.values | 48 | 79 | ✕ | 10 | 48 | ✕ | 10 |
| FontFaceSet.worker_support | 69 | 79 | 105 | 15 | 69 | 105 | 15 |
| FontFaceSetLoadEvent | 35 | 79 | 41 | ✕ | 35 | 41 | ✕ |
| FontFaceSetLoadEvent.FontFaceSetLoadEvent | 57 | 79 | 41 | ✕ | 57 | 41 | ✕ |
| FontFaceSetLoadEvent.fontfaces | 35 | 79 | 41 | ✕ | 35 | 41 | ✕ |
| FontFaceSetLoadEvent.worker_support | ✕ | ✕ | 105 | ✕ | ✕ | 105 | ✕ |
| WorkerGlobalScope.fonts | 69 | 79 | 105 | 15 | 69 | 105 | 15 |