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>
<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>
<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
background-imageFü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.


Fallback für Inline-<svg>
<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>

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>

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>

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;
}

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.

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.
Umfassender Beitrag, gut geschrieben Amelia. =)
Obwohl es ein paar weitere Techniken gibt, die hier nicht behandelt werden, wollte ich nur etwas zum Fallback für den
<object>-Bereich anmerken.Ein
<img>innerhalb von<object>zu platzieren, verursacht doppelte Bildanfragen in SVG-fähigen Browsern. Um dies zu vermeiden, können Sie Folgendes tun:ODER sogar
ODER DIES
Wobei das zweite Inline-
<svg>auf derselben Hauptseite wie das eingebettete<object>platziert würde. Dies stellt sicher, dass SVG-fähige Browser sowohl das SVG als auch das Fallback-PNG nicht anfordern.Ich vergaß zu erwähnen, dass der Grund, warum die zweite Option funktioniert, darin besteht, dass Stile, die innerhalb eines Inline-
<svg>definiert sind, Elemente außerhalb dieses SVG beeinflussen können und können, einschließlich Elemente, die innerhalb anderer Inline-<svg>s auf derselben Seite definiert sind.Danke für die Warnung, Sara. Daran hatte ich nicht einmal gedacht, es zu testen - ich ging einfach davon aus, dass es für den Fallback gedacht war, also sollte es *einfach funktionieren*! Ich Narr.
Danke, Sir!
Ich entschuldige mich, Amelia. Danke, Ma'am!
Zuerst einmal ein großartiger Artikel! Es ist hilfreich, alle wichtigen Fallback-Techniken an einem Ort zu haben.
Ich finde jedoch, dass dieser Artikel einen Abschnitt "Brauchen Sie überhaupt einen Fallback?" benötigt. Wenn Sie nur moderne Browser anvisieren, die SVG unterstützen, oder wenn Sie eine mobile App entwickeln, die einen eingebetteten Browser verwendet, über den Sie die Kontrolle haben, benötigen Sie möglicherweise überhaupt keine Fallbacks.
Ich denke, der Leser (ich selbst) kann einfach hierherübergehen, aber dieser Artikel vermittelt auf den ersten Blick den Eindruck, dass irgendeine Form von Fallback *in Betracht gezogen werden muss*.
Danke Eric. Es gibt ein paar Erwähnungen von keinem Fallback als Option in den ersten beiden Abschnitten, entweder weil Ihre Zielgruppe sich auf diejenigen mit den neuesten Browsern konzentriert oder weil die Webseite auch ohne SVG Sinn ergibt. Ich nehme an, es hätte eindringlicher sein können. Der Punkt des Artikels war jedoch eher, Entwicklern zu helfen, die im Denken stecken: "SVG ist cool, aber ich kann es auf meinen großen kommerziellen Projekten nicht verwenden, weil wir IE8 unterstützen müssen".
Ein weiterer wichtiger Punkt wäre für Benutzer, bei denen Bilder deaktiviert sind (oder, auf irgendeine Weise, nur SVG deaktiviert ist), und sicherzustellen, dass Ihre Website auch ohne das Bild nutzbar bleibt. Dies ist definitiv ein größeres Problem, das auf einer ganzheitlichen Ebene angegangen werden sollte (und nicht nur Bilder betrifft), aber diese Techniken können in diesem Bereich helfen.
Ja, ich sehe diese Bezüge, und ich schätze, ich bin nur pingelig. :D
Ich persönlich liebe es, beruhigt zu sein, dass es Wege gibt, Fallbacks zu vermeiden, wenn man eine Art von Kontrolle darüber hat oder herstellen kann, welche Browser die Website/App sehen. Danke nochmals für den Artikel!
Ausgezeichneter Artikel… habe viel gelernt… Danke für das Teilen deines Wissens…
Tolle Sache, Amelia! Ich würde hinzufügen, dass, wenn jemand die
<object>-Syntax verwenden *würde*, man auch das neue<picture>-Element stattdessen in Betracht ziehen könnte. Sara (oben) hat eine großartige Abhandlung über diese Technik hier: http://sarasoueidan.com/blog/svg-picture/Der Kompromiss hierbei ist, dass man mit der Einbindung eines Polyfills (http://scottjehl.github.io/picturefill/) für Browser einverstanden sein müsste, die das neue
picture-Element noch nicht unterstützen.Nun, egal. Sieht so aus, als hätte ich übersehen, wo Sie diese Methode aufgenommen hatten. :thumbsup
Ich habe vielleicht eine mögliche Verbesserung für das Verstecken der textuellen Überbleibsel des Inline-SVG
http://codepen.io/Tigt/blog/inline-svg-fallback-without-javascript-take-2
Versteckt das SVG-Inhalt zugänglich in älteren Browsern
Kein Shiv erforderlich
Ermöglicht beliebige DOM-Fallbacks
Vermeidet den SVG + jQuery IE Bug
Ermöglicht die Verwendung von Links innerhalb des SVG-Inhalts (das Umschließen des gefälschten
<a>um die echten kann in älteren Browsern Probleme verursachen)Ermöglicht, dass das SVG
<foreignObject>enthältEs ist nicht schön, aber es funktioniert meiner Testung nach wunderbar.
Großartiger Ansatz, Tigt! Wie du sagst, dein Code ist vielleicht etwas komplizierter, aber er wird robuster sein für komplexere SVGs.
Ich hatte nicht daran gedacht, CSS-Namensräume als eine JavaScript-freie Methode zur Zielgruppenansprache für Ihre Stile auf modernen Browsern zu verwenden. Mein einziges Bedenken ist, dass ich mir nicht sicher bin, wann genau die Unterstützung für CSS-Namensräume im Verhältnis zur Unterstützung für Inline-SVG implementiert wurde (canIUse versagt hier). Es könnte einige Browserversionen geben, die SVG unterstützen, aber Ihre Namensraum-qualifizierten Stile nicht erkennen. Ich vermute jedoch, dass diese im modernen Web selten sein werden.
Ja, die einzige Kompatibilitätsinformation, die ich finden konnte, war auf MDN, aber von dort aus scheint es ziemlich sicher zu sein.
Toller Beitrag!
Ich denke, es ist auch wichtig zu überlegen: *Brauchen wir wirklich SVG-Unterstützung?* und das gegen die Zeit und Mühe abzuwägen, die für die Unterstützung erforderlich ist. Can I Use sagt, dass die Unterstützung für SVG weltweit bei etwa 94% liegt.
Ich arbeite an einem Projekt, das viele SVGs verwendet, auch interaktive. Wenn man sich die US-Unterstützung ansieht (diese Website liefert nur in die USA und die SVG-Unterstützung ist in den USA etwas höher als global) und die Analyse der Landingpage betrachtet, die seit Jahresbeginn online ist (die etwa 0,2% Browser ohne SVG-Unterstützung zeigen), haben wir beschlossen, keine Fallbacks für interaktive SVGs zu unterstützen, außer einer Art "Sie brauchen einen besseren Browser!"-Nachricht.
Für die etwa 10 Leute, die mit IE8 kommen, selbst wenn sie alles auf der Website gekauft hätten, würde das kaum die Kosten für die Entwicklung und Wartung des Fallbacks decken.
Manchmal ist die beste Option, es einfach "nicht zu unterstützen".
Aber für die Fälle, in denen Sie es doch tun wollen, ist dies eine großartige Anleitung, wie es geht!
Oh ja, ich habe früher das
<desc>-Element verwendet, um auch den Fallback zu speichern, aber es hat sich als nachteilig für Screenreader erwiesen und die HTML5-Spezifikation hat es untersagt, beliebige Markups darin zu verwenden. Schade, denn das wäre für seinen beabsichtigten Zweck nützlich gewesen.Können Sie erklären, was mit "nachteilig für Screenreader" gemeint ist? Hatten Sie Probleme bei der Verwendung von einfachem markiertem Text (wie im Beispiel) oder haben Sie versucht, komplexe Inhalte wie Bilder einzubetten?
Wenn ich die Spezifikation noch einmal überprüfe, ist es möglich, dass Screenreader
<desc>-Elemente nicht ankündigen, die nicht an oberster Stelle ihres Elternelements stehen. Ich schätze, ich müsste es testen!Ah, ja, das ist ein übler Vorbehalt bei
<title>und<desc>— sie müssen zuerst kommen, vor jeglichem Kindinhalt. Es war ein Leistungsproblem, als die Spezifikation geschrieben wurde; Browser wollten diese Elemente nicht durchsuchen müssen. Ich vermute, die Leistungsprobleme sind heute weniger relevant, aber selbst wenn wir diese Anforderung aus SVG 2 entfernen, werden Sie sie immer noch für die Abwärtskompatibilität benötigen.Ich werde das Beispiel korrigieren, um diese Struktur zu verwenden.
Wie wäre es mit dem alten Trick mit dem onError-Attribut?
Es ist da. (Chris Coyier hat es der Vollständigkeit halber hinzugefügt.) Im Abschnitt über das Ersetzen von SVG als
<img>.Ich würde dazu tendieren, eine einzige Funktion zu haben, die alle Ihre
<img>-Elemente findet und sie austauscht, anstatt den Code in einem Attribut für jedes einzelne schreiben zu müssen. Es ist auch wahrscheinlich etwas schneller (Vorbehalt: Ich habe es nicht getestet), den JS-Test zu verwenden, anstatt auf die SVG-Datei-Anfrage zu warten und bei alten Browsern einen Fehler zu verursachen.Hallo,
Wenn Sie
– Es Ihnen nichts ausmacht, "Browser" statt "Features" zu erkennen
– SVGs in Tags verwenden
Dann ist eine sehr einfache Methode, eine .htaccess (oder was auch immer Ihnen gefällt) zu verwenden, um alte Browser zur PNG-Version Ihres SVG umzuleiten.
Ja, ein serverseitiger Sniff-Test ist immer eine weitere Option, egal wie sehr er verpönt ist.
Ich möchte glauben, dass es höchst unwahrscheinlich ist, dass neue Browser auf den Markt kommen, die SVG *nicht* unterstützen, so dass der obige Code Sie wahrscheinlich nicht beeinträchtigen wird.
Toller Artikel. Ich habe gerade nach der "besten" Lösung für SVG-Fallbacks gesucht. Jetzt habe ich auch ein paar Alternativen. :) Ich liebe euch.
Für Inline-SVG mit Bildersetzung mache ich normalerweise Folgendes
if (!Modernizr.inlinesvg) {
$(‘#containing-div’).prepend(”);
}
Solange ich den xmlns-Link im SVG entfernt habe, ignoriert IE8 den SVG-Block, ohne die Seite zu stören, und lädt den .png-Fallback.
Das sollte sein
Ich wollte eine von Abhängigkeiten befreite Lösung, die in möglichst vielen Browsern für das Logo der Website funktioniert.
Bisher habe ich mich für
<object>mit Inline Base64 Data URI des SVG und innerhalb eines<div>mit einer Klasse zum Laden des PNG-Fallbacks entschieden. Das CSS dafür ist in einem Inline-<style>im Head gesetzt.Ich habe ein umschließendes
<div>mit role="img" und aria-label für Barrierefreiheit hinzugefügt.Ich habe Fallback-Optionen für ein Icon-System abgewogen, und das ist unglaublich hilfreich. Vielen Dank!
Ich war bereit, den
<image>-Trick zu verwenden, aber jetzt werde ich mir Tigts Pen ansehen, da ich eine JavaScript-freie Lösung möchte.Das Einzige, was ich gehofft hatte zu sehen, ist, welche Methode Sie persönlich bevorzugen. (Es scheint, als ob Chris "wild macht" ohne Fallback.)
Ich kann nicht sagen, dass ich eine persönliche Präferenz habe, da ich nicht viel in der Produktion arbeite – meine Hauptzielgruppe sind normalerweise Leute, die SVG lernen!
Allgemeiner gesagt, denke ich jedoch, dass es wirklich davon abhängt, was Sie kommunizieren möchten. Ich glaube nicht, dass Sie auf jedem Browser ein identisches Bild benötigen, aber Sie müssen die Botschaft vermitteln und sicherstellen, dass Ihre Website immer noch funktionsfähig ist (so gut wie möglich).
Daher reicht ein einfacherAlt-Text oft für Icons aus. Für komplexe Datenvisualisierungen empfehle ich aus vielen Gründen eine Text-/Tabellenversion der Daten, aber sie wird nicht alle Informationen eines gut gestalteten Diagramms vermitteln. Ich neige dazu, wenn möglich, auf JavaScript-freie Lösungen zurückzugreifen, daher wäre der
<image>-Trick mein nächster Anlaufpunkt. Und wahrscheinlich würde ich Tigts Ansatz verwenden, um den zusätzlichen Text zu verstecken.