Optimiser le chargement des polices web
Préchargez vos polices, pilotez font-display et évitez le texte invisible pour accélérer l'affichage et stabiliser votre mise en page.
Une police web complète, avec toutes ses variantes stylistiques et l’intégralité de ses glyphes, peut peser plusieurs mégaoctets et ralentir l’affichage de vos pages. Or les polices comptent parmi les ressources les plus piégeuses : le navigateur ne les télécharge qu’une fois l’arborescence de rendu construite, c’est-à-dire après le DOM et le CSSOM. Résultat, la requête part tard et le texte peut rester invisible pendant que le fichier arrive.
Ce comportement a un impact direct sur vos indicateurs de performance, donc sur votre SEO. Un téléchargement de police trop lent dégrade le First Contentful Paint (le moment où le premier contenu s’affiche), tandis qu’une bascule mal gérée entre police de secours et police définitive provoque des décalages visuels qui pénalisent le Cumulative Layout Shift. Optimiser le chargement des polices, c’est donc gagner sur la vitesse perçue et sur la stabilité visuelle, deux critères que Google valorise et que l’on travaille aussi en optimisant le CLS.
Les polices sont sournoises parce que le navigateur ne les découvre qu’une fois l’arborescence de rendu construite, donc tard, et le texte peut rester invisible pendant ce temps. C’est exactement le genre de détail qui pénalise le FCP sans qu’on comprenne pourquoi. Le duo preload plus font-display réglé correctement résout l’essentiel du problème, à condition de ne pas l’oublier sur les variantes.
Pourquoi les polices arrivent trop tard
Le chargement des polices est dit paresseux : le navigateur ne sait quelles ressources de police récupérer qu’après avoir combiné les arborescences DOM et CSSOM pour produire l’arborescence de rendu. Les requêtes de police partent donc bien après les autres ressources critiques, un phénomène que le chemin critique de rendu aide à comprendre.
Il se crée alors une course entre la première peinture du contenu et l’arrivée du fichier de police. Si la police gagne, tout va bien. Si elle perd, le navigateur affiche la mise en page mais omet le texte : c’est le problème du texte invisible. Deux leviers permettent de reprendre la main : précharger la police pour la demander plus tôt, et indiquer au navigateur comment se comporter en attendant grâce à font-display.
Précharger la police avec preload
Quand vous connaissez à l’avance l’URL d’une police critique, la directive preload déclenche sa requête dès le début du chemin de rendu critique, sans attendre la création du CSSOM. La police est ainsi disponible bien plus tôt.
Deux précautions sont indispensables. D’abord, l’attribut crossorigin est obligatoire, même pour une police auto-hébergée, car les polices sont traitées comme des ressources CORS. Ensuite, n’abusez pas du preload : précharger trop de fichiers détourne la bande passante d’autres ressources critiques et peut télécharger des polices inutiles à la page courante.
<!-- L'attribut crossorigin est requis, même pour une police auto-hébergée. -->
<link rel="preload" as="font" type="font/woff2"
href="/fonts/OpenSans-Regular.woff2" crossorigin>
Piloter l'affichage avec font-display
Le preload augmente les chances que la police soit prête, mais ne garantit rien. La propriété CSS font-display indique au navigateur quoi faire tant que la police n’est pas chargée. Elle découpe la durée de vie du téléchargement en trois périodes : une période de blocage (le texte concerné reste invisible), une période de remplacement (une police de secours s’affiche), puis une période de défaillance (la police est considérée comme échouée et la police de secours reste). Selon la valeur choisie, vous privilégiez la fidélité typographique ou la disponibilité immédiate du texte.
| Valeur de font-display | Comportement | Quand l'utiliser |
|---|---|---|
block |
Bloque le rendu du texte un court instant, puis bascule sur la police définitive |
Quand la cohérence typographique prime sur l’affichage immédiat |
swap |
Affiche tout de suite une police de secours, puis remplace par la police web |
Cas le plus courant, pour montrer le texte sans attendre |
fallback |
Très court blocage, puis secours, et bascule seulement si la police arrive vite |
Bon compromis entre fidélité et rapidité |
optional |
N’utilise la police que si elle arrive en moins de 100 ms, sinon secours |
Quand vous voulez éviter tout décalage visuel à la première visite |
@font-face {
font-family: "Open Sans";
font-style: normal;
font-weight: 400;
font-display: swap; /* ou block, fallback, optional */
src: url("/fonts/OpenSans-Regular.woff2") format("woff2");
}
Mettre les polices en cache durablement
Les polices sont des ressources statiques, rarement modifiées : elles se prêtent parfaitement à une mise en cache de longue durée. Servez-les avec un en-tête de cache adapté et un jeton de revalidation (ETag) afin de permettre leur réutilisation efficace entre vos pages. Une fois la police téléchargée lors de la première visite, les navigations suivantes l’utilisent immédiatement, ce qui supprime l’attente ; pour aller plus loin, voyez comment optimiser les polices web. Si votre site emploie un service worker, une stratégie de cache prioritaire pour les polices convient à la plupart des cas.
Les polices sont considérées comme des ressources CORS. Si vous oubliez l’attribut crossorigin sur votre balise de preload, le navigateur lance une seconde requête au lieu de réutiliser la première, et votre préchargement ne sert à rien. Ajoutez toujours crossorigin, y compris pour les polices hébergées sur votre propre domaine.
À faire
- précharger uniquement les polices critiques
- ajouter l’attribut crossorigin
- choisir une valeur de font-display adaptée
- définir un cache de longue durée
À éviter
- précharger toutes vos polices
- laisser le comportement de blocage par défaut sans réflexion
- intégrer les fichiers de police en base64 dans le CSS
- oublier les en-têtes de cache
Points clés à retenir
- Préchargez les polices critiques avec preload et l'attribut crossorigin
- Utilisez font-display pour éviter le texte invisible et les décalages
- Réservez swap aux contenus à afficher vite, optional pour zéro décalage
- Servez vos polices avec un cache de longue durée et un ETag
- N'intégrez jamais les fichiers de police en base64 dans votre CSS
Quelques réflexes pour des polices qui ne freinent plus l’affichage.
Quiz : testez vos connaissances
Quiz : testez vos connaissances
-
Pourquoi les requêtes de police partent-elles souvent tard dans le chargement ?
- Parce que le serveur retarde volontairement leur envoi
- Parce que les polices sont toujours téléchargées en dernier par principe
- Parce que le navigateur ne sait quelles polices récupérer qu'après avoir combiné le DOM et le CSSOM
Le chargement des polices est paresseux : le navigateur ne sait quelles ressources récupérer qu’après avoir combiné les arborescences DOM et CSSOM pour produire l’arborescence de rendu.
-
Quel attribut ne doit pas manquer sur une balise de preload de police ?
- crossorigin, car les polices sont considérées comme des ressources CORS
- defer, pour différer la police après le rendu
- loading, pour activer le chargement paresseux
Les polices sont des ressources CORS. Sans l’attribut
crossoriginsur la balise de preload, le navigateur lance une seconde requête inutile. -
Quelle propriété affiche immédiatement un texte de repli tant que la police n'est pas chargée ?
- font-weight, qui ajuste l'épaisseur du texte
- font-display, par exemple avec la valeur swap
- font-family, qui change simplement de police
La propriété
font-displayindique au navigateur quoi faire tant que la police n’est pas chargée. La valeurswapaffiche immédiatement un texte de repli.
Besoin d'un accompagnement SEO ?
Vos polices ralentissent l'affichage et déstabilisent votre mise en page ? Faisons le point sur leur chargement.