Précharger les polices facultatives sans décalage ni FOIT
Associez rel=preload et font-display: optional pour afficher vos polices personnalisées sans décalage de mise en page ni flash de texte invisible.
L’extraction et le rendu des polices web peuvent provoquer des décalages de mise en page de deux manières : soit une police de remplacement est échangée contre la police définitive (flash de texte sans style), soit du texte reste invisible jusqu’à l’affichage de la police (flash de texte invisible, ou FOIT). Dans les deux cas, le contenu bouge, l’utilisateur est gêné et le CLS se dégrade.
Ces décalages ont un impact SEO concret : ils dégradent le Cumulative Layout Shift (CLS), l’un des Core Web Vitals qui mesure l’instabilité visuelle d’une page. À partir de Chrome 83, il existe une combinaison qui supprime totalement ces à-coups pour les polices facultatives : associer la balise rel= »preload » à la déclaration font-display: optional, dans le prolongement des bonnes pratiques pour optimiser le chargement des polices.
Les polices web sont une source de décalages que l’on traite trop tard, alors qu’elles abîment directement le CLS. La combinaison du preload et de font-display: optional est l’une des solutions les plus propres que je connaisse pour servir une police sans flash ni saut de mise en page. Quand la stabilité visuelle compte, c’est le réglage que je recommande.
La propriété font-display et ses périodes
La propriété CSS font-display contrôle le comportement d’affichage d’une police personnalisée chargée de façon asynchrone. Elle s’appuie sur une chronologie faite de périodes pendant lesquelles le navigateur décide quoi afficher. Le tableau ci-dessous résume les valeurs principales et leur effet.
| Valeur | Comportement | Effet visuel |
|---|---|---|
block |
Texte invisible, puis bascule vers la police web une fois chargée |
Risque de flash de texte invisible (FOIT) |
swap |
Police système de remplacement, puis bascule vers la police web |
Risque de flash de texte sans style |
fallback |
Brève période invisible, puis police de remplacement |
Compromis entre block et swap |
optional |
Période de blocage courte, pas d’échange forcé après coup |
Aucune refonte si combiné au préchargement |
Pourquoi la valeur optional change tout
Auparavant, une police déclarée en font-display: optional disposait d’une période de blocage de 100 ms sans période d’échange. Si la police se téléchargeait dans ce délai, elle s’affichait ; sinon, la police de remplacement prenait le relais sans échange ultérieur. Le souci, c’est que Chrome effectuait malgré tout un second rendu de la page dans les deux cas, ce qui provoquait un léger scintillement et parfois un décalage de mise en page, même quand la police était déjà en cache.
Depuis Chrome 83, des optimisations suppriment ce premier cycle de rendu pour les polices facultatives préchargées. Le rendu est bloqué jusqu’à ce que la police soit chargée ou qu’un délai s’écoule. Résultat : plus de décalage de mise en page ni de flash de texte invisible. Ce comportement correspond à la spécification, selon laquelle une police facultative ne doit jamais déclencher de refonte.
Associer preload et font-display: optional
Le préchargement n’est pas obligatoire pour une police facultative, mais il augmente fortement les chances qu’elle soit chargée avant le premier cycle de rendu, surtout si elle n’est pas encore dans le cache du navigateur. C’est cette combinaison qui garantit l’affichage le plus fluide.
Concrètement, vous ajoutez une balise link rel= »preload » pointant vers le fichier de police, avec l’attribut as= »font », puis vous déclarez font-display: optional dans votre règle @font-face. Le navigateur récupère la police tôt et, grâce à optional, n’impose aucune refonte si elle n’arrive pas à temps.
<link rel="preload" as="font" type="font/woff2" href="/fonts/ma-police.woff2" crossorigin>
<style>
@font-face {
font-family: "Ma Police";
src: url("/fonts/ma-police.woff2") format("woff2");
font-display: optional;
}
</style>
L’élimination complète des décalages repose sur l’association des deux mécanismes : rel= »preload » seul ou font-display: optional seul ne suffit pas à garantir un rendu sans à-coups. Pensez aussi à vérifier la compatibilité de rel= »preload » et de font-display sur les données de référence des navigateurs, car le comportement décrit s’appuie sur des optimisations introduites à partir de Chrome 83.
À faire
- précharger la police facultative avec rel= »preload » et as= »font »
- déclarer font-display: optional
- vérifier la compatibilité navigateur
À éviter
- compter sur font-display: optional seul pour supprimer les décalages
- oublier l’attribut crossorigin sur le preload de police
- précharger des polices qui ne servent pas à l’affichage initial
Points clés à retenir
- Précharger la police facultative avec rel="preload" et as="font"
- Déclarer font-display: optional dans la règle @font-face
- Protéger le score CLS en évitant les refontes
- Vérifier la compatibilité des navigateurs visés
- Réserver cette technique aux polices vraiment facultatives
Le couple preload + font-display: optional supprime les décalages liés aux polices.
Quiz : testez vos connaissances
Quiz : testez vos connaissances
-
Que désigne le FOIT ?
- Une erreur de compatibilité entre deux polices web
- Le flash de texte invisible, où le texte reste masqué jusqu'au chargement de la police
- Le flash de texte sans style, où une police de remplacement est échangée
FOIT signifie flash de texte invisible : le texte reste masqué jusqu’à ce que la police web soit chargée, ce qui gêne la lecture et peut provoquer des décalages.
-
Le préchargement d'une police facultative est-il obligatoire ?
- Non, mais il augmente nettement les chances qu'elle soit prête avant le premier rendu
- Oui, sans lui la police ne se chargera jamais
- Oui, c'est la seule façon d'éviter le FOIT
Le préchargement n’est pas obligatoire, mais il augmente fortement les chances que la police soit chargée avant le premier cycle de rendu, surtout si elle n’est pas encore en cache.
-
Comment supprimer les décalages liés aux polices facultatives ?
- En utilisant font-display: optional seul
- En associant rel="preload" et font-display: optional
- En utilisant rel="preload" seul
L’élimination des décalages repose sur l’association des deux mécanismes :
rel="preload"seul oufont-display: optionalseul ne suffit pas.
Besoin d'un accompagnement SEO ?
Vos polices personnalisées font sauter votre mise en page et plombent votre CLS ?