Optimiser les polices d’un site indépendant : polices système, font-display, préchargement et FOIT

Les polices sont la bombe à retardement la plus négligée d'un site indépendant. Un fichier de police web non optimisé pèse souvent de 300 Ko à 2 Mo, et pendant son chargement le navigateur rend le texte invisible (FOIT) : en 3G, cela équivaut à un écran vide pendant 3 secondes...

字体加载四态:FOIT、FOUT、swap与系统字体的取舍Font loading: FOIT vs FOUT vs swap vs system font stack 用Web字体会让首屏文字慢300至1000毫秒 —— B2B站真的值吗Web fonts delay text 300-1000ms — is it worth it on a B2B site 策略Strategy 首屏文字First-paint text 适用判断When to use 系统字体栈System stack 立即显示Instant 大多数B2B站默认选它Default for most B2B font-display:swapfont-display:swap 先fallback后替换Fallback then swap preload+swappreload + swap fallback后快速替换Fast swap after preload 品牌站首屏标题Brand hero headings font-display:blockfont-display:block 3秒内空白(FOIT)3s invisible (FOIT) 核心规则:自定义字体≤2个家族 · 每家族只加载400和700 · 子集化Rule: ≤2 families · weights 400+700 only · subset 中文Web字体几乎不可行 —— 一个中文字体2至8MB,系统字体栈是正确答案CN web fonts impractical (2-8MB) — use system stack 红线:字体文件没子集化就上全站 —— 中文一个文件5MB起步Red line: shipping unsubsetted CJK font (5MB+) font-display:block在3G下等于首屏3秒空白,访客早走了block on 3G = 3s blank screen, visitor already gone
Quatre stratégies de chargement des polices : polices système, swap, preload+swap, block, et leurs compromis

Optimiser les polices d’un site indépendant : polices système, font-display, préchargement et FOIT

Conclusion d’abord : Les polices sont la bombe à retardement la plus négligée d’un site indépendant. Un fichier de police web non optimisé pèse souvent de 300 Ko à 2 Mo, et pendant son chargement le navigateur rend le texte invisible (FOIT) : en 3G, cela équivaut à un écran vide pendant 3 secondes. La bonne méthode se joue sur trois niveaux : pour un site anglophone, deux familles de polices web au maximum, avec seulement les graisses 400 et 700 chargées par famille, et font-display:swap obligatoire ; pour un site chinois, n’utilisez presque jamais de police web et passez directement à une pile de polices système, car un sous-ensemble de police chinoise pèse encore 2 à 8 Mo. Un constat contre-intuitif : sur un site B2B, une police personnalisée fantaisie n’apporte quasiment rien à la conversion et pénalise le LCP ; la pile de polices système est la réponse par défaut.

1. Pourquoi les polices bloquent l’affichage du texte

Avant de recevoir le fichier de police, le navigateur ne sait pas à quoi le texte doit ressembler : son comportement par défaut est de rendre le texte invisible (FOIT, Flash of Invisible Text). Cette période de masquage était de 3 secondes sur les anciens navigateurs ; les nouveaux la ramènent à 1 seconde avant de forcer l’affichage avec une police de secours. Le problème : le texte principal du premier écran est justement l’élément LCP, et s’il attend la police, le LCP est tiré vers le bas par le temps de téléchargement de la police.

Erreur typique d’un site indépendant : pour faire “design”, l’auteur du thème charge toutes les graisses d’Inter ou de Roboto depuis Google Fonts (de 100 à 900, soit 9 graisses), à 100 Ko par graisse, soit 900 Ko en une seule fois. En 3G, rien que les polices prennent 3 à 5 secondes à télécharger et l’utilisateur voit un écran vide. Pour les indicateurs liés aux polices dans Core Web Vitals, voir Optimiser les Core Web Vitals, et pour la configuration du CDN, voir Accélération mondiale par CDN.

Question Impact sur les performances Poids typique
Charger toutes les graisses (9 niveaux) 800 Ko de téléchargement en plus au premier écran 80 à 120 Ko par graisse
Police chinoise non sous-ensemblée 2 à 8 Mo par fichier Bien au-delà du budget du premier écran
font-display en block par défaut FOIT : texte masqué 1 à 3 secondes Texte invisible
Police critique non préchargée Police découverte tardivement, 200 ms de retard LCP ralenti
Utiliser plusieurs familles (plus de 3) Chaque famille doit être téléchargée 300 à 500 Ko cumulés

2. La pile de polices système : la réponse par défaut pour un site B2B

La pile de polices système (system font stack) utilise les polices déjà installées sur l’appareil de l’utilisateur : aucune requête réseau, affichage immédiat. Le contenu d’un site indépendant B2B est surtout fait de tableaux de caractéristiques, de descriptions de cas et d’articles techniques ; la mise en page n’a pas besoin de police fantaisie ni de police de marque sur mesure. La pile de polices système suffit largement visuellement et reste cohérente d’une plateforme à l’autre.

Une pile CSS directement utilisable : font-family: -apple-system, BlinkMacSystemFont, “Segoe UI”, Roboto, “Helvetica Neue”, Arial, “PingFang SC”, “Microsoft YaHei”, sans-serif. Cette pile couvre macOS, Windows, Android et iOS, avec des polices système adaptées au français comme au chinois. Contre-intuitif :utiliser les polices système ne rend pas un site “peu professionnel”, au contraire : GitHub, Stripe ou Linear, qui font référence en design, utilisent tous des piles de polices système. Pour choisir un thème WP, voir la pile technique WordPress.

Approche Texte du premier écran Téléchargement supplémentaire Type de site concerné
Pile 100 % polices système Affichage immédiat 0 Ko La plupart des sites B2B indépendants
1 titre en police web Remplacée après le fallback 30 à 80 Ko Sites qui misent sur l’image de marque
2 familles de polices web Remplacée après le fallback 80 à 150 Ko Sites de marque axés design
3 polices web ou plus FOUT/FOIT visibles > 200 Ko Déconseillé
Police web chinoise complète FOIT de plusieurs secondes 2 à 8 Mo Quasiment impossible

3. font-display: swap et FOIT : n’enfouissez pas votre texte

font-display est une propriété de @font-face qui contrôle l’affichage du texte pendant le chargement de la police. Quatre valeurs : auto (valeur par défaut du navigateur, autrefois block), block (masque brièvement le texte 3 secondes puis bascule sur le fallback), swap (affiche tout de suite le fallback, puis remplace une fois la police chargée) et optional (le navigateur décide seul, avec une tendance à ne pas télécharger la police).

Un site B2B indépendant devrait toujours utiliser swap. En 3G, block revient à laisser le premier écran vide pendant 3 secondes : le visiteur est déjà parti. optional convient à une police non essentielle à la marque, mais reste incontrôlable. On entend souvent que “swap provoque un flash de police (FOUT)”, mais pour un site B2B, il est bien plus important de laisser l’utilisateur lire les caractéristiques et les coordonnées que d’attendre une police décorative pour le titre. Un flash de police est parfaitement acceptable ; ce qui coûte cher, c’est un texte invisible. Pour la stratégie de chargement CSS/JS, voir l’optimisation CSS/JS.

font-display Période de blocage Une fois la police chargée Cas d’usage
auto/block Texte invisible pendant 3 secondes Remplacée par la police web Déconseillé
swap Affichage immédiat du fallback Remplacée une fois la police prête Valeur par défaut des sites B2B
fallback Masqué 100 ms, puis fallback Remplacée seulement si chargée en 3 secondes Polices semi-critiques
optional Masqué 100 ms, puis fallback Pas de remplacement pour cette visite Polices purement décoratives

4. preload et sous-ensembles : accélérez ce qui doit l’être

Si le titre du premier écran doit absolument utiliser une police web, utilisez preload pour indiquer au navigateur de la télécharger en priorité : ajoutez dans le head <link rel=”preload” href=”font.woff2″ as=”font” type=”font/woff2″ crossorigin>. La police commence ainsi à se télécharger avant l’analyse du CSS, ce qui avance le LCP de 200 à 400 millisecondes. Attention : l’attribut crossorigin est indispensable, sinon le preload ne fonctionne pas.

Le subsetting est l’autre optimisation indispensable. Pour une police latine, on ne garde que les lettres, les chiffres et les symboles courants : on passe de 100 Ko à 30 Ko. Pour une police chinoise, le jeu de caractères est trop vaste : même après subsetting, elle pèse entre 200 Ko et 1 Mo, d’où notre recommandation d’utiliser directement les polices système sur un site chinois. Avec glyphhanger ou le paramètre text de Google Fonts, on ne charge que les caractères réellement utilisés. Un cas concret : le titre du premier écran n’utilise que 20 caractères chinois, on ne subsette que ces 20 caractères et le fichier passe de 4 Mo à 5 Ko. Pour le cache CDN, voir Comparatif des CDN.

Action d’optimisation des polices Gain de poids / de latence Difficulté de mise en œuvre Ce qu’on recommande
Format woff2 uniquement 30 % plus léger que le ttf Faible Indispensable
Ne charger que les graisses 400 et 700 60 % de téléchargement en moins Faible Indispensable
Subsetter le jeu de caractères latin 50 % de moins encore Moyenne Recommandé
Preload de la police du premier écran LCP avancé de 200 à 400 ms Faible Titre du premier écran en
Police web chinoise complète Négatif Élevée À ne pas faire

5. Vérification : observer la cascade de chargement des polices dans DevTools

Comment vérifier que l’optimisation des polices est bien faite ? Ouvrez le panneau Network de Chrome DevTools, filtrez sur Font et regardez trois choses : le nombre de fichiers de police (2 familles maximum, 2 graisses maximum par famille), le poids des fichiers (50 Ko maximum par fichier pour être sain) et le moment où le téléchargement commence (avec un preload, la police doit figurer parmi les premières requêtes, pas être découverte après l’analyse du CSS). Tout fichier de police dépassant 100 Ko mérite qu’on vérifie si la graisse ou le subsetting n’est pas mal configuré.

Passez ensuite à Lighthouse et contrôlez les deux audits « Éviter les décalages de mise en page avec les polices web » et « Précharger les requêtes clés ». Une checklist applicable : font-display en swap partout, preload de la police du premier écran, format woff2, aucun ancien format ttf/eot, paramètre display=swap pour Google Fonts. Pour savoir comment gérer les polices d’un site multilingue, voir le traitement des graphiques sur un site multilingue. Pour la supervision du site, voir Alertes de supervision du site.

Point de vérification Critère de conformité Outil de mesure
font-display swap ou fallback partout Inspection du CSS
Preload de la police du premier écran Police du titre du premier écran préchargée DevTools Network
Format des fichiers de police woff2 uniquement Filtre Font dans Network
Poids d’un fichier de police ≤ 50 Ko Colonne Size de Network
Nombre de familles de polices ≤ 2 Inspection du CSS
LCP au 75e percentile ≤ 2,5 s CrUX/RUM

FAQ — Questions fréquentes

Un site B2B indépendant doit-il forcément utiliser une police web ?
Non, une pile de polices système est la bonne réponse pour la plupart des sites B2B. Le contenu B2B est fait de caractéristiques techniques, d’études de cas et d’articles techniques : les polices système suffisent visuellement et s’affichent immédiatement, sans aucune requête réseau. GitHub, Stripe et Linear utilisent tous une pile de polices système. Ce n’est que si l’image de marque compte vraiment et que le titre du premier écran exige une police sur mesure qu’on charge une seule famille de polices web, et dans ce cas avec swap + subset + preload obligatoires.
Quelle différence entre font-display:swap et block ?
block masque le texte pendant le chargement de la police (FOIT) et n’utilise le fallback qu’au bout de 3 secondes ; swap affiche immédiatement le texte avec la police de fallback, puis remplace celle-ci une fois la police web téléchargée. Un site B2B doit utiliser swap, car il est plus important de laisser l’utilisateur lire le contenu que d’attendre une belle police. Avec block, en 3G, le premier écran reste vide pendant 3 secondes et le visiteur est déjà parti. fallback est un compromis : on masque le texte 100 ms, puis on utilise la police de fallback et on ne remplace que si le chargement se termine en 3 secondes.
Peut-on utiliser une police web pour le chinois ?
À éviter dans la quasi-totalité des cas. Un fichier de police chinoise pèse 2 à 8 Mo, et même après sous-ensemblage il reste entre 200 Ko et 1 Mo, bien au-delà du budget du premier écran. Et même avec un subset, l’utilisateur qui tombe sur un caractère non inclus doit recharger la police. La bonne approche : une pile de polices système, PingFang SC sur macOS, Microsoft YaHei sur Windows, Noto Sans CJK sur Android, rendu identique partout et zéro téléchargement. Seul le logo de marque passe en image, tout le texte courant reste en polices système.
Pourquoi ajouter crossorigin au preload d’une police ?
Parce que le fichier de police est une requête CORS : même en same-origin, l’attribut crossorigin est obligatoire, sinon le preload télécharge la police sans que @font-face l’utilise, ce qui gaspille de la bande passante. La syntaxe correcte est link rel=preload as=font type=font/woff2 href=… crossorigin. Oublier crossorigin est la cause la plus fréquente d’un preload inopérant, et Lighthouse signale « ressource préchargée non utilisée ».
Comment charger Google Fonts le plus vite possible ?
Trois étapes : d’abord, ajouter le paramètre display=swap à l’URL ; ensuite, ne demander que les graisses 400 et 700, pas toutes les graisses ; enfin, héberger les fichiers de police vous-même au lieu d’appeler fonts.googleapis.com. Car le domaine Google Fonts est bloqué ou lent en Chine et sur certains réseaux d’entreprise en Europe et aux États-Unis ; en auto-hébergeant, vous passez par votre propre CDN et économisez une poignée de main DNS. Il suffit de télécharger les woff2 en local avec Google Webfonts Helper.
Comment valider l’optimisation des polices ?
Dans DevTools, filtrez Network sur Font et vérifiez trois points : au plus 2 familles de polices, un fichier de 50 Ko maximum, et les polices du premier écran parmi les premières requêtes. Côté CSS, vérifiez que tous les font-display sont en swap et qu’aucun ancien format ttf/eot ne subsiste. Dans Lighthouse, vérifiez que les audits « éviter les décalages de mise en page » et « précharger les requêtes clés » sont au vert. Enfin, regardez dans CrUX si le 75e percentile du LCP est inférieur ou égal à 2,5 secondes. Si le LCP reste lent, ouvrez le panneau Performance pour voir si une police bloque le rendu.

Six. FOUT et décalage de mise en page : comment éviter que ça bouge au changement de police

Avec la stratégie swap, quand la police de repli est remplacée par la police web, les largeurs et hauteurs de caractères diffèrent et la page peut sauter : c’est la source du CLS (cumulative layout shift). Stripe a mesuré qu’un remplacement de police provoque en moyenne 0,05 à 0,1 de CLS, soit exactement la limite du seuil acceptable de 0,1. Sur un site B2B, les textes sont longs et les paragraphes nombreux, et les différences de retour à la ligne font monter et descendre les images.

La solution passe par les descripteurs font-size-adjust et size-adjust. Dans @font-face, on utilise size-adjust: 105% et ascent-override pour aligner les métriques de la police web sur celles de la police de repli, et le remplacement ne bouge presque plus. Autre méthode plus simple : choisir un couple police de repli / police web aux métriques proches, par exemple Arial comme repli d’Inter, ou rester sur une pile de polices système sans changer de police. Un test concret : dans Lighthouse, regardez l’audit « éviter les décalages de mise en page sur les polices web » ; si le score est faible, vérifiez d’abord si c’est le swap qui en est la cause, puis décidez d’ajouter ou non size-adjust.

Gérer le FOUT Réduire le CLS Difficulté de mise en œuvre
Ne rien faire, accepter le scintillement 0,05 à 0,1 Non
Ajuster finement les métriques avec size-adjust Descendre sous 0,02 Moyen, à tester
Choisir une police de secours aux métriques proches Descendre sous 0,03 Faible
Se passer carrément de police web 0 Coût zéro

Pour conclure

Le jugement central sur l’optimisation des polices est simple : sur un site B2B, les visiteurs viennent lire des caractéristiques, consulter des cas clients et trouver un contact, pas admirer l’art typographique. Une pile de polices système est la bonne réponse dans 95 % des cas ; les quelques centaines de Ko et les quelques centaines de millisecondes économisées comptent bien plus que la différence visuelle. Même si vous gardez des polices web, tenez-vous strictement à ces quatre règles : deux familles, deux graisses, format woff2, chargement swap.

Trois étapes pour passer à l’action : d’abord, cette semaine, remplacez les polices du thème par une pile système et supprimez les appels Google Fonts superflus ; ensuite, ajoutez font-display:swap à toutes les polices web conservées, ne gardez que les graisses 400 et 700 et hébergez vous-même les fichiers woff2 ; enfin, ajoutez preload et crossorigin à la police du titre affiché en premier écran. Deux semaines plus tard, vérifiez si le LCP et les audits liés aux polices se sont améliorés.

Une phrase à retenir : personne ne reste une seconde de plus parce que votre site utilise Inter, mais tout le monde ferme l’onglet s’il attend 3 secondes que la police se charge. La police est un détail, mais ce détail décide si vous captez le visiteur pendant les 2,5 secondes du premier écran.

Cratère
Cratère Expert Cratère

Officiel de l'organisme · Cratère Crater

Cratère (Crater) est une société de services d'expansion internationale spécialisée dans le développement de sites WordPress autonomes, le référencement Google et la croissance globale GEO, au service des secteurs du matériel intelligent, de l'équipement industriel, du SaaS et des énergies nouvelles.

Capacités produitLivre blanc méthodologiqueRapports sectoriels
965partages
78articles de base de connaissances