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 etsize-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.
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.
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
etline-gap
: ouvrez la boîte de dialogueFont Info
, sélectionnez le menuOS/2
, puis l'ongletMetrics
. Pour afficherUPM
, ouvrez la boîte de dialogueFont Info
, puis sélectionnez le menuGeneral
.
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.
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]
.
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.
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
.