Amélioration des polices de remplacement

Katie Hempenius
Katie Hempenius

Résumé

Cet article présente en détail les polices de remplacement et les API size-adjust, ascent-override, descent-override et line-gap-override. Ces API permettent d'utiliser des polices locales pour créer des polices de remplacement qui correspondent exactement ou étroitement aux dimensions d'une police Web. Cela réduit ou élimine les décalages de mise en page causés par le changement de police.

Si vous préférez ignorer cet article, voici quelques outils que vous pouvez utiliser pour commencer à utiliser ces API immédiatement:

Outils de cadre:

  • @next/font: à partir de Next 13, next/font utilise automatiquement les remplacements de métriques de police et size-adjust pour fournir des polices de remplacement correspondantes.
  • @nuxtjs/fontaine: à partir de Nuxt 3, vous pouvez utiliser nuxt/fontaine pour générer et insérer automatiquement des polices de remplacement correspondantes dans les feuilles de style utilisées par votre application Nuxt.

Outils hors framework:

  • Fontaine: Fontaine est une bibliothèque qui génère et insère automatiquement des polices de remplacement qui utilisent des remplacements de métriques de police.
  • Ce dépôt contient les remplacements de métriques de police pour toutes les polices hébergées par Google Fonts. Vous pouvez copier et coller ces valeurs dans vos feuilles de style.

Contexte

Une police de remplacement est un type de police utilisé lorsque le cadran principal n'est pas encore chargé ou lorsqu'il manque les glyphes nécessaires pour afficher le contenu de la page. Par exemple, le code CSS ci-dessous indique que la famille de polices sans-serif doit être utilisée comme police de remplacement pour "Roboto".

font-family: "Roboto" , sans-serif;

Les polices de remplacement peuvent être utilisées pour afficher le texte plus rapidement (en utilisant font-display: swap). Le contenu de la page est ainsi plus lisible et utile plus tôt, mais cela a toujours eu un impact sur l'instabilité de la mise en page: les décalages de mise en page se produisent généralement lorsqu'une police de remplacement est remplacée par la police Web. Cependant, les nouvelles API décrites ci-dessous peuvent réduire ou éliminer ce problème en permettant de créer des polices de remplacement qui occupent le même espace que leurs polices Web homologues.

Amélioration des remplacements de police

Deux approches sont possibles pour générer des polices de remplacement "améliorées". L'approche la plus simple n'utilise que l'API de remplacement des métriques de police. L'approche plus compliquée (mais plus puissante) utilise à la fois la métrique de police remplace l'API et size-adjust. Cet article explique ces deux approches.

Fonctionnement des remplacements de métriques de police

Introduction

Les forçages de métriques de police permettent de remplacer l'ascension, la descente et l'écart entre les lignes d'une police:

  • Ascension : mesure la distance la plus éloignée entre les glyphes d'une police et la ligne de base.
  • La descente mesure la distance la plus éloignée entre les glyphes d'une police et la ligne de base.
  • L'interligne, également appelé "interligne", mesure la distance entre des lignes de texte successives.

Schéma représentant l'ascension, la descente et l'écart entre les lignes d'une police.

Vous pouvez utiliser des forçages de métriques de police pour remplacer l'ascension, la descente et l'interligne d'une police de remplacement afin qu'ils correspondent à l'ascension, à la descente et à l'écart entre les lignes de la police Web. Par conséquent, la police Web et la police de remplacement ajustée auront toujours les mêmes dimensions verticales.

Les remplacements de métriques de police sont utilisés dans une feuille de style de la manière suivante:

body {
    font-family: Poppins, "fallback for poppins";
}

@font-face {
    font-family: "fallback for poppins";
    src: local("Times New Roman");
    ascent-override: 105%;
    descent-override: 35%;
    line-gap-override: 10%;
}

Les outils répertoriés au début de cet article peuvent générer les valeurs de remplacement des métriques de police appropriées. Cependant, vous pouvez également calculer ces valeurs vous-même.

Calcul des remplacements de métriques de police

Les équations suivantes génèrent les remplacements de métriques de police pour une police Web donnée. Les valeurs de remplacement des métriques de police doivent être écrites en pourcentage (par exemple, 105%) et non en décimales.

ascent-override = ascent/unitsPerEm
descent-override = descent/unitsPerEm
line-gap-override = line-gap/unitsPerEm

Par exemple, voici les remplacements de métriques de police pour la police Poppins:

/*
Poppins font metrics:
ascent = 1050
descent = 350
line-gap = 100
UPM: 1000
*/

ascent-override: 105%;  /* = 1050/1000 */
descent-override: 35%;  /* = 350/1000 */
line-gap-override: 10%; /* = 100/1000 */

Les valeurs de ascent, descent, line-gap et unitsPerEm proviennent toutes des métadonnées de la police Web. La section suivante de cet article explique comment obtenir ces valeurs.

Lire les tableaux de polices

Les métadonnées d'une police (en particulier ses tableaux de polices) contiennent toutes les informations dont vous avez besoin pour calculer les remplacements de métriques de police.

Capture d'écran de la boîte de dialogue "Informations sur la police" dans FontForge. La boîte de dialogue affiche des métriques de police telles que "Typo Ascent", "Typo Descent" et "Typo Line Gap".
Utiliser FontForge pour afficher les métadonnées de police

Voici quelques outils que vous pouvez utiliser pour lire les métadonnées d'une police:

  • fontkit est un moteur de polices conçu pour Node.js. Cet extrait de code montre comment utiliser fontkit pour calculer des remplacements de métriques de police.
  • Capsize est une bibliothèque de mise en page et de dimensionnement de police. Capsize fournit une API permettant d'obtenir des informations sur différentes métriques de police.
  • fontdrop.info est un site Web qui vous permet d'afficher des tableaux de polices et d'autres informations sur les polices dans le navigateur.
  • Font Forge est un éditeur de polices pour ordinateur couramment utilisé. Pour afficher ascent, descent et line-gap: ouvrez la boîte de dialogue Font Info, sélectionnez le menu OS/2, puis l'onglet Metrics. Pour afficher UPM, ouvrez la boîte de dialogue Font Info, puis sélectionnez le menu General.

Comprendre les tableaux de polices

Vous remarquerez peut-être que plusieurs métriques font référence à des concepts tels que "ascent" (par exemple, il existe des métriques hheaAscent, typoAscent et winAscent). Cela est dû aux différentes approches adoptées par différents systèmes d'exploitation pour le rendu des polices: sur les appareils OSX, les programmes utilisent généralement des métriques de police hhea*, tandis que les programmes sur les appareils Windows utilisent généralement des métriques de police typo* (également appelées sTypo*) ou win*.

En fonction de la police, du navigateur et du système d'exploitation, une police sera affichée à l'aide des métriques hhea, typo ou win.

Mac Windows
Chromium Utilise les métriques du tableau "hhea". Utilise les métriques du tableau "typo" si "USE_TYPO_METRICS" a été défini. Sinon, utilise les métriques du tableau "win".
Firefox Utilise les métriques du tableau "typo" si "USE_TYPO_METRICS" a été défini. Sinon, utilise les métriques du tableau "hhea". Utilise les métriques du tableau "typo" si "USE_TYPO_METRICS" a été défini. Sinon, utilise les métriques du tableau "win".
Safari Utilise les métriques du tableau "hhea". Utilise les métriques du tableau "typo" si "USE_TYPO_METRICS" a été défini. Sinon, utilise les métriques du tableau "win".

Pour en savoir plus sur le fonctionnement des métriques de police sur les différents systèmes d'exploitation, consultez cet article sur les métriques verticales.

Compatibilité multi-appareil

Dans la grande majorité des polices (par exemple, environ 90% des polices hébergées par Google Fonts), les remplacements des métriques de police peuvent être utilisés en toute sécurité sans connaître le système d'exploitation de l'utilisateur. En d'autres termes, pour ces polices, les valeurs de ascent-override, descent-override et linegap-override restent exactement les mêmes, que les métriques hhea, typo ou win s'appliquent. Ce dépôt fournit des informations sur les polices concernées et celles auxquelles il ne s'applique pas.

Si vous utilisez une police nécessitant l'utilisation d'ensembles distincts de remplacement de métriques de police pour les appareils OSX et Windows, nous vous recommandons d'utiliser des remplacements de métriques de police et size-adjust si vous pouvez modifier vos feuilles de style en fonction du système d'exploitation de l'utilisateur.

Utiliser des remplacements de métriques de police

Étant donné que les remplacements de métriques de police sont calculés à l'aide de mesures provenant des métadonnées de la police Web (et non de la police de remplacement), ils restent identiques, quelle que soit la police utilisée. Exemple :

body {
  font-family: "Poppins", "fallback for Poppins", "another fallback for Poppins";
}

@font-face {
  font-family: "fallback for Poppins";
  src: local("Arial");
  ascent-override: 105%;
  descent-override: 35%;
  line-gap-override: 10%;
}

@font-face {
  font-family: "another fallback for Poppins";
  src: local("Roboto");
  ascent-override: 105%;
  descent-override: 35%;
  line-gap-override: 10%;
}

Fonctionnement de l'ajustement de taille

Introduction

Le descripteur CSS size-adjust redimensionne proportionnellement la largeur et la hauteur des glyphes de police. Par exemple, size-adjust: 200% redimensionne les glyphes de police au double de leur taille d'origine. size-adjust: 50% redimensionne les glyphes de police à la moitié de leur taille d'origine.

Schéma illustrant les résultats obtenus avec les méthodes "size-adjust: 50%" et "size-adjust: 200%"

size-adjust ne dispose que d'un nombre limité d'applications pour améliorer les polices de remplacement: dans la plupart des cas, une police de remplacement doit être légèrement réduite ou élargie (au lieu d'être mise à l'échelle proportionnellement) pour correspondre à une police Web. Toutefois, la combinaison de size-adjust avec des forçages de métriques de police permet de faire correspondre deux polices à la fois horizontalement et verticalement.

Voici comment size-adjust est utilisé dans les feuilles de style:

@font-face {
  font-family: "fallback for poppins";
  src: local("Arial");
  size-adjust: 60.85099821%;
  ascent-override: 164.3358416%;
  descent-override: 57.51754455%;
  line-gap-override: 16.43358416%;
}

En raison du mode de calcul de size-adjust (expliqué dans la section suivante), la valeur de size-adjust (et les remplacements de métriques de police correspondants) change en fonction de la police de remplacement utilisée:

body {
  font-family: "Poppins", "fallback for Poppins", "another fallback for Poppins";
}

@font-face {
  font-family: poppins-fallback;
  src: local("Arial");
  size-adjust: 60.85099821%;
  ascent-override: 164.3358416%;
  descent-override: 57.51754455%;
  line-gap-override: 16.43358416%;
}

@font-face {
  font-family: poppins-fallback-android;
  src: local("Roboto");
  size-adjust: 55.5193474%:
  ascent-override: 180.1173909%;
  descent-override: 63.04108683%;
  line-gap-override: 18.01173909%;
}

Calculer les remplacements de métriques d'ajustement de taille et de police

Voici les équations permettant de calculer les remplacements de métriques de police et de size-adjust:

size-adjust = avgCharacterWidth of web font / avgCharacterWidth of fallback font
ascent-override = web font ascent / (web font UPM * size-adjust)
descent-override = web font descent / (web font UPM * size-adjust)
line-gap-override = web font line-gap / (web font UPM * size-adjust)

La plupart de ces entrées (montée, descente et interligne) peuvent être lues directement à partir des métadonnées de la police Web. Toutefois, avgCharacterWidth doit être estimé.

Largeur approximative du nombre de caractères

En général, la largeur moyenne de caractères ne peut être qu'approximative. Toutefois, dans certains cas, elle peut être calculée exactement, par exemple lors de l'utilisation d'une police à chasse fixe ou lorsque le contenu d'une chaîne de texte est connu à l'avance.

Un exemple d'approche naïve pour calculer avgCharacterWidth consiste à utiliser la largeur moyenne de tous les caractères [a-z\s].

 Graphique comparant la largeur de glyphes Roboto [a-zs] individuels.
Largeur des glyphes Roboto

Toutefois, une pondération égale de tous les caractères risque de sous-pondérer la largeur des lettres fréquemment utilisées (par exemple, e) et de surpondérer la largeur des lettres rarement utilisées (par exemple, z).

Une approche plus complexe qui améliore la précision consiste à prendre en compte la fréquence des lettres et à calculer à la place la largeur moyenne pondérée en fonction de la fréquence de [a-z\s] caractères. Cet article constitue une bonne référence pour déterminer la fréquence des lettres et la longueur moyenne des mots dans les textes en anglais.

Graphique montrant la fréquence des lettres pour l'anglais.
Fréquence des lettres en anglais

Choisir une approche

Les deux approches décrites dans cet article présentent chacune des avantages et des inconvénients:

  • L'utilisation de remplacements de métriques de police en eux-mêmes est une bonne approche si vous commencez à optimiser vos remplacements de police. Bien qu'il s'agisse de la plus simple des deux approches, elle est généralement assez puissante pour réduire considérablement l'ampleur des décalages de mise en page liés à la police.

  • En revanche, si vous souhaitez plus de précision et que vous êtes prêt à effectuer un peu plus de travail et de test, il est recommandé d'incorporer size-adjust. Lorsqu'elle est implémentée correctement, cette approche peut éliminer efficacement les décalages de mise en page liés aux polices.

Choisir des polices de remplacement

Les techniques décrites dans cet article reposent sur l'utilisation de remplacements de métriques de police et sur size-adjust pour transformer les polices locales largement disponibles, au lieu d'essayer de trouver une police locale qui se rapproche le plus de la police Web. Lorsque vous choisissez des polices locales, il est important de garder à l'esprit que très peu de polices sont largement disponibles en local et qu'aucune police unique n'existe sur tous les appareils.

Arial est la police de remplacement recommandée pour les polices Sans-Serif et Times New Roman est la police de remplacement recommandée pour les polices à empattement. Cependant, aucune de ces polices n'est disponible sur Android (Roboto est la seule police système sur Android).

L'exemple ci-dessous utilise trois polices de remplacement pour assurer une couverture large sur les appareils: une police de remplacement qui cible les appareils Windows/Mac, une police de remplacement qui cible les appareils Android et une autre qui utilise une famille de polices générique.

body {
  font-family: "Poppins", poppins-fallback, poppins-fallback-android, sans-serif;
}

/*
Poppins font metrics:
- ascent = 1050
- descent = 350
- line-gap = 100
- UPM: 1000
AvgCharWidth:
- Poppins: 538.0103768
- Arial: 884.1438804
- Roboto: 969.0502537
*/

@font-face {
  font-family: poppins-fallback;
  src: local("Arial");
  size-adjust: 60.85099821%;
  ascent-override: 164.3358416%;
  descent-override: 57.51754455%;
  line-gap-override: 16.43358416%;
}

@font-face {
  font-family: poppins-fallback-android;
  src: local("Roboto");
  size-adjust: 55.5193474%:
  ascent-override: 180.1173909%;
  descent-override: 63.04108683%;
  line-gap-override: 18.01173909%;
}

Demande de commentaires

N'hésitez pas à nous contacter si vous avez des commentaires sur l'utilisation des remplacements de métriques de police et de size-adjust.