Recommandations sur `font-family` en CSS
(chrismorgan.info)- Concevoir un design web en se fiant à un nom de police précis peut se casser selon la plateforme, le réseau ou les réglages de sécurité ; il faut donc construire
font-familyen partant du principe d’un fallback générique - Pour le code, l’art ASCII ou les mises en page qui exigent une chasse fixe, il faut impérativement inclure
monospace; pourserifetsans-serif, il est aussi plus sûr de les préciser si l’on veut garantir la famille souhaitée - Les piles qui énumèrent longuement des polices probablement présentes en local ont en général peu d’intérêt, et les valeurs génériques par défaut du navigateur peuvent parfois faire un meilleur choix
- Les web fonts sont plus lentes que leur absence et introduisent des compromis autour des échecs de chargement et de
font-display; pour du contenu, garder la police par défaut de l’utilisateur est donc un choix réaliste system-uietui-*ont surtout une logique de texte d’interface court, qui peut mal convenir au contenu long et à la prise en charge des langues ; les utiliser comme substitut de police par défaut pour le contenu est risqué
Ne pas faire confiance aux noms de police
- Il n’existe pas de web safe fonts réellement communes à toutes les grandes plateformes ; il ne faut donc pas supposer qu’un nom de police donné fonctionnera toujours
- Les web fonts ne sont pas non plus une solution certaine
- Les sous-ressources non inline peuvent échouer au chargement pour diverses raisons réseau
- Le chargement de polices est un domaine sensible côté sécurité, et peut être bloqué dans certains environnements
- uBlock Origin propose un bouton dédié pour désactiver les polices distantes
- Le mode économie de données de certains navigateurs peut bloquer le chargement des polices, et dans les cas où il ne le fait pas, certains estiment qu’il devrait le faire
- Si l’utilisateur n’autorise pas les choix de police propres au site, seules les familles génériques fonctionneront
- En JavaScript, utiliser
document.fonts.load("1em my-web-font")peut produire une Promise rejetée- Sur six ans, de 2020 à 2025, environ quatre cas de casse ont été observés à cause de ce problème, dont deux en 2025
Toujours préciser une famille de secours
- Si du texte à chasse fixe est nécessaire, il faut absolument mettre
monospacedansfont-family- L’absence de
monospacepasse inaperçue pour beaucoup d’utilisateurs, mais dans certains environnements elle peut ruiner l’intention d’une mise en page ou d’une œuvre - Par exemple, ASCII might fly? d’Adel Faure n’incluait pas
monospaceau moment de l’écriture, ce qui peut l’afficher sans chasse fixe
- L’absence de
- Pour
serifetsans-serif, il est également préférable de les inclure si l’on veut un fallback vers la bonne famille- Exemple :
font-family: Arial, sans-serif; - Exemple :
font-family: Times New Roman, serif; - Sinon, on retombera sur la police par défaut, qui peut être serif, mais aussi quelque chose de complètement différent
- Exemple :
Réduire les listes de polices supposées installées
- La pratique consistant à lister longuement des polices probablement présentes sur le système comme
Arial,Helvetica,Helvetica Neue,Liberation Sans,Noto Sansn’aide généralement pas beaucoup - En particulier, Arial ne serait jamais un meilleur choix que
sans-serif sans-serifpeut être interprété comme une police au moins aussi bonne que celles explicitement listées, voire meilleure- Un exemple réel de déclaration monospace observée est excessivement long
font-family: Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif- Cette déclaration est strictement moins bonne que
font-family: monospace, monospace, etmonospacepeut être interprété comme une police qui n’est pas pire que toute cette liste
- Il n’est pas nécessaire d’interdire totalement les polices non web nommées, mais une seule au maximum semble raisonnable
- Georgia) et Times New Roman sont toutes deux des polices serif des Core fonts for the Web de Microsoft, mais avec des caractères très différents
- Georgia est bien plus large que Times New Roman ; si cette propriété est stylistiquement importante,
font-family: Georgia, serifreste un choix acceptable
- modernfontstacks.com et le dépôt donnent des idées de choix de polices selon les plateformes
- Mais ils prescrivent trop de polices nommées, et beaucoup gagneraient à être supprimées
- Le traitement de Courier New y est particulièrement erroné, et les images semblent avoir été produites avec Courier sous macOS
Le choix de n’utiliser que des familles génériques
- Une fois réduite l’énumération des polices locales, on peut aussi réévaluer la nécessité des web fonts
- Les web fonts sont plus lentes que leur absence et peuvent créer des problèmes de chargement
- C’est pour cela qu’existe
font-display - Mais au lieu de gérer les compromis entre périodes de block/swap, redessin et reflow, on peut aussi simplement utiliser les polices dont dispose déjà l’utilisateur
- C’est pour cela qu’existe
- On peut aussi faire ce choix avec
monospace- Autrefois, la valeur par défaut de
monospacen’était pas bonne ; en particulier, Courier New#Courier_New) de Microsoft avait été mal numérisée, au point de ressembler en pratique à un poids 200–250 plutôt que 400 - Apple a ensuite introduit Menlo), et à une époque où la valeur par défaut
monospacedes navigateurs n’était pas mise à jour, beaucoup ont commencé à ajouter Menlo à leurs piles de polices - Aujourd’hui, les valeurs par défaut des navigateurs se sont améliorées ; elles ne sont pas excellentes dans tous les cas, mais elles ne sont plus mauvaises
- Autrefois, la valeur par défaut de
- Il est donc possible d’abandonner des listes comme
Menlo, Monaco, Consolas, Bitstream Vera Sans Mono, Courier, Courier Newet de ne garder quemonospace - Ajouter délibérément
Courier Newdans une pile de polices est jugé très négativement
monospace, monospace et le comportement des navigateurs
- Lorsque
font-family: monospace;est utilisé explicitement ou implicitement, la valeur par défaut defont-sizepeut être non pas 100 %, mais probablement 81,25 %- L’utilisateur peut modifier la police des familles génériques, la taille de police par défaut et la taille de police monospace par défaut
- Ce comportement ne se produit pas s’il y a une deuxième famille dans la liste
font-family: my-web-font, monospace;convientfont-family: monospace, monospace;convient aussi- On peut également définir
font-sizedirectement
- Lightning CSS a un problème qui casse
monospace, monospace- Issue liée : parcel-bundler/lightningcss#1221
- En attendant,
monospace, mest utilisé
- Ce problème n’affecte que
monospace - L’idée défendue est de convaincre les navigateurs d’abandonner ce comportement de taille pour
monospace, en relevant probablement une valeur d’environ 13px vers environ 16px- Le CSSWG pourrait être le lieu pour proposer cela
Ne pas utiliser system-ui et ui-* pour le contenu
- Les polices d’interface ne sont pas faites pour du contenu long, mais pour de courts textes d’UI
- Les polices d’interface peuvent mal prendre en charge la langue du contenu
- Sur macOS, cela semble correct, mais pas sur Windows
- Cela peut conduire par exemple à des cas où des utilisateurs CJK se retrouvent avec une mauvaise police monospace
- Certains utilisateurs choisissent volontairement une police système d’interface ridicule, ce qui serait assez courant dans certaines communautés Android
- Utiliser
system-uipourrait donc donner aussi cet aspect au contenu
- Utiliser
- w3c/csswg-drafts issue #3658 discute de plusieurs problèmes liés à
system-uiet conclut quesystem-uia été largement détourné de son usage - mdn/content issue #41244 ajoute sur MDN une note mettant en garde contre son usage excessif
system-uietui-*ont souvent servi de proxy pour obtenir une meilleure police par défaut, mais cet usage est jugé inapproprié- Le point de vue exprimé est que
system-uiétait une erreur- Il aurait mieux valu ne garder que
-apple-systemet faire convergerBlinkMacSystemFontvers celui-ci - Au moment de la standardisation, les autres plateformes n’avaient pas d’équivalent utile, même si certaines en ont maintenant
- Son usage a surtout servi à contourner le fait que les navigateurs n’avaient pas modernisé les anciennes valeurs par défaut des familles génériques
- Il aurait mieux valu ne garder que
ui-serif,ui-sans-serif,ui-monospaceet surtoutui-roundedsont présentés comme des erreurs manifestes qui devraient être supprimées- En dehors des environnements Apple, on ne devrait pas s’attendre à ce qu’ils soient mappés vers une police particulière
- Le concept lui-même n’existe que sur les plateformes Apple, et n’aurait donc pas dû entrer dans le standard
- Si Apple l’avait fourni, cela aurait dû prendre une forme préfixée
-apple, comme-apple-system
system-uia des cas d’usage légitimes pour les web apps, mais l’impression est qu’il a été presque entièrement détourné, et qu’une intervention de suppression ne serait peut-être pas une mauvaise chose
1 commentaires
Avis sur Lobste.rs
https://lindenii.org a choisi de ne pas définir du tout
font-family, afin de respecter la police par défaut choisie par l’utilisateur dans son navigateurPersonnellement, je préfère les sans serif, mais si l’utilisateur a mis une police serif par défaut, je ne vois pas vraiment de raison de l’écraser
En revanche, lorsqu’il faut utiliser des caractères absents de la plupart des polices, comme sur https://runxiyu.org/soc/ta/, il a bien fallu intégrer une police web, avec pour conséquence que le reste du texte aussi se retrouve forcé en sans serif au lieu d’utiliser le choix par défaut de l’utilisateur
À moins d’entourer chaque caractère inhabituel avec quelque chose comme
<unusual-character>, je ne vois pas de meilleure méthode, et ce serait bien aussi s’il existait un moyen de spécifier une « police préférée de l’utilisateur pour le code »L’astuce
monospace, monospaceétait appréciée, et cette différence de taille était assez déroutanteLes sites listant les caractères Unicode gèrent ça de cette façon
monospaceOn m’a même déjà complimenté sur le design du site, alors qu’en réalité je me suis surtout contenté de reprendre un thème Zola en réduisant le CSS et les éléments personnalisés ; du coup, surtout pour les pages personnelles, je partage assez l’idée générale du billet
font-familydu tout, il serait peut-être préférable pour l’utilisateur que la police par défaut par défaut du navigateur passe de serif à sans serifLa plupart des utilisateurs ne choisissent pas eux-mêmes leur police, donc il n’y a aucun moyen de distinguer « la police choisie par l’utilisateur » de « la police par défaut du navigateur »
J’aime bien les serif, mais aujourd’hui il est probable que la majorité préfère les sans serif
Dans mon environnement, j’ai bloqué les pages pour qu’elles ne puissent pas définir de police, et je n’ai même pas installé de vraie police CJK
Je considérais que voir une case du type « 4E2D » à la place d’un hanzi ne m’apportait de toute façon pas moins de sens que l’idéogramme lui-même
Cette gestion des polices de repli était bien pensée, mais malheureusement il n’existe pas de moyen de cibler directement le nom de la police par défaut
En revanche, dans un document vide, JavaScript permet de faire
getComputedStyle(document.documentElement).fontFamily, ce qui renvoie"serif"ou"sans-serif"selon mes paramètres avancés de policeJe ne sais pas exactement ce que veut dire « police préférée pour le code », et j’ai l’impression qu’il s’agit de quelque chose d’autre que
monospaceCet article est encore un brouillon, donc il reste assez inachevé, avec deux ou trois formes différentes de fragments mélangés, ce qui le rend un peu désordonné
Au final, ce sera probablement plus d’une page, sous une forme sensiblement différente de l’actuelle, et certaines parties pourraient même être manuscrites, dessinées à la main ou mises en page manuellement
En ce moment, je me concentre plutôt sur l’implémentation d’un langage de balisage léger ; c’est presque utilisable, avec cette impression habituelle que les 90 % finaux ne finissent jamais vraiment
Ensuite je reviendrai à l’écriture du texte pour le publier
Le fait qu’avec
font-family: monospace;, la valeur par défaut defont-sizepuisse devenir 81,25 % au lieu de 100 %, alors que cela ne se produit pas si une deuxième police figure dans la liste, est vraiment intéressantAutrement dit,
font-family: my-web-font, monospace;oufont-family: monospace, monospace;fonctionneraient correctement, mais cela ne semble pas documenté actuellement sur MDNJe me demande si quelqu’un peut expliquer pourquoi cela arrive et pourquoi ce n’est pas documenté
Cela peut donc aussi être une source d’incohérence entre navigateurs
Même si c’est un brouillon, il y a une répétition étrange où une section semble avoir été copiée-collée telle quelle une deuxième fois dans le texte
Ça m’a d’autant plus frappé que cela donnait l’impression que la police à chasse fixe que j’aime bien n’était pas terrible
En lisant de près, il y a aussi de légères contradictions, parce que je suis en train de distinguer ce qui relèvera de recommandations fermes et ce qui demandera une position plus nuancée
Je suis curieux de savoir quelle est la police à chasse fixe que tu préfères
Une raison de ne pas se limiter à
serifetsans-serif, c’est que la police serif par défaut est souvent Times, que beaucoup trouvent médiocreC’est d’ailleurs pour cela que je suis en train de faire passer ma police de texte de serif à sans serif
À propos du conseil disant de « ne pas lister des polices probablement installées sur le système » et de « se limiter si possible à des familles génériques même pour le monospace », j’ai configuré mon site web ainsi
J’utilise
--sans-serif: Adwaita Sans, Adwaita Sans Bundled, Inter, sans-serif;et--monospace: Iosevka, Iosevka Web, Cascadia Code, monospace;L’idée est que, si Adwaita Sans est installée sous GNOME, la police système soit utilisée sans télécharger de police web ; sinon, la police web
Adwaita Sans Bundledest utilisée, avec Inter puissans-serifcomme repli pendant le chargement grâce à des métriques prochesPour la chasse fixe, c’est pareil : si Iosevka est installée sur le système, elle est utilisée ; sinon, la police web
Iosevka Webprend le relais, avec Cascadia Code puismonospacecomme repli pendant le chargementJ’ai aussi tenu compte du fait que
monospacecorrespond à Consolas sous Windows, ce que je trouve peu satisfaisant, et que les versions récentes de Windows incluent Cascadia CodeJe sais que ce n’est pas idéal parce que Cascadia Code a des métriques assez différentes de celles d’Iosevka, mais je me demande ce que vous pensez de cette approche
Le texte est clair, et je ne connaissais pas du tout l’astuce
monospace, monospacePetit souci de mise en forme : dans mon navigateur, le texte des paragraphes
.unimportantapparaît devant le fond jaune mais derrière le texte de la barre.statusfixe, ce qui rend le défilement de la section.unimportantétrange à regarderJ’ai l’impression qu’il se passe quelque chose de similaire avec le filigrane DRAFT en diagonale