Mehr variable Schriftarten für die macOS-System-UI-Schriftart in Chromium 83

Catalina bietet eine neue einheitliche variable Systemschriftart für macOS.

Im Abschnitt „system-ui“ der CSS Fonts Module Level 4-Spezifikation wird das Schriftschnitt-Keyword system-ui definiert. Damit können Entwickler die integrierte, turbooptimierte, lokalisierte, hochqualitative und ohne Download verfügbare Standardschriftart des Betriebssystems direkt auf ihren Websites und in ihren Apps verwenden.

body {
  font-family: system-ui;
}

Diese Typografie-Auswahl entspricht der Anweisung „Verwende die Standardsystemschriftart für die aktuelle Sprache dieses Nutzers“.

Unter macOS ist die Schriftart system-ui „San Francisco“. Diese Schriftart wurde von einem Designteam geprüft, getestet und vor Kurzem aktualisiert. Zuerst sprechen wir über die neuen Funktionen für variable Schriftarten in Catalina, dann sprechen wir über einige Fehler und wie die Chromium-Entwickler sie behoben haben.

In diesem Beitrag wird davon ausgegangen, dass Sie mit variablen Schriftarten vertraut sind. Falls nicht, sehen Sie sich den Artikel Einführung in variable Schriftarten im Web und das Video unten an.

Browserkompatibilität

Zum Zeitpunkt der Erstellung dieses Artikels wird system-ui von Chromium (seit Version 56), Edge (seit Version 79), Safari (seit Version 11) und Firefox (seit Version 43) unterstützt, aber nur mit dem Keyword -apple-system. Aktuelle Informationen finden Sie unter Kann ich variable Schriftarten verwenden?

Neue Kräfte

Die neuen Funktionen, die Catalina für das System-Schriftbild eingeführt hat, sind ab Chromium 83 für Webentwickler verfügbar. Die Schriftart system-ui bietet jetzt mehr variable Einstellungen: optische Größenanpassung und zwei individuelle Gewichtsanpassungen:

Mojave
h1 {
  font-family: system-ui;
  font-weight: 700;
  font-variation-settings:
    'wght' 750
  ;
}
Catalina
h1 {
  font-family: system-ui;
  font-weight: 700;
  font-variation-settings:
    'wght' 750,
    'opsz' 20,
    'GRAD' 400,
    'YAXS' 400
  ;
}

Unter Mojave ist system-ui eine variable Schriftart mit nur wght Einstellungen. system-ui in Catalina ist eine variable Schriftart mit den Einstellungen wght, opsz, GRAD und YAXS.

Das sind für mich gute Möglichkeiten für ein Design mit progressiver Verbesserung. Sie können sich auch eingehend mit den Feinheiten der Systemschriftart befassen.

wght

Die Schriftstärke kann zwischen 0 und 900 liegen und wird auf alle Zeichen angewendet.

/* 0-900 */
font-variation-settings: 'wght' 750;

opsz

Die optische Abmessung ähnelt der Unterschneidung oder des Buchstabenabstands, allerdings werden die Abstände vom menschlichen Auge statt durch eine Berechnung vorgenommen. Ein Wert von 19 oder niedriger ist für den Abstand zwischen Text und Fließtext vorgesehen, während 20 oder höher für den Abstand zwischen Überschriften und Titeln bestimmt ist.

/* 19 or 20 */
font-variation-settings: 'opsz' 20;

GRAD

Ähnlich wie „Gewicht“, aber ohne Einfluss auf den horizontalen Abstand. Es sind Werte zwischen 400 und 1000 zulässig.

/* 400-1000 */
font-variation-settings: 'GRAD' 500;

YAXS

Streckt die Glyphe vertikal. Es sind Werte zwischen 400 und 1000 zulässig.

/* 400-1000 */
font-variation-settings: 'YAXS' 500;

Optionen kombinieren

Mit ein paar CSS-Zeilen können wir die Schriftarteinstellungen fett formatieren oder andere interessante Kombinationen ausprobieren:

font-weight: 700;
font-weight: bold;
font-variation-settings: 'wght' 750, 'YAXS' 600, 'GRAD' 500, 'opsz' 20;

Und schon sehen Chromium-Nutzer unter macOS deine aktualisierte, benutzerdefinierte 750er-Schriftart mit einigen weiteren Optimierungen. 👍

Spielplatz

Klicke unten im Glitch unten auf Remix to Edit (Zum Bearbeiten Remix), um eine bearbeitbare Kopie des Glitch zu erhalten, und bearbeite dann die neuen font-variation-settings-Optionen, um zu sehen, wie sich dies auf deine Schriftart auswirkt. Dieser Glitch funktioniert nur, wenn du ein macOS Catalina-Gerät verwendest.

In macOS 10.15 wurden dem Systemschriftschnitt neue Funktionen hinzugefügt. In macOS 10.15 wurde im Chromium-Bug-Tracker ein schwieriger system-ui-Fehler protokolliert. Ich frage mich, ob sie verwandt sind.

Anhang: Die system-ui-Regression

Dieser Fall beginnt mit einem anderen Fehler: #1005969. Dieser Fehler wurde für macOS 10.15 gemeldet, da der Schriftabstand von system-ui schmal und überladen wirkte.

Vergleich von zwei Absätzen auf einer Facebook-Gruppenseite Links ist Chrome und rechts Safari zu sehen. In Chrome ist der Abstand zwischen den Elementen etwas geringer.
Chrome links (enger Tracking), Safari rechts (besserer optischer Abstand)

Hintergrund

Haben Sie schon einmal bemerkt, dass in macOS 10.14 Ihre Absätze oder Überschriften zu einer anderen Schriftart „gewechselt“ sind, wenn die Größe erhöht oder verringert wurde?

In Mojave (macOS 10.14) wechselte die Schriftart system-ui je nach Zielschriftgröße zwischen zwei Schriftarten. Wenn Text unter 20px lag, wurde von macOS „San Francisco Text“ verwendet. Wenn der Text 20px oder mehr war, wurde von macOS „San Francisco Display“ verwendet. Die optische Größenanpassung wurde statisch in zwei separate Schriftarten integriert.

Catalina (macOS 10.15) enthält eine neue einheitliche variable Schriftart für San Francisco. „Text“ und „Anzeige“ können nicht mehr verwaltet werden. Außerdem wurde die neue Varianteinstellung opsz hinzugefügt, die oben beschrieben wurde.

h1 {
  font-variation-settings: 'opsz' 20;
}

Leider ist der Standardwert für opsz in der neuen Catalina-Schrift 20 und die Chromium-Entwickler waren nicht bereit, opsz auf die Systemschrift anzuwenden. Das führte dazu, dass kleinere Größen zu schmal angezeigt wurden.

Um das Problem zu beheben, musste Chromium opsz richtig auf die Systemschriftart anwenden. Dadurch konnte Problem 1005969 behoben werden. Volltreffer! Oder war es…?

Noch nicht erledigt

Hier wurde es knifflig: Chromium hat opsz angewendet, aber etwas sah immer noch nicht richtig aus. Systemschriften auf dem Mac haben eine zusätzliche Schrifttabelle namens trak, mit der der horizontale Abstand angepasst wird. Bei der Fehlerbehebung stellten die Chromium-Entwickler fest, dass unter macOS die trak-Messwerte beim Abrufen horizontaler Messwerte aus einem CTFontRef-Objekt bereits in die Messergebnisse einbezogen wurden. Für die Formbibliothek HarfBuzz von Chromium sind Messwerte erforderlich, bei denen die trak-Werte noch nicht berücksichtigt wurden.

Eine Anzeige der System-UI und ihrer gesamten Schriftstärke und -variationen in einer Liste. Bei der Hälfte von ihnen werden keine Gewichtsunterschiede angewendet.
Links: Fettdruck für Schriftgrößen 19 und kleiner. Rechts: Bei Schriftgrößen 20 und höher werden fette Stile entfernt

Intern verwendet Skia (die Grafikbibliothek und nicht die Schriftart mit demselben Namen) sowohl die Klasse CGFontRef aus CoreGraphics als auch die Klasse CTFontRef aus CoreText. Aufgrund der erforderlichen internen Konvertierungen zwischen diesen Objekten (zur Wahrung der Abwärtskompatibilität und zum Zugriff auf die erforderlichen APIs in beiden Klassen) gingen in bestimmten Fällen Informationen zum Gewicht verloren und Fettdruckschriften funktionierten nicht mehr. Dieses Problem wurde unter Issue 1057654 erfasst.

Skia muss macOS 10.11 weiterhin unterstützen, da Chromium dies weiterhin unterstützt. In Version 10.11 waren die Schriftarten „San Francisco Text“ und „San Francisco Display“ noch keine variablen Schriftarten. Stattdessen war jede Schriftart eine Familie mit separaten Schriftschnitten für jede verfügbare Stärke. Irgendwann waren die Glyphen-IDs nicht mehr miteinander synchronisiert. Wenn Skia also die Textformatierung (Umwandlung von Text in Glyphen, die gezeichnet werden können) mit „San Francisco Text“ durchführt, würde es unleserlich, wenn es mit „San Francisco Display“ gezeichnet würde, und umgekehrt. Und selbst wenn Skia nur nach einer anderen Größe gefragt hat, wechselt macOS möglicherweise zur anderen. Es sollte möglich sein, immer eine der Schriftarten zu verwenden und sie einfach zu skalieren (mit einer Matrix, um sie zu vergrößern, anstatt eine größere Größe anzufordern). Bei CoreText gibt es jedoch ein Problem, bei dem sbix-Glyphen (farbige Emojis) nicht vergrößert, sondern nur verkleinert werden. Es ist etwas komplizierter. CoreText scheint die vertikale Ausdehnung nach der Matrixanwendung zu begrenzen, was damit zusammenhängt, dass Emojis nicht in einem Winkel von 45 Grad gezeichnet werden können. Wenn Sie möchten, dass Ihr Emoji groß angezeigt wird, müssen Sie in jedem Fall eine Kopie der Schriftart erstellen, um eine große Version zu erhalten.

Um intern Kopien von CTFont-Objekten in verschiedenen Größen zu erstellen und gleichzeitig dafür zu sorgen, dass dieselben zugrunde liegenden Schriftdaten verwendet werden, hat Chromium die CGFont aus der CTFont entfernt und dann eine neue CTFont aus der CGFont erstellt. CGFont-Objekte sind größenabhängig, die magische Umschaltung erfolgt auf CoreText-Ebene. Das hat bis Version 10.154 gut funktioniert. In 10.15 wurden bei dieser Rundreise zu viele Informationen verloren, was zu dem Gewichtsproblem führte. Flutter hat das Gewichtsproblem erkannt und eine alternative Lösung für die Größenanpassung wurde vorgenommen, um das neue CTFont direkt aus dem ursprünglichen CTFont zu erstellen und die optische Größe direkt mit einem alten, aber nicht dokumentierten Attribut in CoreText zu steuern. Dadurch funktioniert die Funktion unter 10.11 weiterhin und andere Probleme werden behoben, z. B. das explizite Festlegen der optischen Größe auf den Standardwert.

Dadurch bleibt jedoch mehr von der „Magie“ von CoreText in der Schrift erhalten. Eine davon besteht darin, dass die Glyphenabstände nicht nur über die trak-Tabelle angepasst werden (deren Anwendung in Chromium bereits durch ein weiteres nicht dokumentiertes Attribut unterdrückt wurde).

CGFont führt keine dieser „magischen“ Aktionen aus. Könnte Chromium die CGFont aus der CTFont entfernen und sie nur verwenden, um Fortschritte zu erzielen? Das würde leider nicht funktionieren, da CoreText bekanntermaßen auch andere Schriftarten verwendet. So werden kleine Emojis beispielsweise etwas größer als von Ihnen gewünscht (verringert sich etwas größer). CGFont weiß das nicht und würde die sbix-basierten Emojis zu nah beieinander platzieren, da Sie sie in einer bestimmten Größe messen, CoreText sie aber etwas größer zeichnet. Chromium möchte, dass die CTFont Fortschritte gemacht werden, aber ohne Nachverfolgung und vorzugsweise ohne weitere mühselige Aktivitäten.

Da die Behebung des Abstandsproblems eine Reihe miteinander verbundener Blink- und Skia-Fehlerkorrekturen erforderte, konnten die Chromium-Entwickler das Problem nicht einfach rückgängig machen. Die Chromium-Entwickler haben auch versucht, ein anderes Build-Flag zum Ändern eines schriftbezogenen Codepfads in Skia zu verwenden. Dadurch wurde das Problem mit fett formatierten Schriftarten behoben, aber das Problem mit dem Abstand verschlechterte sich.

Lösung

Letztendlich wollte Chromium natürlich beide Probleme beheben. Chromium nutzt jetzt die in HarfBuzz integrierten OpenType-Messwertfunktionen für Schriftarten, um horizontale Messwerte direkt aus den Binärdaten in den Schriftartentabellen der Systemschrift abzurufen. So umgeht Chromium CoreText und Skia, wenn die Schriftart eine trak-Tabelle hat (außer bei der Emoji-Schriftart).

Eine Liste mit der System-UI und allen Schriftschnitten und -varianten Die zuvor nicht funktionierende Hälfte sieht jetzt gut aus.

In der Zwischenzeit gibt es immer noch das Skia-Problem Nr. 10123, das die Behebung dieses Problems vollständig in Skia verfolgt und wieder Skia verwendet, um die Systemschriftmesswerte von dort abzurufen, anstatt der aktuellen Korrektur, die HarfBuzz durchläuft.