Scalable Vector Graphics, kurz SVG, gehören heute ganz selbstverständlich zum modernen Web. Logos, Icons, Diagramme, Interface-Elemente oder illustrative Grafiken werden längst häufig als Vektoren ausgeliefert – aus gutem Grund. Eine sauber aufgebaute SVG bleibt auf kleinen wie großen Bildschirmen scharf, ist oft erstaunlich leichtgewichtig und lässt sich je nach Einbindungsart sehr unterschiedlich weiterverarbeiten. Genau darin liegt ihre Stärke, aber auch die eigentliche Herausforderung.
Denn SVG ist nicht einfach nur eine Bilddatei. Das Format ist strukturell lesbarer Code. Und deshalb macht es einen erheblichen Unterschied, ob eine Grafik als externe Datei eingebunden, direkt ins HTML geschrieben oder als dekoratives Element im CSS verwendet wird. Wer SVG im Projektalltag sinnvoll einsetzen will, sollte also nicht nur das Format kennen, sondern vor allem die jeweiligen Einbindungsarten – und ihre Konsequenzen.
Die einfachste Lösung ist oft auch die sinnvollste. Wenn eine SVG-Datei bereits vorliegt und wie ein normales Bild ausgegeben werden soll, ist das img-Element in vielen Fällen die beste Wahl.
<figure>
<img src="/assets/logo.svg" alt="Logo der urbanstudio GmbH" width="200" height="60" loading="lazy"decoding="async">
</figure>
Diese Form der Einbindung ist sauber, robust und schnell verständlich. Das Markup bleibt schlank, die Grafik verhält sich wie ein gewöhnliches Bild und lässt sich problemlos responsiv skalieren. Für Logos, Illustrationen oder statische Grafiken ist das oft genau richtig.
Allerdings endet die Bequemlichkeit dort, wo die Grafik selbst Teil der Oberfläche werden soll. Wer einzelne Flächen einfärben, Zustände wechseln, Linien animieren oder Pfade per JavaScript gezielt ansprechen möchte, stößt mit img schnell an Grenzen. Das SVG wird in diesem Fall wie ein Bild behandelt – nicht wie eine offen zugängliche Struktur.
Sobald eine Grafik nicht nur angezeigt, sondern aktiv gestaltet oder verändert werden soll, ist Inline-SVG meist die spannendere Variante. Dabei wird der SVG-Code direkt in das HTML-Dokument eingebettet.
<svg viewBox="0 0 24 24" role="img" aria-label="Suche" xmlns="http://www.w3.org/2000/svg">
<title>Suche</title>
<circle cx="11" cy="11" r="7" fill="none" stroke="currentColor" stroke-width="2" />
<path d="M16.5 16.5L21 21" stroke="currentColor" stroke-width="2" stroke-linecap="round" />
</svg>
Der große Vorteil liegt auf der Hand: Die SVG ist damit Teil des DOM. Einzelne Elemente lassen sich mit CSS gestalten, mit JavaScript manipulieren und viel präziser in ein Interface einbinden. Gerade für Icons, UI-Komponenten oder grafische Zustände ist das oft die elegantere Lösung. Wer mit currentColor , CSS-Variablen oder Theme-Systemen arbeitet, bekommt hier ein sehr flexibles Werkzeug.
Natürlich ist diese Freiheit nicht kostenlos. Komplexe SVGs können das HTML aufblähen und Templates unübersichtlich machen. Inline-SVG ist deshalb vor allem dort sinnvoll, wo die zusätzliche Kontrolle wirklich gebraucht wird. Für eine simple statische Grafik wäre es oft unnötig aufwendig, für ein anpassbares Interface-Element hingegen genau richtig.
Wenn ein Icon oder ein grafisches Element mehrfach auf einer Seite oder in einer Anwendung vorkommt, muss der Code nicht jedes Mal neu notiert werden. Ein Element wird einmal hinterlegt, alle weiteren Vorkommen verweisen darauf. Zuständig dafür ist <use>, ein unscheinbares Element, das deutlich mehr kann als die klassische Sprite-Anleitung vermuten lässt.
Der bekannteste Weg führt über <symbol>. Die Definition liegt in einem ausgeblendeten Container, die Ausgabe erfolgt an beliebig vielen Stellen im Dokument.
<svg xmlns="http://www.w3.org/2000/svg" style="display:none;">
<symbol id="icon-arrow" viewBox="0 0 24 24">
<path d="M5 12h12" stroke="currentColor" stroke-width="2" />
<path d="M13 6l6 6-6 6" fill="none" stroke="currentColor" stroke-width="2" />
</symbol>
</svg>
<svg class="icon" role="img" aria-label="Weiter">
<use href="#icon-arrow"></use>
</svg>
Das ist besonders bei Icon-Sets, Navigationssystemen und Buttons interessant. Der Code bleibt konsistent, die Pflege wird einfacher und wiederkehrende Elemente lassen sich zentral verwalten. In größeren Projekten ist das oft deutlich angenehmer, als dieselbe SVG immer wieder inline zu kopieren.
Ein Hinweis zu den Beispielen: role und aria-label gehören nur an ein Icon, das eine eigene Bedeutung trägt. Ein dekoratives Icon neben einem lesbaren Textlabel bleibt besser stumm. Warum weniger ARIA häufig die bessere Entscheidung ist, behandelt der Beitrag zur First Rule of ARIA.
symbol hat dabei zwei Eigenschaften, die es für diesen Zweck prädestinieren: Es wird nie selbst gerendert, und es bringt eine eigene viewBox mit. Die Definition steht also im Dokument, ohne sichtbar zu sein.
<use> ist auf <symbol> allerdings nicht angewiesen. Referenzieren lässt sich jedes Element mit einer id , auch eine vollständige, bereits im Dokument vorhandene SVG. Wer im DevTools-Inspektor eines CMS-Frontends auf Konstruktionen wie diese stößt, sieht genau das:
<svg viewBox="0 0 126 33" id="svg9086199668">
<path d="…" fill="currentColor" />
</svg>
<div class="svgContainer">
<svg style="width:100%;height:100%;">
<use href="#svg9086199668"></use>
</svg>
</div>
Typischer Fall: Ein Logo oder eine Signet-Grafik wird vom System einmal ausgegeben und danach an mehreren Stellen im Layout wiederverwendet, in unterschiedlichen Größen, ohne dass die Pfaddaten mehrfach im Markup landen. Zwei Details sind dabei zu beachten. Das referenzierte Element bleibt an seiner ursprünglichen Stelle sichtbar, sofern es nicht in einem ausgeblendeten Container liegt. Und width und height am <use> überschreiben die Maße des Originals, während die viewBox vom referenzierten Element kommt.
Die interessanteste Variante steht bislang selten in Anleitungen: Der Fragment-Bezeichner darf auch auf eine externe Datei zeigen.
<svg class="icon" role="img" aria-label="Weiter">
<use href="/assets/icons.svg#icon-arrow"></use>
</svg>
Das Sprite liegt damit in einer eigenen, cachebaren Datei, das HTML bleibt schlank und jedes Template greift auf denselben Bestand zu. Alle aktuellen Browser beherrschen das, historische Ausnahmen wie der Internet Explorer und Safari 6 spielen keine Rolle mehr. Zwei Einschränkungen bleiben: Die Datei muss von derselben Origin stammen, denn Cross-Origin-Referenzen sind nirgends vorgesehen, auch nicht in der Spezifikation. Und wer die Seite direkt aus dem Dateisystem öffnet statt über einen lokalen Server, bekommt ebenfalls nichts zu sehen, was beim Testen regelmäßig für Verwirrung sorgt.
Am Rande: In älterem Code steht statt href häufig xlink:href. Nötig ist das seit SVG 2 nicht mehr, schadet als zusätzliches Attribut aber auch nicht.
Wer sich eine <use> -Instanz im Inspektor ansieht, findet dort einen Hinweis auf einen Schatteninhalt, den der User-Agent erzeugt hat. Das ist keine Kuriosität der Entwicklerwerkzeuge, sondern die Erklärung für das Verhalten, an dem in der Praxis die meisten hängenbleiben: Der referenzierte Inhalt wird in einen Shadow-Tree geklont, und CSS-Selektoren aus dem Dokument erreichen ihn nicht.
Eine Regel wie .icon path{fill: red;} läuft deshalb ins Leere. Was hingegen ankommt, sind vererbbare Eigenschaften, weil Vererbung die Grenze des Schattenbaums überschreitet: color, fill, stroke, stroke-width. Genau deshalb ist fill=„currentColor“ in der Definition so verbreitet. Die Farbe wird dann außen am <use>-Element oder an dessen Elternelement gesetzt und wandert nach innen. Woher dieser eine Farbwert kommt und wie sich Hover-Zustand und Dark-Mode-Variante daraus ableiten lassen, ohne einen zweiten Variablensatz zu pflegen, zeigen die Snippets zu color-mix() und light-dark().
.icon {
width: 1.5rem;
height: 1.5rem;
color: var(--us-color-accent);
}
.icon:hover { color: var(--us-color-accent-hover); }
Auch CSS-Custom-Properties werden vererbt und funktionieren innerhalb desselben Dokuments zuverlässig, was mehrfarbige Icons mit var(--icon-primary) und var(--icon-secondary) ermöglicht. Bei externen Referenzen lohnt sich hier ein Test, denn die Implementierungen sind an dieser Stelle uneinheitlicher als bei currentColor.
Ein zweiter Punkt betrifft JavaScript. Der geklonte Inhalt ist über die üblichen DOM-Methoden nicht erreichbar. Wer einzelne Pfade animieren oder gezielt ansprechen möchte, arbeitet mit dem Original oder bindet die Grafik inline ein.
SVG kann ebenso als Hintergrundbild eingesetzt werden. Das ist vor allem dann sinnvoll, wenn die Grafik dekorativen Charakter hat und nicht als eigenständiger Inhalt verstanden werden muss.
.button-download::before{
content:"";
display:inline-block;
width:1em;
height:1em;
margin-right:.5rem;
background-image:url("/assets/icons/download.svg");
background-repeat:no-repeat;
background-size:contain;
background-position:center;
}
Für kleine Marker, Muster, Hintergrundflächen oder ornamentale Interface-Details ist das ein sehr brauchbarer Weg. Das HTML bleibt schlank, die Gestaltung sitzt dort, wo sie hingehört, und die Grafik lässt sich gut in ein Layout integrieren.
Sobald die SVG allerdings inhaltlich relevant wird, ist dieser Ansatz nicht mehr ideal. Ein CSS-Hintergrund trägt keine semantische Bedeutung, hat kein alt -Attribut und ist nicht dafür gedacht, von Screenreadern als Bildinhalt interpretiert zu werden. Für Dekoration ist das korrekt, für bedeutungstragende Grafiken nicht.
Auch per object lässt sich SVG einbinden. Diese Methode ist vor allem dann interessant, wenn die Grafik stärker als eigenständiges Dokument verstanden werden soll.
<object data="/assets/chart.svg" type="image/svg+xml" width="600" height="300">
<img src="/assets/chart.png" alt="Diagramm als Fallback">
</object>
Das kann in bestimmten Sonderfällen nützlich sein, etwa wenn ein Fallback vorgesehen werden soll oder wenn eine Grafik bewusst gekapselt geladen wird. Im typischen Frontend-Alltag ist diese Variante jedoch eher die Ausnahme. Sie ist meist schwerfälliger als img und weniger direkt als Inline-SVG. Gerade in Redaktionssystemen oder CMS-Umgebungen ist sie deshalb oft nicht die erste Wahl.
Eine weitere Möglichkeit besteht darin, SVG direkt als Data URI einzubetten, meist im CSS. Das spart eine zusätzliche Datei, macht den Code aber schnell sperrig.
.logo-mark{
width:48px;
height:48px;
background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='10' fill='%23025087'/%3E%3C/svg%3E");
background-repeat:no-repeat;
background-size:contain;
}
Für sehr kleine, gezielte Einsätze kann das praktisch sein. Als allgemeine Strategie empfiehlt es sich aber selten. Sobald SVGs komplexer werden, mehrfach im Projekt vorkommen oder später bearbeitet werden sollen, leidet vor allem die Lesbarkeit. Technisch möglich ist vieles – sinnvoll ist meist die Lösung, die auch in ein paar Monaten noch wartbar bleibt.
Auch das picture-Element lässt sich mit SVG kombinieren. Relevant wird das vor allem dann, wenn unterschiedliche Quellen oder Fallbacks gezielt gesteuert werden sollen.
<picture>
<source srcset="/assets/illustration.svg" type="image/svg+xml">
<img src="/assets/illustration.png" alt="Illustration">
</picture>
Im Alltag bleibt das dennoch eher ein Spezialfall. Wer einfach nur eine SVG ausgeben möchte, fährt mit img meist direkter und verständlicher. picture lohnt sich dort, wo tatsächlich verschiedene Bildvarianten in einer sauberen Logik zusammenspielen sollen.
Besonders spannend wird SVG dort, wo Bewegung ins Spiel kommt. Denn Vektorgrafiken lassen sich nicht nur scharf darstellen, sondern oft auch sehr präzise animieren. Linien können gezeichnet wirken, Flächen sich einfärben, Gruppen rotieren oder Zustände weich ineinander übergehen. Gerade in Interfaces, bei erklärenden Grafiken oder kleinen Microinteractions entsteht dadurch ein echter Mehrwert.
Dabei muss Animation nicht spektakulär sein. Oft genügt schon ein dezenter Übergang oder eine kleine visuelle Reaktion, um eine Oberfläche verständlicher und hochwertiger wirken zu lassen. Voraussetzung dafür ist allerdings meist, dass die SVG inline eingebunden oder gezielt als Struktur ansprechbar ist. Wer sie nur per img lädt, verschenkt viele dieser Möglichkeiten.
Das Thema selbst ist groß genug für einen eigenen Beitrag. Zwischen CSS-Animationen, JavaScript-Steuerung, Performance und Barrierefreiheit gibt es hier genug Stoff, um genauer hinzusehen.
In WordPress taucht beim Thema SVG regelmäßig eine zusätzliche Hürde auf: Der Upload ist nicht in jedem Setup ohne Weiteres vorgesehen. Technisch lässt sich das über den MIME-Type-Filter lösen.
function us_add_svg_upload_support($mimes){
$mimes['svg'] = 'image/svg+xml';
return $mimes;
}
add_filter('upload_mimes', 'us_add_svg_upload_support');
Damit beginnt die Arbeit in vielen Projekten allerdings erst. In der Praxis geht es selten nur darum, eine SVG-Datei hochladen zu dürfen. Häufig müssen Grafiken farblich in ein Designsystem eingebunden, responsiv angepasst, bereinigt oder für bestimmte Komponenten umgebaut werden. Gerade exportierte Dateien aus Illustrator, Figma oder anderen Tools enthalten oft unnötige Attribute, verschachtelte Gruppen, fest eingetragene Maße oder Pfade, die für den späteren Einsatz im Frontend erst sinnvoll strukturiert werden müssen.
Genau an dieser Stelle entstehen viele Rückfragen. Logos sollen einfärbbar werden, Icons in verschiedenen Zuständen funktionieren, Grafiken auf Hover reagieren oder Animationen vorbereitet werden. Manchmal muss auch schlicht aufgeräumt werden, damit aus einer exportierten Datei überhaupt ein wartbares Stück Frontend wird.
Die passende Methode hängt weniger von der Technik als vom Einsatzzweck ab. Soll eine Grafik einfach nur dargestellt werden, ist img häufig ideal. Soll sie Teil eines lebendigen Interface-Systems werden, führt oft kein Weg an Inline-SVG vorbei. Für wiederkehrende Icons kann ein Sprite-System mit symbol und use sinnvoll sein, bei größeren Icon-Sets gern als externe, cachebare Datei.Dekorative Elemente gehören meist gut aufgehoben ins CSS. Und Sonderfälle wie object , picture oder Data URIs haben ihre Berechtigung dort, wo der konkrete Anwendungsfall sie tatsächlich verlangt.
Die Stärke von SVG liegt gerade darin, dass das Format so flexibel ist. Diese Flexibilität ist jedoch nur dann ein Vorteil, wenn sie bewusst genutzt wird. Wer jede Einbindungsart kennt, muss nicht alles einsetzen – aber kann für den jeweiligen Fall die richtige Entscheidung treffen.
SVG gehört zu den nützlichsten Formaten im modernen Web. Es ist scharf, skalierbar, oft ressourcenschonend und je nach Einbindung erstaunlich gut kontrollierbar. Die eigentliche Herausforderung liegt nicht in der Datei selbst, sondern in ihrer sinnvollen Verwendung: Wie soll sie eingebunden werden? Welche Teile müssen steuerbar sein? Welche Rolle spielt sie im Layout, im Designsystem oder in der Interaktion?
Genau dort beginnt aus unserer Sicht die eigentliche Arbeit. Denn SVG ist nicht bloß eine Grafik, sondern oft ein gestalterischer und technischer Baustein digitaler Oberflächen.