SVG Fallbacks Guide

Avatar of Amelia Bellamy-Royds
Amelia Bellamy-Royds am

Wenn Sie SVG verwenden und sich Sorgen über nicht unterstützte Umgebungen machen, ist dies der Leitfaden für Sie. Es gibt keine Einheitslösung, da die Art und Weise, wie Sie SVG verwenden, den Fallback bestimmt.

Präsentiert von DigitalOcean

DigitalOcean bietet die Cloud-Computing-Dienste, die Sie benötigen, um Ihr Wachstum in jeder Phase zu unterstützen. Starten Sie mit einem kostenlosen Guthaben von 200 $!

Hier bei CSS-Tricks gibt es viele Informationen, die Ihnen sagen, wie wunderbar SVG ist. Und so sehr wir Sie auch davon überzeugen wollen, dass SVG für jedermann ist, SVG ist nicht so weit verbreitet, wie wir es uns wünschen würden. Tatsächlich verstehen manche Leute SVG immer noch nicht (buchstäblich).

Vielleicht sitzen sie an einem Bürocomputer, der seit dem Weggang des IT-Guys vor sechs Jahren nicht mehr aktualisiert wurde, vielleicht benutzen sie ein gebrauchtes generalüberholtes Handy, das sie sich nicht leisten können zu aktualisieren, oder vielleicht verstehen sie einfach nicht oder kümmern sich nicht darum, auf einen neuen Browser zu aktualisieren. Was auch immer der Grund ist, ungefähr 5 % der Webnutzer surfen mit Webbrowsern, die kein SVG anzeigen können – in den USA mehr (laut caniuse-Daten).

Einige technisch orientierte Websites (wie diese hier) können es sich leisten zu sagen, dass sie nur moderne Webbrowser unterstützen. Aber für die meisten Websites können Sie 1 von 20 potenziellen Kunden nicht ignorieren. Wenn Sie den 95 % der Nutzer auf modernen Browsern alle Vorteile von SVG bieten möchten, aber für die anderen immer noch eine funktionale Erfahrung bieten möchten, benötigen Sie einen Fallback-Plan.

Der Leitfaden wurde von Amelia Bellamy-Royds und mir, Chris Coyier, verfasst. Amelia und ich haben zusammen auf derselben Konferenz präsentiert. Wir haben beide SVG behandelt, aber keiner von uns SVG-Fallbacks umfassend. Es ist schließlich ein so riesiges Thema. Obwohl ich mich schon früher mit SVG-Fallbacks beschäftigt habe, ist das schon ein paar Jahre her und wir dachten, wir könnten diesem Thema jetzt besser gerecht werden. Los geht's!

WelCHE Art von Fallback benötigen Sie?

Bevor wir uns mit den technischen Optionen für die Implementierung von Fallbacks befassen, ist es hilfreich, innezuhalten und darüber nachzudenken, welche Art von Fallback Sie benötigen.

  • Kein Fallback. Wenn das SVG ein Icon ist, dessen Bedeutung durch eine Textbeschriftung klar ausgedrückt wird, können Sie dieses Icon möglicherweise verschwinden lassen, ohne die Funktionalität der Website zu beeinträchtigen.
  • Text-Fallback. Wenn das SVG ein Icon ist, dessen Bedeutung durch eine Textbeschriftung ausgedrückt werden *könnte*, ist vielleicht alles, was Sie brauchen, sicherzustellen, dass der Alt-Text an seiner Stelle angezeigt wird.
  • Bild-Fallback. Das ist es, was die meisten Leute als SVG-Fallback denken: ein PNG- oder GIF-Bild, das dieselbe Grafik darstellt, nur mit einer größeren Dateigröße und schlechteren Auflösung.
  • Interaktiver Fallback. Um animiertes und interaktives SVG zu ersetzen, reicht ein PNG möglicherweise nicht aus. Sie benötigen eine Grafiksprache mit einem interaktiven DOM.

Auf der interaktiven Seite sind Ihre Optionen begrenzt. Sie könnten das SVG in Flash konvertieren und dann Ihren gesamten Interaktionscode in ActionScript neu schreiben. Oder Sie könnten Raphaël verwenden, um die Grafik sowohl zu zeichnen als auch zu manipulieren. Es bietet eine einzige JavaScript-Schnittstelle sowohl für SVG als auch für die VML-Vektorgrafiken, die in Internet Explorer 6-8 unterstützt werden. Das bedeutet, dass Raphaël nicht bei alten mobilen Browsern hilft, aber es reduziert die Anzahl der nicht unterstützten Nutzer erheblich.

Der Rest dieses Beitrags behandelt die Möglichkeiten, Text- und Bild-Fallbacks für Ihr SVG zu erstellen. Ihre Optionen hängen fast vollständig davon ab, wie Sie dieses SVG überhaupt in die Webseite einfügen: als eingebettetes Objekt, als Inline-SVG-Code, als Bild im HTML oder als Bild im CSS.


Fallback für SVG als <img>

SVG kann wie folgt verwendet werden

<img src="image.svg" alt="">

Hier sind einige Optionen für Browser, die dies nicht unterstützen.

So testen Sie die Unterstützung

Obwohl dieser Test eigentlich dafür gedacht ist, das <image>-Element innerhalb von SVG zu testen, haben wir durch einige Tests bewiesen, dass es auch für SVG, das als Quelle für <img>-Elemente verwendet wird, funktioniert. Es ist *so einfach*.

function svgasimg() {
  return document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Image", "1.1");
}
Quellenaustausch

Der obige Test ist das, was die SVGeezy-Bibliothek für SVG-als-Img-Fallbacks verwendet. Wenn der Browser diesen Test nicht besteht, tauscht er bei Bedarf das SVG gegen ein PNG aus. Zum Beispiel wird aus <img src="image.svg"> dann <img src="image.png">. Sie erstellen die PNG-Versionen selbst und halten sie im selben Verzeichnis bereit.

  • Vorteile: Es ist einfach. Es funktioniert. Sie können sogar ziemlich einfach Ihr eigenes Quellenaustausch-JavaScript schreiben.
  • Nachteile: Es ist wahrscheinlich, dass die nicht unterstützenden Browser zwei Bilder herunterladen, was eine Leistungsstrafe darstellt. Sie laden die SVG-Version herunter (zumindest genug, um zu wissen, dass sie sie nicht verwenden kann) und dann die PNG-Version.

Hier ist ein sehr einfaches Beispiel für den Quellenaustausch ohne Abhängigkeiten

Austauschen eines Fallback-Bildes in Internet Explorer 6 (!)

Wenn Sie das aus irgendeinem Grund nicht in externes JavaScript bekommen und es Inline machen müssten...

<img src="image.svg" onerror="this.src='image.png'; this.onerror=null;">

Wenn Sie Feature-Detects mit Modernizr durchführen und gleichzeitig jQuery in einem Projekt verwenden würden, könnte es so einfach sein:

if (!Modernizr.svg) {
  $("img[src$='.svg']")
    .attr("src", fallback);
}

SVGInjector ist eine JavaScript-Bibliothek, die in bestimmten Szenarien bei <img>-Fallbacks helfen kann. Ihr Hauptzweck ist es, <img> durch Inline-SVG zu ersetzen.

<img class="inject-me" src="image-one.svg">
var mySVGsToInject = document.querySelectorAll('img.inject-me');
var injectorOptions = {
  pngFallback: 'assets/png'
};
SVGInjector(mySVGsToInject, injectorOptions);

SVGMagic ist eine weitere JavaScript-Bibliothek, die Quellen durch PNG-Versionen ersetzt, einschließlich SVG, das in <img>, background-image oder sogar Inline verwendet wird. Ihr größter Vorteil ist, dass sie die PNG-Version automatisch für Sie erstellt, durch eine Anfrage an einen Drittanbieter-Server. Seien Sie sich also der Abhängigkeiten (jQuery und Drittanbieter) bewusst und testen Sie Geschwindigkeit und Zuverlässigkeit.

Das <picture>-Element

Das <picture>-Element ermöglicht Fallback-Bilder, wenn der Browser ein angegebenes Bildformat nicht unterstützt.

<picture>
  <source type="image/svg+xml" srcset="image.svg">
  <img src="image.png" alt="">
</picture>

Leider ist das nicht sehr nützlich, wenn die Unterstützung für SVG viel besser ist als die Unterstützung für <picture>.

Sie können das Picture-Element jedoch mit Picturefill polyfillen. Sara Soueidan hat einen Artikel, der dies behandelt.

  • Vorteile: Sie können nicht nur Fallback-Bilder erhalten, sondern auch *unterschiedliche* Fallbacks für verschiedene Media Queries angeben, als Teil der Picture-Syntax. Das bedeutet unterschiedlich dimensionierte Fallbacks für verschiedene Bildschirme, Art-Direction usw.
  • Nachteile: Polyfill benötigt. Um doppelte Downloads zu vermeiden, müssen Sie den src des <img> innerhalb von <picture> weglassen, was ungültig ist und bedeutet, dass Sie den Polyfill für immer benötigen werden.
Der <image>-Trick

Mit etwas Inline-SVG-Trickery können wir das schaffen.

<svg width="96" height="96">
  <image xlink:href="image.svg" src="image.png" width="96" height="96" />
</svg>

Stellen Sie sicher, dass Sie dem Bild Größenattribute hinzufügen, damit es das gesamte SVG ausfüllt, und passen Sie dann sowohl svg (für moderne Browser) als auch image (für alte) in Ihrem CSS an.

Abgesehen von einigen älteren Browsern, die SVG-Bilder, aber kein Inline-SVG unterstützen, besteht die Haupteinschränkung hier darin, dass es viel mehr Arbeit erfordert, die Bilder in einer flüssigen Website korrekt anzuzeigen. Sie müssen die gleichen Tricks anwenden, um ein SVG auf ein konsistentes Seitenverhältnis zu skalieren, anstatt nur width: 100%; einzustellen und die Höhe automatisch anpassen zu lassen.

  • Vorteile: Erfordert kein JavaScript oder andere Abhängigkeiten.
  • Nachteile: Löst mehrere (abgebrochene) Anfragen in IE aus. Ältere iOS-Versionen können Fallbacks anzeigen, obwohl SVG unterstützt wird. Tests.

Fallback für SVG als <object>

Da Inline-SVG immer besser unterstützt wird, ist SVG als <object> aus der Mode gekommen. Das ist aus Sicht der progressiven Verbesserung/graceful Degradation bedauerlich, denn dies ist der einfachste Weg, Fallback-Inhalte bereitzustellen.

Der Kindinhalt des <object>-Elements wird angezeigt, wenn das Objekt selbst nicht angezeigt werden kann. Dieser Inhalt kann *jeder* HTML-Inhalt sein: Bilder, formatierter Text, sogar ein weiteres Objekt (z. B. eines, das eine Flash-Version Ihres animierten SVG enthält).

<object type="image/svg+xml" data="svg-ok.svg">
  <img src="svg-no.png" alt="No SVG support">
</object>
<object type="image/svg+xml" data="svg-ok.svg">
  <p class="warning">
    Your browser does not support SVG!
  </p>
</object>

Sehen Sie einen einfachen Test hierfür.

Ein weiterer Vorteil von <object> für die progressive Verbesserung: Einige Benutzer von Internet Explorer 8 (und älter) können das SVG sehen! Objekte lösen Plugins aus, und das nicht mehr aktualisierte Adobe SVG Viewer Plugin ist immer noch zum Download für alte IE-Versionen verfügbar.

Fallback für SVG als CSS background-image

Für die meisten CSS-Eigenschaften können Sie sich auf die CSS-Fehlerbehandlung verlassen, um den Browser dazu zu bringen, eine neue Syntax zu ignorieren und einen zuvor in der Kaskade deklarierten Wert anzuwenden. Die *Syntax* einer CSS-Regel, die eine SVG-Bilddatei verwendet, ist jedoch für ältere Browser perfekt korrekt. Sie wenden die Regel an, laden die Datei herunter, wissen aber dann nicht, was sie damit machen sollen.

Der Trick hierbei ist, eine Syntax zu finden, die von (fast allen) Browsern, die SVG unterstützen, aber nicht von älteren Browsern, unterstützt wird. Hier ist die Magie:

body {
  background: url(fallback.png);
  background: url(background.svg),
    linear-gradient(transparent, transparent);
}

Dies kombiniert zwei Features, die zusammen die perfekte Kombination ergeben. Wenn ein Browser sowohl mehrere Hintergründe als auch lineare Farbverläufe unterstützt, unterstützt er auch SVG. Hier deklarieren wir das SVG mit einem vollständig transparenten linearen Farbverlauf. Wenn dies in einem älteren Browser fehlschlägt, greift der oben deklarierte Fallback.

Sie könnten einen *leichten* Leistungsnachteil für moderne Browser haben, da der transparente Farbverlauf berechnet werden muss, aber er ist wahrscheinlich vernachlässigbar.

Ersetzende Hintergrundbilder im Internet Explorer 7
Ersetzende Hintergrundbilder in Android 2.2

Fallback für Inline-<svg>

Inline-SVG ist aus vielen Gründen beliebt. Der gesamte Code zum Zeichnen dessen, was gezeichnet werden muss, befindet sich entweder direkt im Markup (reduziert Anfragen) oder wird aus einer Datei referenziert, die zwischengespeichert werden kann. Sie haben viel Kontrolle über Inline-SVG. Es befindet sich im DOM, sodass es mit CSS und JavaScript vom selben Dokument aus gesteuert werden kann.

So testen Sie die Unterstützung

Es gibt einige großartige Tests von Modernizr, die wir uns ansehen können. Ihre beste Wahl für Inline-SVG, extrahiert in eine Funktion, ist diese:

function supportsSvg() {
  var div = document.createElement('div');
  div.innerHTML = '<svg/>';
  return (div.firstChild && div.firstChild.namespaceURI) == 'http://www.w3.org/2000/svg';
};

Dies testet, ob der HTML-Parser (der zum Parsen von an innerHTML gesendeten Inhalten verwendet wird) korrekt ein SVG-Element generieren kann, indem er im Grunde ein Element erstellt, SVG injiziert und den Namespace testet.

Wie bei <object> wird ein Browser, der <svg> nicht erkennt, einfach Ihr SVG-Markup ignorieren und dessen Inhalt als HTML behandeln. Aber so einfach ist das nicht. Bei <object> wissen Browser, die das Objekt *unterstützen*, dass sie den Kindinhalt ignorieren sollen. Bei Inline-SVG gibt es keine solche integrierte Fallback-Lösung. Es gibt jedoch ein paar Workarounds, die Sie verwenden können.

Reiner Text-Fallback innerhalb von Inline-SVG

Sie *können* reinen Text in Ihren Inline-SVG-Code einfügen, und er wird von jedem Browser, der SVG unterstützt, ignoriert, da SVG-Text in einem <text>-Element enthalten sein muss. Sie können sogar Hyperlinks innerhalb dieses Textes einfügen.

<svg viewBox="-20 -20 40 40">

  <!--Text Fallback-->
  I'm sorry, your browser does not support

  <circle fill="limegreen" r="19" />
  <path stroke="forestgreen" fill="none" stroke-width="6"
        d="M-12,3 L-3,10 11,-12" />
  <text dy="0.35em" text-anchor="middle" font-weight="bold"
        font-size="18px" font-family="sans-serif"
        fill="indigo">SVG</text>

  <!--Fallback with links-->
  Please upgrade to a <a href="http://browsehappy.com/?locale=en">modern browser</a>.

</svg>
Reiner Text-Fallback, wie er in Android 2.3 angezeigt wird

Zu beachtende Punkte

  • Der SVG-Text (das Wort "SVG" in dieser Demo) wird Teil des Fallback-Textes. Wir werden gleich besprechen, wie man das vermeidet.
  • Der SVG-<title>-Text wird nicht Teil des Fallback-Textes. Das liegt daran, dass Browser ohne SVG dies als ungültiges zweites HTML-Titels-Element interpretieren und es ignorieren.

Sie können keine anderen HTML-Inhalte innerhalb von Inline-SVG einfügen: Wenn der HTML-Parser in einem modernen Browser auf ein HTML-Tag stößt, geht er davon aus, dass Sie vergessen haben, Ihr <svg>-Tag zu schließen, und schließt es für Sie. Das bedeutet, (a) Ihr SVG ist beschädigt und (b) Ihr Fallback-Text ist in modernen Browsern sichtbar. Der einzige Grund, warum Sie Links (<a>-Tags) verwenden können, ist, dass sie gültige Tags in SVG sind, aber nichts selbst zeichnen.


Ein weiterer Ansatz hier wäre, mit HTML-Text zu beginnen und diesen durch Inline-SVG zu ersetzen, sobald Sie mit JavaScript erkennen, dass er unterstützt wird. Stellen Sie sich einen "Like"-Button in HTML vor:

<button aria-label="Like">
  <span class="inline-svg" data-xlink="#icon-heart">♥</span> Like
</button>

Der Span mit dem ♥ ist dort der Fallback. Das data-Attribut ist das, was wir für einen Fallback verwenden werden, in diesem Fall ein <svg>/<use>-Element.

if (supportsSvg()) { // see test above
  var inlineSvgs = document.querySelectorAll('span.inline-svg');

  for(i = 0; i < inlineSvgs.length; i++) {
    var span = inlineSvgs[i];
    var svgns = "http://www.w3.org/2000/svg";
    var xlinkns = "http://www.w3.org/1999/xlink";
    var svg = document.createElementNS(svgns, "svg");
    var use = document.createElementNS(svgns, "use");

    // Prepare the <use> element
    use.setAttributeNS(xlinkns, 'xlink:href', span.getAttribute('data-xlink') );

    // Append it
    svg.appendChild(use);

    // Prepare the SVG
    svg.setAttribute('class', "inline-svg");

    // Set a title if necessary.
    if (span.getAttribute('title')) {
      svg.setAttribute('title', span.getAttribute('title'));
    }

    // Inject the SVG
    span.parentNode.insertBefore(svg, span);

    // Remove fallback
    span.remove();
  }
}
HTML-formatierter Text-Fallback innerhalb von Inline-SVG

Sie *können* HTML-Textformatierungsmarkups verwenden, ohne das SVG zu ruinieren, indem Sie sie innerhalb von SVG-<desc> (Description)-Tags einfügen, die Inhalte aus anderen Namespaces zulassen.

<svg viewBox="-20 -20 40 40">

  <desc>
    <p class="warning">
        Fallback text.
    </p>
  </desc>

  <!-- ... SVG content ... -->

</svg>
Formatierter Text-Fallback, wie er in Internet Explorer 8 angezeigt wird

Zu beachtende Punkte

  • Der Hauptzweck des <desc>-Tags ist die Bereitstellung einer alternativen Textbeschreibung. Stellen Sie sicher, dass der Inhalt des Tags für einen Screenreader sinnvoll ist.
  • Damit <desc> von Barrierefreiheits-Technologien in allen Browsern erkannt wird, sollte es am Anfang des SVG stehen, direkt nach dem <title>.
  • Sie *sollten* auch ein SVG-<metadata>-Tag verwenden können, um beliebige beliebige Markup-Elemente einzufügen, ohne das SVG oder seinen Alternativtext zu beeinträchtigen. Dies funktioniert jedoch nicht in den getesteten Browsern (sie fügen implizite </svg>-End-Tags ein).
  • Der SVG-Textinhalt wird immer noch in den Fallback-Text aufgenommen.

Sie *könnten* sogar ein <img>-Tag mit einem Fallback-Bild innerhalb des <desc> einfügen, und es würde in den alten Browsern korrekt angezeigt, ohne Ihr SVG in den neuen Browsern zu beeinträchtigen. **Tun Sie das nicht!** Obwohl moderne Browser das Fallback-Bild nicht *anzeigen*, laden sie es *herunter*, und wir versuchen immer, doppelte Downloads zu vermeiden.

background-image-Fallback für Inline-SVG

Eine Möglichkeit für einen Inline-<svg>-Fallback ist das Setzen eines Hintergrundbildes, das nur verwendet wird, wenn der Browser Inline-<svg> nicht unterstützt. Verwenden Sie also den obigen Test, um sich eine Klasse für die Arbeit zu geben:

if (!supportsSvg()) {
  document.documentElemement.classList.add("no-svg");
  <em>// or even .className += " no-svg"; for deeper support</em>
}

Sagen wir, Sie verwenden Inline-SVG wie diese:

<button>
  <svg class="icon icon-key">
    <use xlink:href="#icon-key"></use>
  </svg>
  Sign In
</button>

Sie könnten diese neue Klasse verwenden, um bei Bedarf ein Hintergrundbild anzuwenden:

html.no-svg .icon-key {
  background: url(fallback-key.png) no-repeat;
}

Demo

Sie müssen das PNG selbst erstellen und dimensionieren. Hier gibt es einen Leitfaden auf CSS-Tricks zur Verwendung von Grunticon, um all dies zu automatisieren.

Für die tiefste mögliche Unterstützung würden Sie den <svg> in einen <div> einwickeln und den Hintergrund darauf anwenden, so dass auch wenn der Browser das SVG-Element vollständig ablehnt, der Fallback auf dem bekannten <div>-Element weiterhin funktioniert.

<img>-Fallback innerhalb von Inline-SVG

Dies haben wir oben im Abschnitt "Der <image>-Trick" für Inline-<img>-Fallbacks behandelt, aber da dies wirklich Inline-SVG verwendet, behandeln wir es hier detaillierter. Um ein Bild-Fallback in SVG ohne zusätzliche Downloads zu erhalten, benötigen Sie eine Möglichkeit, ein Bild einzufügen:

  • Das alte Browser als gültiges HTML erkennen
  • Das der HTML5-Parser innerhalb von <svg> zulässt
  • Das moderne Browser *nicht* als herunterzuladendes Bild interpretieren.

So seltsam es auch erscheinen mag, das SVG-<image>-Element erfüllt diesen Zweck. Das SVG-<image>-Element wird verwendet, um andere Bilddateien *innerhalb* von SVG einzubetten. Innerhalb von HTML erkennt jedoch jeder getestete Browser <image> als nicht standardmäßiges Synonym für <img>. In SVG geben Sie die URL der Bilddatei mit dem Attribut xlink:href an. In HTML geben Sie sie mit dem Attribut src an.

In den meisten Browsern reicht es daher aus, ein <image>-Tag mit einem src-Attribut (das auf Ihr Fallback-Bild zeigt) innerhalb Ihres Inline-SVG einzufügen: Die alten Browser laden das Fallback herunter, die neuen Browser nicht. *Außer* bei Internet Explorer, der das Fallback-Bild auch dann herunterlädt, wenn er es nicht anzeigt. Die Lösung besteht darin, dem Element ein leeres xlink:href-Attribut zu geben. Die IE-Entwicklertools zeigen immer noch an, dass es das Fallback *anfordert*, aber es wird fast sofort abgebrochen (<1ms im IE11 oder im Emulationsmodus IE10/IE9), bevor etwas heruntergeladen wird. Es sieht so aus:

<svg viewBox="-20 -20 40 40">
  <!-- SVG code snipped -->
  <image src="fallback.png" xlink:href="" />
</svg>
Bild-Fallback, wie er in Internet Explorer 8 angezeigt wird

Nun zur Lösung des letzten Fallback-Problems: des Textes aus dem SVG, der auf den Bildschirm ausgegeben wird. Das ruiniert unsere perfekte Bild-Fallback-Ersetzung irgendwie. Wir können CSS verwenden, um das zu beheben, aber es ist nicht einfach. Wir können kein einfaches svg text { display: none; } verwenden, weil das die SVG-Grafik ruinieren würde. Sie könnten die Erkennungs-JavaScript verwenden, um Klassen zu setzen, die den Text entsprechend ein- oder ausblenden. Aber selbst dann werden Sie durch IE8s nicht standardmäßige Herangehensweise an nicht erkannte Tags ausgebremst: Sie werden immer als leere Void-Tags ohne Kindinhalt behandelt. Sie müssen den Code HTML5 Shiv anpassen, um alle SVG-Tags einzuschließen, wenn Sie sie als stilbare Container behandeln möchten.

Eine JavaScript-freie Option ist, Ihren gesamten SVG-Grafikcode (außer dem Fallback-<image>) in ein <a>-Element zu verpacken. Ohne Hyperlink-Ziel verhält sich ein <a>-Element in SVG genau wie ein <g>-Gruppierungselement, sodass Ihr SVG-Code keinen Schaden nimmt. Und da IE8 <a> als gültiges Containerelement erkennt, werden alle darauf angewendeten Stile auf den gesamten Text darin angewendet.

Der Trick besteht also darin, Stile anzuwenden, die den Inhalt eines HTML-Links ausblenden, aber keine Auswirkung auf eine SVG-Gruppe haben. Absolute Positionierung und überlaufende Elemente machen den Trick:

.hide-on-fallback {
  display: block;
  position: absolute;
  left: -100%;
  height: 0;
  width: 0;
  overflow: hidden;
}
Bild-Fallback, ohne stray text, in Internet Explorer 8.

SVG for Everybody ist ebenfalls eine JavaScript-Bibliothek für Inline-SVG-Fallbacks. Ihr Ansatz ist es, mit dem modernstmöglichen Inline-SVG zu beginnen: Inline-SVG, das über <use> referenziert wird und auf Symbole verweist, die in einer externen Datei definiert sind.

<svg role="img" title="CodePen">
  <use xlink:href="spritemap.svg#codepen"></use>
</svg>

Wenn dies unterstützt wird, tut es nichts. Im Fall von IE lädt es die Spritemap per Ajax nach und fügt sie ein, wodurch sie im modernen IE funktioniert, wo dies normalerweise nicht funktioniert. Im Fall von nicht-SVG-unterstützenden Browsern hilft es Ihnen, ein PNG einzufügen.

Der einzige Nachteil ist, dass der UA-Test, den es durchführt, nicht sehr genau ist. Sie können wahrscheinlich besser das SVG per Ajax abrufen und es ständig einfügen, was für gute Unterstützung und Browser-Caching sorgt.


Dinge über Icon-Systeme

Der Sinn eines Icon-Systems ist, dass es Icons effizient und einfach zu verwenden macht. SVG ist ein großartiges Icon-System. Sie möchten wahrscheinlich, dass der Fallback für Ihr Icon-System weiterhin sowohl effizient als auch einfach zu bedienen ist. Das bedeutet, dass der <image>-Trick ein ziemlich schlechter Fallback wäre. Es kompliziert das Markup und bedeutet, dass jedes einzelne Icon eine separate Anfrage ist.

Wahrscheinlich möchten Sie einen Fallback für ein Icon-System mit einer dieser Methoden angehen:

  • Verwenden Sie Hintergrundbilder als Fallbacks, aber lassen Sie sie ein CSS-Sprite sein, so dass es immer noch nur eine Anfrage ist.
  • Verwenden Sie eine Icon-Schriftart für einen Fallback. Sie benötigen ein leeres Element (empfohlenes Markup), aber @font-face funktioniert viel weiter zurück als SVG, daher kann es ein guter Fallback sein.
  • Verwenden Sie Grunticon, das mit einem leeren Element beginnt und progressiv zu SVG verbessert und Fallbacks (durch einen JavaScript-Test) behandelt. Sie können Grunticon auch verwenden, während Sie immer noch mit Inline-SVG beginnen, wenn Sie möchten, wie in diesem Tutorial detailliert beschrieben.

Normalerweise erfordern alle diese Fallbacks etwas JavaScript, um zu funktionieren. Wenn Sie ein SVG-Icon-System-Fallback ohne JavaScript (das unter Android 2.2/2.3 funktioniert) als Ziel haben, hier ist ein Weg.

Dies erfordert etwas zusätzlichen Markup (das <a> zusätzlich zum <use>).

<svg class="icon">
  <a class="svg-status"></a>
  <use xlink:href="#svg-status" />
</svg>

Dann in CSS

.icon a, .icon + a {
  /* styles for every icon */
}
.icon .svg-status,
.icon + .svg-status {
  /* styles for this particular icon */
}

Der erste Selektor ist für Android, der zweite für IE. Der Geschwisterselektor ist, weil alte IE ein nicht erkannten Element nicht als Container behandeln.

Hintergrundbild auf einem Anker innerhalb eines SVG, in Internet Explorer 7

Wenn Sie das zusätzliche Anker-Element nicht mögen und es Ihnen nichts ausmacht, den Fallback zu verlieren, wenn JavaScript deaktiviert ist, ist eine weitere Strategie, JavaScript zu verwenden, um ein Element () einzufügen, das sowohl alte Android- als auch alte IE-Browser stylen können.

Das Skript testet die Unterstützung für Inline-SVG, indem es prüft, ob die Elemente mit dem Tag-Namen "use" die ownerSVGElement-Eigenschaft haben. Verwenden Sie Ihre Icon-id-Werte (aus dem xlink:href-Attribut des <use>-Elements) als Klassennamen für die neuen Spans, sodass kein zusätzlicher Markup erforderlich ist.

Fazit

Sie können definitiv Fallbacks für SVG erstellen.