Verwendung von benutzerdefinierten Schriftarten mit SVG in einem <img>-Tag

Avatar of Thomas Yip
Thomas Yip am

DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!

Wenn wir ein PNG-Bild erstellen, verwenden wir ein <img>-Tag oder einen CSS-Hintergrund, und das war's. Es ist kinderleicht und garantiert, dass es funktioniert.

PNG ist bei weitem einfacher in HTML zu verwenden als SVG

Leider gilt dies trotz seiner vielen Vorteile nicht für SVG. Obwohl Sie bei der Verwendung von SVG in HTML die Qual der Wahl haben, läuft es wirklich auf inline, <object> und <img> hinaus, die alle ernsthafte Probleme und Kompromisse mit sich bringen.

Probleme mit Inline-SVG

Wenn Sie SVG inline einfügen, verlieren Sie die Möglichkeit, den Browser-Cache, Gzip-Komprimierung zwischen Servern und Browsern sowie die Bildindizierung durch Suchmaschinen (Inline-SVG wird nicht als Bild betrachtet) zu nutzen. Auch wenn sich Ihr Bild kein bisschen geändert hat, wird es immer wieder neu geladen, was zu langsameren Ladezeiten für Ihre Website führt – ein Kompromiss, den die meisten nicht eingehen wollen.

Darüber hinaus führt das Inline-Einbetten von SVG zu komplexen Abhängigkeitsproblemen, bei denen Sie Bilder nicht einfach in HTML einfügen können und auf Skripte (PHP oder andere) zurückgreifen müssen. Wenn Sie mehr als nur ein paar Bilder haben, wird dies zu einem großen Problem bei der Wartung Ihrer Website, da Sie das <img>-Tag im Wesentlichen nicht mehr verwenden können.

Zweifellos gibt es Bereiche, in denen das Inline-Einbetten von SVG glänzt – und zwar, wenn Sie möchten, dass Ihre Bilder schnell angezeigt werden, ohne auf andere Ressourcen warten zu müssen. Abgesehen davon kann man offensichtlich nicht alles inline einfügen.

Probleme mit dem object-Tag

SVG ist bekannt für seine hervorragende Qualität bei der Anzeige auf Geräten aller Auflösungen und seine Fähigkeit, auf externe Ressourcen – wie CSS und Schriftarten – zu verweisen, während die Dateigröße sehr klein bleibt. Die Idee ist, viele SVGs zu haben, die sich alle eine einzige CSS- oder eine einzige Schriftartdatei teilen, um die Menge der herunterzuladenden Ressourcen zu reduzieren.

Der Mythos der Ressourcenteilung

Viele wissen nicht, dass die gemeinsame Nutzung externer Ressourcen für SVG nur für Inline-SVG gilt. Da die Verwendung von <object>-Tags den Zugriff auf diese Ressourcen ermöglicht, besteht die Wahrnehmung, dass der Browser eine einzelne Kopie Ihres CSS herunterlädt, obwohl Sie viele <object>-Tags haben, die auf dieselbe CSS-Datei verweisen.

Dies ist jedoch überhaupt nicht wahr

Mehrere Objekt-Tags laden mehrfache CSS-Dateien herunter

Das Problem verschärft sich dadurch, dass <object>-Tags nicht als Bild erkannt werden und daher keine Bildsuchindizierung möglich ist.

Das Problem wird durch Abhängigkeitsprobleme weiter verschärft. Angenommen, Sie haben 100 Bilder, und 25 davon verwenden eine Roboto-Schriftart, weitere 25 Lato, 25 Open Sans, während der Rest eine Kombination der drei Schriftarten verwendet. Ihr CSS müsste auf alle drei Schriftarten verweisen, da es fast unmöglich ist, nachzuvollziehen, welche Datei welche Schriftarten verwendet, was bedeutet, dass Sie möglicherweise Schriftarten laden, die Sie auf bestimmten Seiten nicht benötigen.

Das Bild-Tag

Damit bleibt uns das <img>-Tag, das viel für sich hat. Da es dasselbe Tag ist, das für andere Bildformate verwendet wird, erhalten Sie Vertrautheit, Browser-Caching, Gzip-Komprimierung und Bildsuche. Jedes Bild ist in sich abgeschlossen, ohne Abhängigkeitsprobleme.

SVG verliert Schriftarten, wenn es mit dem <img>-Tag verwendet wird

Das einzige Problem ist, dass Sie Ihre Schriftarten verlieren werden. Genauer gesagt, wenn Sie Text in Ihrem SVG haben, wird dieser, es sei denn, Sie betten Schriftarten ein, mit Systemschriftarten angezeigt, typischerweise Times New Roman. Sie haben Stunden damit verbracht, eine schöne Schriftart auszuwählen, aber in dem Moment, in dem Sie das <img>-Tag verwenden, um SVG einzubetten, ist all das verloren. Wie kann das akzeptabel sein?

Untersuchung der Schriftarten-Rasterisierung

Schriftarten in Pfade umwandeln

Unsere erste Reaktion ist, zu prüfen, ob wir eine Schriftarten-Rasterisierung durchführen können. Dies ist eine gängige Technik, um Schriftarten in Pfade umzuwandeln, sodass sie auf allen Geräten gut gerendert werden und keine Abhängigkeiten bestehen. Oberflächlich betrachtet funktioniert dies sehr gut, und im Editor sieht alles perfekt aus.

Obwohl das rasterisierte SVG mit satten **137 KB** im Vergleich zu **15,7 KB** vor der Rasterisierung einbrachte, waren wir optimistisch, denn nach der Optimierung unseres SVG mit Gzip-Komprimierung reduziert sich die rasterisierte Datei auf **11 KB**, etwas kleiner als das äquivalente PNG mit **11,9 KB**.

Original Schriftarten-Rasterisierung Schriftarten-Rasterisierung (.svgz)
15,7 KB 137 KB 11,0 KB
PNG @ 1x PNG @ 2x PNG @ 3x
11,9 KB 26,5 KB 42,6 KB
SVG-Bild mit Schriftarten-Rasterisierung

Leider stellten wir fest, dass unser Optimismus verfrüht war, als wir das rasterisierte SVG in HTML einbetteten. Obwohl es auf hochauflösenden Displays großartig aussehen mag, ist die Qualität auf niedrigauflösenden Displays inakzeptabel.

Rasterisierte Schriftarten oben und Original unten

Unten im Bild sind die Original-Schriftarten mit klarer Darstellung, während oben die Schriftarten verpixelt sind, wenn sie mit Schriftarten-Rasterisierung dargestellt werden.

Unterschied bei Cleartype bei Anzeige auf Bildschirmen

Die meisten Betriebssysteme optimieren Schriftarten, um sicherzustellen, dass sie auf allen Bildschirmen klar und scharf angezeigt werden. Unter Windows wird dies als ClearType bezeichnet, und da wir unsere Schriftarten rasterisiert haben, werden keine Optimierungen angewendet, was zu unscharfem Text führt, der besonders auf niedrigauflösenden Bildschirmen sichtbar ist.

Offensichtlich ist eine Qualitätsminderung inakzeptabel, also zurück auf Los.

Schriftarten-Einbettung zur Rettung

Anfänglich waren wir wegen des komplizierten Workflows äußerst skeptisch gegenüber der Schriftarten-Einbettung.

Um Schriftarten in SVG einzubetten, müssen Sie zunächst wissen, welche Schriftfamilien verwendet werden. Dann müssen Sie diese Schriftdateien finden und herunterladen. Nach dem Download müssen Sie reguläre, fette, kursive und fette kursive Schriftarten in Base64-Codierung konvertieren. Wenn Sie dies manuell tun, ist es bei einer großen Anzahl von Dateien nahezu unmöglich, zu wissen, welche Datei fett gedruckt ist und welche nicht. Dann müssen Sie alle vier Base64-codierten Strings in Ihr SVG kopieren.

Sicherlich muss es einen besseren Weg geben. Und deshalb haben wir Nano entwickelt. Nano scannt SVG automatisch und fügt nur die verwendeten Schriftarten ein. Wenn zum Beispiel Fett nicht verwendet wird oder kein Text vorhanden ist, werden keine Schriftarten eingebettet.

Dennoch ist die resultierende Datei riesig und nicht konkurrenzfähig mit dem PNG-Äquivalent, daher haben wir uns weiterentwickelt und unseren eigenen SVG-Optimierer (Nano) entwickelt, der SVG-Dateigrößen auf ein Minimum reduziert. (Sehen Sie, wie Nano SVG komprimiert.) Darüber hinaus haben wir optimiert, wie wir Schriftarten in SVG einbetten, was zu sehr kleinen Dateigrößen führt.

SVG-Bild mit Text, optimiert mit Nano und eingebetteten Schriftarten

Vergleich von Dateigrößen und Bandbreiteneinsparungen

Original Schriftarten-Rasterisierung Nicht optimierte Schriftarten-Einbettung Nano-Schriftarten-Einbettung
Größe 15,7 KB 137 KB 65,2 KB 22,0 KB
Gzip 3,57 KB 11,0 KB 44,5 KB 11,7 KB
PNG @ 1x PNG @ 2x PNG @ 3x
Größe 11,9 KB 26,5 KB 42,6 KB
Gzip 12,1 KB 26,1 KB 41,7 KB

Aus dem obigen Vergleich geht hervor, dass Nano ein extrem schlankes SVG erzeugt, selbst mit eingebetteten Schriftarten, das nur **11,7 KB** (Gzip-komprimiert) im Vergleich zu den äquivalenten PNG @1x mit **11,9 KB** benötigt. Auch wenn dies unbedeutend erscheinen mag, sind die gesamten Bandbreiteneinsparungen auf Ihrer Website sicherlich signifikant.

Nehmen wir an, 50 % Ihres Traffics sind niedrigauflösend, 40 % sind 2X-Auflösung und die restlichen 10 % sind 3X-Auflösung. Wenn Ihre Website 10.000 Aufrufe für ein einzelnes Bild hat

(5.000 * 11,9 KB) + (4.000 * 26,5 KB) + (1.000 * 42,6 KB) = 208,1 MB

Wenn Sie Nano verwenden, komprimiertes SVG mit GZip

10.000 * 11,7 KB = 117,0 MB

Dies führt zu: 208,1 MB – 117,0 MB = 91,1 MB Einsparungen oder 43,7 % Bandbreiteneinsparungen, was nach jedem Maßstab erheblich ist.

Zusätzlich zu den Bandbreiteneinsparungen erhalten Sie einen viel einfacheren Workflow, ohne auf mehrere PNG-Bilder mit mehreren srcset-Attributen zurückgreifen zu müssen, mit deutlich besserer Qualität, einschließlich der Betriebssystem-Schriftartenoptimierung, um sicherzustellen, dass Ihre Bilder auf Geräten aller Auflösungen scharf und klar bleiben. Das Beste daran ist eine bessere Benutzererfahrung für Ihre Benutzer, da Ihre Website schneller geladen wird – besonders auf Geräten mit hoher Auflösung.

Umfassendes Testen von Nano

Mit all den Einsparungen nicht zufrieden, begannen wir, nach SVG-Bildern zu suchen, um Nano gründlich zu testen. Insgesamt wurden **2.571** SVG-Dateien unterschiedlicher Größe und Designs verwendet, was insgesamt 16,3 MB ergab. Und nach der Nano-Optimierung, die zu 6,2 MB führte, eine erstaunliche Einsparung von 61,8 % der Größe.

Eine kleine Auswahl von über 2500 SVG-Bildern, die zum Testen von Nano verwendet wurden

Visuelle Unterschiede anzeigen

Aufgrund der schieren Menge an Dateien, die wir getestet haben und die sich von Zeit zu Zeit erhöht, mussten wir einen automatisierten Test erstellen, der unter anderem automatisch Pixelunterschiede vor und nach der Optimierung hervorhebt. Eine der Beschwerden über andere SVG-Optimierer ist die Tatsache, dass das Minifizieren von SVG Ihr Bild beschädigen kann, sodass es anders gerendert wird als das Original.

Zu diesem Zweck tragen wir die Pixel-Differenzierung in unserem automatisierten Test in Nano selbst ein. Das heißt, Nano warnt Sie, wenn es erkennt, dass das von ihm optimierte SVG mehr als 1 % Pixelunterschied im Vergleich zum Original aufweist, und stellt somit sicher, dass die Optimierung von Nano niemals ein SVG beschädigt.

Nano-Optimierung zeigt visuelle Unterschiede

Da Schriftarten eingebettet und beibehalten werden und SVG ein Vektorgrafikformat ist, ist die Renderqualität bei allen Auflösungen im Vergleich zu anderen Rasterformaten unvergleichlich.

Was kommt als Nächstes?

Wir hoffen, dass unsere Arbeit SVG überall einfacher zu verwenden macht. Wir arbeiten jetzt daran, noch kleinere Dateigrößen zu erzielen und unsere Codes für Node.js zu portieren, damit Sie Ihre Produktions-Builds mit Nano und anderen automatisieren können.

Denken Sie, dass Nano für Ihre Projekte hilfreich sein wird? Lassen Sie es mich in den Kommentaren wissen!