Inline SVG vs Icon Fonts [CAGEMATCH]

Avatar of Chris Coyier
Chris Coyier am

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

Wenn Sie ein Icon-System für eine Website erstellen, haben Sie einige Optionen. Wenn Sie wissen, dass die Icons Rasterbilder sein müssen, verwenden Sie wahrscheinlich CSS Sprites. Wenn die Icons Vektorgrafiken sind (heutzutage viel üblicher), haben Sie einige Optionen. Zwei davon sind die Verwendung von Inline-SVG und die Verwendung von Icon Fonts.

Lassen Sie uns vergleichen.

Icons sind Vektoren

Es gibt große Vorteile bei Vektor-Icons: Sie sind ohne Qualitätsverlust beliebig skalierbar, auf Retina-Displays extra scharf und haben eine kleine Dateigröße.

Icon Font Inline SVG
Browser betrachten es als Text, daher werden die Icons entsprechend antialiased. Dies kann dazu führen, dass die Icons nicht so scharf sind, wie Sie es vielleicht erwarten. Direkter Vektor

In einem aktuellen persönlichen Beispiel waren einige der Icon Fonts beim Konvertieren von Fonts zu SVG auf CodePen merklich weniger scharf als die konvertierten.

CSS-Steuerung

Icon Font Inline SVG
Sie können Größe (über font-size), color, Schatten, Rotation usw. per CSS steuern. Sie haben die gleiche CSS-Steuerung wie bei einer Schriftart, aber besser, da Sie 1) einzelne Teile eines mehrteiligen Icons steuern können und 2) SVG-spezifische CSS wie Kontur-Eigenschaften verwenden können.

Der große Vorteil von Inline-SVG sind wahrscheinlich mehrfarbige Icons.

Positionierung

Icon Font Inline SVG
Es kann frustrierend sein, ein Icon Font zu positionieren. Die Icons werden über ein Pseudo-Element eingefügt, und es hängt von line-height, vertical-align, letter-spacing, word-spacing, dem Design des Font-Glyphen ab (hat es natürlich Platz drumherum? Hat es Kerning-Informationen?). Dann beeinflusst der display-Typ der Pseudo-Elemente, ob diese Eigenschaften Auswirkungen haben oder nicht. SVG hat einfach die Größe, die es hat.
Sehen Sie, wie die Pseudo-Element-Box nicht ganz dort ist, wo sich der Glyphen tatsächlich befindet.
Die SVG-Box hat die Größe des SVG.

Seltsame Fehler

Icon Font Inline SVG

Eine Icon-Schriftart kann fehlschlagen, weil 1) sie domänenübergreifend ohne die richtigen CORS-Header geladen wird und Firefox dies nicht mag, 2) die Font-Datei aus irgendeinem Grund nicht geladen werden kann (Netzwerk-Hickup, Serverfehler etc.), 3) es einen seltsamen Chrome-Bug gibt, der @font-face entfernt und stattdessen eine Fallback-Schriftart anzeigt, 4) eine überraschend Browser @font-face nicht unterstützt.

Fehler bei Schriftarten sind aus einer Vielzahl von Gründen ziemlich häufig. Außerdem, wenn Sie versuchen, etwas Kluges zu tun, wie Icons auf den "Private Use Area" von Unicode zu mappen und die Schriftart fehlschlägt, kann sie etwas wirklich Seltsames tun, wie ein unerwartetes Emoji anzeigen, weil die Umgebung, in der Sie sich befinden, den gleichen Bereich für Emojis verwendet. Oder dieses Emoji könnte sogar Ihre Glyphen überschreiben!

Inline-SVG befindet sich direkt im Dokument. Wenn der Browser es unterstützt, zeigt er es an.

Erzwungene Fehler

Icon Font Inline SVG
  • Proxy-Browser wie Opera Mini oder UC Browser unterstützen @font-face überhaupt nicht, auch wenn sie manchmal angeben, dass sie es tun. Selbst wenn Sie versuchen, Funktionen zu erkennen, kann es fehlschlagen.
  • Einige Leute erzwingen ihre eigenen Schriftarten über Ihre, zum Beispiel in einem benutzerdefinierten Stylesheet oder einer Browser-Erweiterung, die speziell für das Anwenden benutzerdefinierter Stile gedacht ist. Zum Beispiel eine, die eine Schriftart anwendet, die für Menschen mit Legasthenie besser geeignet ist. (Mehr über die Probleme mit der Barrierefreiheit von Icon Fonts von Seren D.)
  • Blockierende Technologien können entweder automatisch benutzerdefinierte Schriftarten blockieren oder anbieten, diese zu blockieren. (Referenz)
Selbst diese Proxy-Browser unterstützen SVG. Blocker kümmern sich nicht um SVG.
Werbeblocker bietet an, benutzerdefinierte Schriftarten komplett zu blockieren.
Das Erzwingen einer anderen Schriftart auf einer Seite kann ein Icon-Font-System zerstören.

Semantik

Icon Font Inline SVG
Um es verantwortungsvoll zu nutzen, fügen Sie das Icon über ein Pseudo-Element auf einem (leeren) <span> ein. Entweder schlechte oder keine Semantik, je nachdem, wie Sie darüber denken. Icons sind kleine Bilder. Die Semantik von <svg> sagt "Ich bin ein Bild". Das erscheint mir besser.

Barrierefreiheit (Accessibility)

Icon Font Inline SVG
Sie müssen mit Icon Fonts sehr vorsichtig sein, um sicherzustellen, dass Sie es barrierefrei gestalten. Sie sollten im Grunde alles in diesem Artikel tun. Sie kämpfen immer darum, sicherzustellen, dass das Icon selbst nicht gelesen wird (aber etwas anderes schon) und dass schwer zu erkennende Fehlerzustände behandelt werden. Ich bin kein Experte, aber Recherchen deuten darauf hin, dass Sie durch die richtige Kombination von Elementen und Attributen (<title>, <desc> und aria-labelledby) gute Informationen über das Browser-Spektrum hinweg vermitteln können. Plus keine seltsamen Fehlerzustände.

Benutzerfreundlichkeit

Icon Font Inline SVG
Die Verwendung einer vorgefertigten Icon-Schriftart war nie besonders verantwortungsvoll (zu viele ungenutzte Icons). Das Erstellen Ihrer eigenen Icon-Schriftart war nie übermäßig bequem. Ich denke, die besten waren Pictos Server (beschränkt auf Pictos-Icons) und IcoMoon (kostenloser Login zum Speichern von Projekten). Fontello hat eine API, die ich nicht verwendet habe, um ein gutes Build-Tool zu erstellen. Das Inline-SVG-System ist einfacher, da Sie es bei Bedarf von Hand erledigen können. Oder verwenden Sie ein Tool wie IcoMoon (exportiert in beide Richtungen). Oder verwenden Sie ein Build-Tool.

Browser-Unterstützung

Icon Font Inline SVG
Sehr tief. Sogar IE 6. Anständig, aber Probleme sind IE 8- und Android 2.3-. Fallbacks machbar, aber nicht wunderbar.

Gewinner

Es kommt alles auf die Browserunterstützung an. Wenn Sie IE 9+ / Android 3+ verwenden können, ist Inline-SVG bei *ziemlich allem* besser als Icon Fonts. Wenn Sie tiefere Browserunterstützung benötigen, glaube ich, dass ein Inline-SVG-Fallback zu schmerzhaft wäre, um es wert zu sein (Pflege einer PNG-Kopie, Einfügen eines zusätzlichen Elements zur Anzeige der PNG-Version, Ausblenden des SVG-Elements... es ist aufwendig).