SVG-Sprites statt Web-Icon-Fonts

In diesem Tutorial soll gezeigt werden, wie in einer Webanwendung Icon-Fonts durch SVG-Sprites abgelöst werden können.

Was sind SVG-Sprites?

Als SVG-Sprites werden SVG-Dateien bezeichnet, die mehrere nebeneinander angeordnete Symbole enthalten. Diese Symbole können dann einzeln auf Webseiten verwendet werden.

Bislang wurden in unseren Webanwendungen Symbole aus Web-Icon-Fonts, wie Fontawesome oder Bootstrap-Icons verwendet. Demgegenüber bieten SVG-Sprites mehrere Vorteile:

  • Anstelle großer Font-Dateien wird nur eine SVG-Datei verwendet.
  • Diese Datei kann gut von Browsern gecacht werden.
  • Die Datei ist lokal. Sie muss nicht aus einer externen Quelle (Content Delivery Network, CDN) oder aus einem Web-JAR (Maven-Dependency) geladen werden.
  • Eine Mischung von Symbolen aus mehreren Icon-Fonts ist möglich.
  • Die SVG-Symbole sind ebenso per CSS in Farbe, Größe, … anpassbar.

XSLT-Stylesheet zur Erstellung eines SVG-Sprites

Das XSLT1.0-Stylesheet svg-sprites.xsl kann für die Erstellung eines SVG-Sprites mit Symbolen aus verschiedenen Web-Icon-Fonts verwendet werden. Als Eingabe dient eine einfache XML-Datei, in der die benötigten Icons aufgelistet sind. Als Syntax werden <i>-Elemente mit class-Attributen verwendet, wie sie aus dem Einsatz von Web-Fonts bekannt sind (siehe Beispiel-XML-Datei):

<?xml-stylesheet type="text/xsl" href="svg-sprite-icons.xsl"?>
<icons>
  <i class="fa-solid fa-bug"></i>
  <i class="bi bi-cookie"></i>
  ...
</icons> 

Das class-Attribute enthält immer zwei Werte. Der erste Wert ist ein Kürzel für die Icon-Bibliothek. Wenn Icons in verschiedenen Varianten vorliegen, wird hier zusätzlich der Stil codiert. Dieser entspricht häufig dem Ordnernamen im GitHub-Repository. Der zweite Wert entspricht der ID des Icons. Die ID kann in der Regel von der Recherche-Seite kopiert werden oder sie entspricht dem Dateinamen im GitHub-Repository.

Das XSLT-Stylesheet führt mit dieser Datei folgende Transformation durch:

  • Ausgehend von den IDs der einzelnen Icons werden die zugehörigen SVGs aus den GitHub-Repositorien der verschiedenen Webfonts heruntergeladen.
  • Bei Symbolen einiger Webfonts werden geringfügige Optimierungen vorgenommen. So wird beispielsweise die Farbe Schwarz durch currentColor ersetzt. Dadurch wird es später möglich, das Icon per CSS umzufärben.

Ausführen der Transformation

Das Stylesheet ist XSLT 1.0 konform, so lässt sich die Transformation mit einem gängigen Browser durchführen. Allerdings benötigt man inzwischen einen Webserver (z.B Apache HTTPD, Tomcat oder jwebserver), da aktuelle Browser es lokalen HTML-Dateien nicht mehr gestatten, zusätzliche Daten von externen Quellen nachzuladen.
Man startet beispielsweise jwebserver in dem Ordner, in dem sich die Beispiel-XML-Datei und die XSLT-Datei befinden, öffnet im Firefox-Browser die Seite http://127.0.0.1:8000/sample_svg-sprite-icons.xml und speichert diese als SVG-Datei ab (z.B. als sample_svg-sprite-icons.svg). Alternativ lässt sich die Transformation auch an der Kommandozeile mit einem Tool wie xsltproc durchführen.

Benutzung der SVG-Datei

Als Ergebnis wird folgende SVG-Datei erzeugt: SVG-Datei mit allen Symbolen

Die Verwendung im HTML-Code einer Webseite erfolgt beispielhaft auf folgende Weise:

<button type="button" class="btn btn-outline-danger">
  <svg class="icon">
    <use xlink:href="sprite-icons.svg#fa-solid_fa-bug" />
  </svg>  Käfer</button> 

Zusätzlich muss per CSS die Größe des Symbols an die Umgebung angepasst werden:

.icon {
    width: 1em; height:1em; vertical:align:-0.125em; 
}

Es können auch noch weitere Eigenschaften, wie z.B. die Farbe, verändert werden.

Unterstützte Web-Icon-Fonts

Symbole aus folgenden Web-Icon-Fonts werden mit dem XSLT-Stylesheet geladen und in einer SVG-Datei gespeichert:

Bootstrap Icons

“Free, high quality, open source icon library” (über 2.000 Symbole)

Fontawesome Icons

“The internet’s favorite icon library just expanded the menu. New designs. New packs. Millions of possible icons.” (ca. 2.000 freie Symbole)

Teenyicons

“Designed on a 15x15 grid, Teenyicons easily fit in very small spaces and maintain a crisp look” (ca. 1.200 Symbole)

  • Ressourcen: GitHub, Recherche
  • Beispiel-XML: <i class="teenyicons teenyicons-pdf-solid"></i>

Material Design Icons

“Material Design Icons is the official icon set from Google. The icons are designed under the material design guidelines.” (ca. 11.000 Symbole)

  • Ressourcen: GitHub, Recherche via iconify
  • Beispiel-XML: <i class="ic ic-twotone-assignment-ind"></i>

Octicons

“A scalable set of icons handcrafted by GitHub.” (ca. 600 Symbole)

Lucide

“Lucide is an open-source icon library that provides 1000+ vector (svg) files for displaying icons and symbols in digital and non-digital projects. The library aims to make it easier for designers and developers to incorporate icons into their projects…” (über 1.000 Symbole)

Hero Icons

“Beautiful hand-crafted SVG icons, by the makers of Tailwind CSS. Available as basic SVG icons and via first-party React and Vue libraries.” (über 300 Symbole)

  • Ressourcen: Homepage, GitHub
  • Beispiel-XML: <i class="hero-24-outline hero-truck"></i>

Tabler

“A set of over 5800 free MIT-licensed high-quality SVG icons for you to use in your web projects.”

Phosphor Icons

“Phosphor is a flexible icon family for interfaces, diagrams, presentations — whatever, really. - 1,248 icons and counting - 6 weights: Thin, Light, Regular, Bold, Fill, and Duotone Designed at 16 x 16px to read well small and scale up big

Radix Icons

“A crisp set of 15×15 icons designed by the WorkOS team.” (über 300 Symbole)

  • Ressourcen: Homepage, GitHub
  • Beispiel-XML: <i class="radix radix-rocket"></i>

Clarity

Clarity icons provides pixel-perfect, scalable SVG-based icons. The icon system gives you complete control over icon color, orientation, and size. Additionally, you can access and customize any SVG graphic elements inside the icon through standard CSS.

Simple Icons

“Over 3300 SVG icons for popular brands.”

  • Ressourcen: Homepage, GitHub
  • Beispiel-XML: <i class="simple simple-buymeacoffee"></i>

Iconoir

“An open source icons library with 1600+ icons, supporting React, React Native, Flutter, Vue, Figma, and Framer.”

  • Ressourcen: Homeage, GitHub
  • Beispiel-XML: <i class="iconoir-regular iconoir-jellyfish"></i>

Flag-Icons

“A curated collection of all country flags in SVG” (ca. 270 Symbole)

  • Ressourcen: Homepage, GitHub
  • Beispiel-XML: <i class="flagicons flagicons-ki"></i>

Academicons

“Academicons is a specialist icon font for academics. It contains icons for websites and organisations related to academia that are often missing from mainstream font packages. It can be used by itself, but its primary purpose is to be used as a supplementary package alongside a larger icon set.” (ca. 150 Symbole)

Fazit

Gerade wenn in einer Webanwendung nur wenige Icons verwendet werden, die gegebenenfalls auch noch aus verschiedenen Web-Icon-Fonts stammen, bietet eine einzelne SVG-Sprite-Datei Vorteile. Mit dem hier vorgestellten XSLT-Stylesheet kann diese unter Verwendung mehrere bekannter Icon-Bibliotheken hergestellt werden. Bei Bedarf lässt sich das Stylesheet für weitere Icon-Bibliotheken anpassen.
Viel Spaß beim Ausprobieren!