Zusammenfassung
In diesem Artikel erfahren Sie mehr über Schrift-Fallbacks und die APIs size-adjust
, ascent-override
, descent-override
und line-gap-override
. Mit diesen APIs ist es möglich, lokale Schriftarten zum Erstellen von Fallback-Schriftarten zu verwenden, die den Abmessungen einer Webschriftart ungefähr oder genau entsprechen. Dadurch werden Layoutverschiebungen durch das Austauschen von Schriftarten reduziert oder beseitigt.
Wenn Sie diesen Artikel lieber überspringen möchten, finden Sie hier einige Tools, mit denen Sie diese APIs sofort nutzen können:
Framework-Tools:
- @next/font: Ab Next 13 verwendet
next/font
automatisch Überschreibungen von Schriftartmesswerten undsize-adjust
, um passende Schriftart-Fallbacks bereitzustellen. - @nuxtjs/fontaine: Ab Nuxt 3 können Sie mit
nuxt/fontaine
automatisch übereinstimmende Schriftart-Fallbacks generieren und in die von Ihrer Nuxt-App verwendeten Stylesheets einfügen.
Nicht zu Frameworks gehörende Tools:
- Fontaine: Fontaine ist eine Bibliothek, die automatisch Schrift-Fallbacks generiert und einfügt, die Schriftmetrik-Überschreibungen verwenden.
- Dieses Repository enthält die Überschreibungen der Schriftartenmesswert für alle von Google Fonts gehosteten Schriftarten. Diese Werte können kopiert und in Ihre Stylesheets eingefügt werden.
Hintergrund
Ein Fallback-Schriftschnitt ist ein Schriftschnitt, der verwendet wird, wenn der primäre Schriftschnitt noch nicht geladen wurde oder Glyphen fehlen, die zum Rendern des Seiteninhalts erforderlich sind. Im folgenden CSS wird beispielsweise angegeben, dass die Schriftfamilie sans-serif
als Schrift-Fallback für "Roboto"
verwendet werden soll.
font-family: "Roboto" , sans-serif;
Mithilfe von Fallback-Schriftarten kann Text schneller gerendert werden (d. h. mit font-display: swap
). Dadurch sind die Seiteninhalte früher lesbar und nützlich. Bisher ging dies jedoch zu Lasten der Layoutstabilität: Layoutänderungen treten häufig auf, wenn eine Fallback-Schriftart durch die Webschriftart ersetzt wird. Mit den unten beschriebenen neuen APIs kann dieses Problem jedoch reduziert oder eliminiert werden, indem es möglich ist, Fallback-Schriftarten zu erstellen, die genauso viel Platz wie ihre Gegenstücke für Webschriftarten einnehmen.
Verbesserte Schrift-Fallbacks
Es gibt zwei Möglichkeiten, „verbesserte“ Schriftart-Fallbacks zu generieren. Bei der einfacheren Methode wird die API nur durch den Messwert „Schriftart“ überschrieben. Der kompliziertere (aber leistungsstärkere) Ansatz verwendet sowohl die API für Schriftschnitt-Überschreibungen als auch size-adjust
. In diesem Artikel werden beide Ansätze erläutert.
Funktionsweise von Überschreibungen für Schriftmetriken
Einführung
Überschreibungen von Schriftmesswerten bieten eine Möglichkeit, die Höhe, Abstufung und Linienabstand einer Schriftart zu überschreiben:
- Der Aufstieg gibt an, wie weit die Schriftzeichen eines Fonts über die Grundlinie hinausragen.
- Der Abstieg ist der maximale Abstand, um den sich die Glyphen eines Schriftzugs unter der Grundlinie erstrecken.
- Der Zeilenabstand, auch als „Löschabstand“ bezeichnet, ist der Abstand zwischen aufeinanderfolgenden Textzeilen.
Mit Überschreibungen von Schriftmesswerten können Sie den Auf- und Abstieg sowie den Zeilenabstand einer Fallback-Schriftart überschreiben, damit sie mit dem Auf- und Abstieg sowie dem Zeilenabstand der Webschriftart übereinstimmen. Dadurch haben die Webschriftart und die angepasste Fallback-Schriftart immer die gleichen vertikalen Abmessungen.
Overrides für Schriftmetriken werden in einem Stylesheet so verwendet:
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%;
}
Mit den am Anfang dieses Artikels aufgeführten Tools können Sie die richtigen Überschreibungswerte für den Schriftmesswert generieren. Sie können diese Werte jedoch auch selbst berechnen.
Überschreibungen für Schriftmesswerte berechnen
Die folgenden Gleichungen ergeben die Schriftmetrik-Überschreibungen für eine bestimmte Webschrift. Die Werte der Schriftmetrik-Überschreibungen sollten als Prozentsätze (z. B. 105%
) und nicht als Dezimalzahlen angegeben werden.
ascent-override = ascent/unitsPerEm
descent-override = descent/unitsPerEm
line-gap-override = line-gap/unitsPerEm
Hier sind beispielsweise die Schriftmetrik-Überschreibungen für die Schriftart 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 */
Die Werte für ascent
, descent
, line-gap
und unitsPerEm
stammen alle aus den Metadaten der Webschriftart. Im nächsten Abschnitt dieses Artikels wird erläutert, wie Sie diese Werte abrufen.
Schrifttabellen lesen
Die Metadaten eines Schriftzugs (insbesondere die Schrifttabellen) enthalten alle Informationen, die Sie zum Berechnen der Überschreibungen der Schriftmetriken benötigen.
Hier sind einige Tools, mit denen Sie die Metadaten eines Schriftbilds lesen können:
- fontkit ist eine Schriftarten-Engine, die für Node.js entwickelt wurde. In diesem Code-Snippet wird gezeigt, wie Sie mit FontKit Überschreibungen für Schriftmetriken berechnen.
- Capsize ist eine Bibliothek zur Größenanpassung und Layoutgestaltung. Capsize bietet eine API, mit der Informationen zu verschiedenen Schriftmetriken abgerufen werden können.
- fontdrop.info ist eine Website, auf der Sie Schrifttabellen und andere schriftbezogene Informationen im Browser aufrufen können.
- Font Forge ist ein beliebter Desktop-Schrifteditor. Wenn Sie
ascent
,descent
undline-gap
aufrufen möchten, öffnen Sie das DialogfeldFont Info
, wählen Sie das MenüOS/2
und dann den TabMetrics
aus. Wenn SieUPM
aufrufen möchten, öffnen Sie das DialogfeldFont Info
und wählen Sie das MenüGeneral
aus.
Schrifttabellen
Sie werden feststellen, dass Konzepte wie „Aufstieg“ auf mehrere Messwerte verweisen. Es gibt beispielsweise die Messwerte hheaAscent
, typoAscent
und winAscent
. Das liegt daran, dass verschiedene Betriebssysteme unterschiedliche Ansätze für das Schriftbild-Rendering verfolgen: Programme auf OSX-Geräten verwenden in der Regel hhea*
-Schriftmetriken, während Programme auf Windows-Geräten in der Regel typo*
(auch sTypo*
genannt) oder win*
-Schriftmetriken verwenden.
Je nach Schriftart, Browser und Betriebssystem wird eine Schriftart entweder mit hhea
-, typo
- oder win
-Messwerten gerendert.
Mac | Windows | |
Chrom | Es werden Messwerte aus der Tabelle „hhea“ verwendet. | Es werden Messwerte aus der Tabelle „typo“ verwendet, wenn „USE_TYPO_METRICS“ festgelegt wurde. Andernfalls werden Messwerte aus der Tabelle „win“ verwendet. |
Firefox | Es werden Messwerte aus der Tabelle „typo“ verwendet, wenn „USE_TYPO_METRICS“ festgelegt wurde. Andernfalls werden Messwerte aus der Tabelle „hhea“ verwendet. | Es werden Messwerte aus der Tabelle „typo“ verwendet, wenn „USE_TYPO_METRICS“ festgelegt wurde. Andernfalls werden Messwerte aus der Tabelle „win“ verwendet. |
Safari | Es werden Messwerte aus der Tabelle „hhea“ verwendet. | Es werden Messwerte aus der Tabelle „typo“ verwendet, wenn „USE_TYPO_METRICS“ festgelegt wurde. Andernfalls werden Messwerte aus der Tabelle „win“ verwendet. |
Weitere Informationen dazu, wie Schriftmesswerte plattformübergreifend funktionieren, finden Sie in diesem Artikel zu vertikalen Messwerten.
Geräteübergreifende Kompatibilität
Bei der überwiegenden Mehrheit der Schriftarten (z. B. bei etwa 90 % der von Google Fonts gehosteten Schriftarten) können Überschreibungen von Schriftmetriken verwendet werden, ohne das Betriebssystem des Nutzers zu kennen. Mit anderen Worten: Bei diesen Schriftarten bleiben die Werte von ascent-override
, descent-override
und linegap-override
genau gleich, unabhängig davon, ob hhea
-, typo
- oder win
-Messwerte gelten. Dieses Repository enthält Informationen darüber, für welche Schriftarten dies gilt und nicht.
Wenn Sie eine Schriftart verwenden, für die separate Überschreibungen von Schriftmesswerten für OSX- und Windows-Geräte erforderlich sind, wird die Verwendung von Überschreibungen von Schriftmesswerten und size-adjust
nur dann empfohlen, wenn Sie die Möglichkeit haben, Ihre Stylesheets je nach Betriebssystem des Nutzers zu ändern.
Überschreibungen für Schriftmesswerte verwenden
Da Schriftmetrik-Überschreibungen anhand von Messungen berechnet werden, die aus den Metadaten der Webschrift stammen (und nicht aus der Fallback-Schrift), bleiben sie unabhängig davon gleich, welche Schrift als Fallback-Schrift verwendet wird. Beispiel:
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%;
}
Funktionsweise der Größenanpassung
Einführung
Mit dem CSS-Deskriptor size-adjust
werden Breite und Höhe von Schriftsymbolen proportional skaliert. Mit size-adjust: 200%
werden Schriftzeichen beispielsweise auf das Doppelte ihrer ursprünglichen Größe skaliert, mit size-adjust: 50%
auf die Hälfte.
size-adjust
kann allein nur bedingt zur Verbesserung von Schrift-Fallbacks verwendet werden: In den meisten Fällen muss eine Fallback-Schrift leicht verengt oder verbreitert werden (und nicht proportional skaliert), um zu einer Webschrift zu passen. Wenn Sie size-adjust
jedoch mit Überschreibungen für Schriftmetriken kombinieren, können Sie zwei beliebige Schriftarten sowohl horizontal als auch vertikal aufeinander abstimmen.
So wird size-adjust
in Stylesheets verwendet:
@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%;
}
Aufgrund der Berechnung von size-adjust
(wird im nächsten Abschnitt erläutert) ändert sich der Wert von size-adjust
(und der entsprechende Messwert für die Schriftart überschreibt) je nachdem, welche Fallback-Schriftart verwendet wird:
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%;
}
Überschreibungen von Messwerten zur Größenanpassung und Schrift berechnen
Dies sind die Gleichungen für die Berechnung von size-adjust
- und Schriftartmesswert-Überschreibungen:
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)
Die meisten dieser Eingaben (d. h. Auf-, Abstieg und Zeilenabstand) können direkt aus den Metadaten der Webschrift gelesen werden. avgCharacterWidth
muss jedoch geschätzt werden.
Durchschnittliche Zeichenbreite approximieren
In der Regel lässt sich die durchschnittliche Zeichenbreite nur annähernd ermitteln. Es gibt jedoch einige Szenarien, in denen sie genau berechnet werden kann, z. B. bei Verwendung einer Schriftart mit Leerzeichen oder wenn der Inhalt einer Textzeichenfolge im Voraus bekannt ist.
Ein Beispiel für eine naive Berechnung von avgCharacterWidth
besteht darin, die durchschnittliche Breite aller [a-z\s]
-Zeichen zu verwenden.
Wenn Sie jedoch alle Zeichen gleich gewichten, wird die Breite häufig verwendeter Buchstaben (z. B. e
) wahrscheinlich zu gering und die Breite selten verwendeter Buchstaben (z. B. z
) zu hoch eingestuft.
Ein komplexerer Ansatz, der die Genauigkeit verbessert, besteht darin, die Buchstabenhäufigkeit zu berücksichtigen und stattdessen die frequenzgewichtete durchschnittliche Breite von [a-z\s]
-Zeichen zu berechnen. Dieser Artikel ist eine gute Referenz für die Buchstabenhäufigkeit und die durchschnittliche Wortlänge englischer Texte.
Ansatz auswählen
Die beiden in diesem Artikel beschriebenen Ansätze haben jeweils Vor- und Nachteile:
Die Verwendung von Überschreibungen von Schriftartmesswerten ist ein guter Ansatz, wenn Sie mit der Optimierung Ihrer Schriftart-Fallbacks beginnen. Obwohl dies der einfachere der beiden Ansätze ist, ist er in der Regel leistungsstark genug, um die Auswirkungen schriftbezogener Layoutverschiebungen deutlich zu reduzieren.
Wenn Sie hingegen eine höhere Genauigkeit wünschen und bereit sind, etwas mehr Arbeit und Tests zu investieren, ist die Einbindung von
size-adjust
ein guter Ansatz. Bei richtiger Implementierung kann dieser Ansatz schriftbezogene Layoutänderungen effektiv beseitigen.
Fallback-Schriftarten auswählen
Die in diesem Artikel beschriebenen Techniken basieren auf der Verwendung von Überschreibungen von Schriftmesswerten und von size-adjust
, um allgemein verfügbare lokale Schriftarten umzuwandeln, anstatt zu versuchen, eine lokale Schriftart zu finden, die der Webschriftart sehr nahe kommt. Bei der Auswahl lokaler Schriftarten ist zu beachten, dass nur sehr wenige Schriftarten weithin lokal verfügbar sind und es keine einzelne Schriftart gibt, die auf allen Geräten vorhanden ist.
Arial
ist die empfohlene Fallback-Schriftart für serifenlose Schriftarten und Times New Roman
die empfohlene Fallback-Schriftart für Serifenschriften. Keine dieser Schriftarten ist unter Android jedoch verfügbar. Roboto
ist die einzige Systemschriftart unter Android.
Im folgenden Beispiel werden drei Fallback-Schriftarten verwendet, um eine breite Geräteabdeckung zu gewährleisten: eine Fallback-Schriftart, die auf Windows-/Mac-Geräte ausgerichtet ist, eine Fallback-Schriftart, die auf Android-Geräte ausgerichtet ist, und eine Fallback-Schriftart, die eine generische Schriftartfamilie verwendet.
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%;
}
Bitte um Feedback
Bitte wenden Sie sich an uns, wenn Sie Feedback zu den Überschreibungen von Schriftmetriken und size-adjust
haben.