Die Browserunterstützung für SVG ist nicht ganz einfach ein Ja oder Nein. Zusätzlich zu einigen Eigenheiten, wie sich diese Unterstützung auswirkt, hängt es davon ab, wie das SVG verwendet wird. Eine gängige Methode ist direkt in einem Bild-Tag, wie <img src="bild.svg" alt="beschreibung">.
Wie kann man erkennen, ob ein Browser die Verwendung von SVG auf diese Weise unterstützt?
Es ist eine Sache, einfach nur zu wissen, welche Browser das tun. Die einzigen wirklichen Gefahrenzonen sind IE 8- und Android 2.3. Man könnte User-Agent-Erkennung verwenden, und obwohl ich dem nicht zu wertend gegenüberstehen möchte, ist es generell eine schlechte Idee.
Ich habe mir SVGeezy angesehen, ein Mini-JavaScript-Plugin speziell zur Unterstützung von Fallbacks für SVG-als-img. Natürlich muss es dafür eine Feature-Erkennung durchführen. Im Quellcode ist es eine einfache Einzeilerzeile
supportsSvg: function() {
return document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Image", "1.1");
}
Ich hatte document.implementation.hasFeature noch nie zuvor gesehen, also habe ich mich ein wenig umgehört, da es für etwas, von dem ich noch nie gehört hatte, zu gut schien, um wahr zu sein. Die meiste Dokumentation da draußen ist ziemlich generisch und deutet auf eine großartige Browserunterstützung hin, was mich noch skeptischer macht.
Die Sache ist: es ist so gut wie nutzlos. Es gibt fast immer true für alles zurück. Außer, anscheinend, im Fall von SVG-als-img, wenn es richtig ist. Als Skeptiker habe ich einen Test erstellt, um zu sehen, ob das wirklich stimmt.
Das erste, was ich tat, war zu überprüfen, wie Modernizr es erkennt, als die Anlaufstelle für Feature-Erkennung. Wichtiger Hinweis hier: Der Standard-SVG-Test von Modernizr (Modernizr.svg) testet nicht die Unterstützung von SVG-als-img, sondern die Unterstützung von SVG als <object> oder <embed>. Seien Sie sich dessen bewusst, wenn Sie es für Fallbacks verwenden. Testen Sie das Richtige (sie haben Tests für alle Möglichkeiten, wie Sie SVG verwenden können).
Sie haben einen Test speziell für SVG-als-img, der so aussah
Modernizr.addAsyncTest(function () {
var img = new Image();
img.onerror = function () {
addTest('svgasimg', false);
};
img.onload = function () {
addTest('svgasimg', img.width == 1 && img.height == 1);
};
// 1px x 1px SVG; must be base64 or URI encoded for IE9... base64 is shorter
img.src = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==';
});
Dies erstellt ein neues Bildelement, injiziert eine Data-URI eines 1x1 SVG-Bildes und wartet dann entweder darauf, dass es fehlschlägt oder korrekt geladen wird.
Offensichtlich anders als der hasFeature-Test, also habe ich einen Pen erstellt, der die Ergebnisse beider Methoden zeigte. Dann habe ich es in allen möglichen verschiedenen Browsern getestet. Eine Mischung aus denen, die bekanntermaßen SVG-als-img unterstützen, und denen, die es nicht tun. In allen Fällen waren die Ergebnisse identisch. Seltsam, aber ziemlich cool!
Der ursprüngliche Modernizr-Test ist das, was sie einen "asynchronen" Test nennen, was bedeutet, dass er auf Callback-Funktionen angewiesen ist, um eine Antwort zu geben. Modernizr bevorzugt im Allgemeinen "synchrone" Tests, bei denen, sobald der Test definiert ist, er die richtige Antwort hat.
So ist es nach Besprechungen mit dem Modernizr-Team der Standardtest für SVG-als-img. Es ist noch nicht in einer Veröffentlichung enthalten, daher müssten Sie es vorerst einfach ausführen.
Modernizr.addTest('svgasimg', document.implementation.hasFeature('http://www.w3.org/TR/SVG11/feature#Image', '1.1'));
Ich werde diesen Beitrag (und die Version, die wir auf CodePen ausführen) aktualisieren, sobald er herauskommt.
Danke an Patrick Kettner für die Überwachung der Aufnahme in Modernizr, Stu Cox für das Feedback und die Zustimmung zur Ersetzung seiner ursprünglichen Methode, Ben Howdle dafür, dass er von dem coolen hasFeature() wusste und es in SVGeezy verwendete, und Mike Taylor für die Überprüfung seiner Nützlichkeit.
Oh, und wenn Sie erkennen, dass der Browser SVG-als-img nicht unterstützt, möchten Sie wahrscheinlich die src für ein unterstütztes Bildformat austauschen. Wahrscheinlich das-gleiche-bild.png, entweder automatisch basierend auf einer Namenskonvention oder selektiv basierend auf einem data-* Attribut.
Seitennotiz bezüglich "http://"
Lassen Sie sich nicht von dem unsicheren "http://" im beteiligten Parameter-String erschrecken. Es wird kein HTTP-Request gemacht, und es schadet einer HTTPS-Website nicht. Tatsächlich schadet es Ihnen, wenn Sie es ändern. Jim Coffey schreibt
Wenn Sie stattdessen 'https' angeben, werden die meisten Browser damit umgehen, aber IE wird den Test fehlschlagen.
Danke für den Beitrag dazu, Chris! Ich bin vor ein paar Wochen auf dasselbe Problem gestoßen. Wie Sie wahrscheinlich gesehen haben, berechnen SVGs in Safari 5.1 die Höhe wirklich hoch, sodass Sie super hohe SVG-Bilder erhalten.
Mein hacky Fix war, sich die Höhe anzusehen und wenn sie wirklich hoch war, auf png zurückzufallen.
Freut mich zu sehen, dass das in Modernizr kommt!
Ryan: Ich kann es nicht mit Sicherheit sagen, aber das Problem, das Sie sehen, könnte dasselbe sein wie dieses: https://twitter.com/zachleat/status/251446429418127360
Eine einfachere Abhilfe ist die Verwendung von max-height: 100%;
Ich habe genau die gleiche Erfahrung in Safari 5.1. Der max-height-Trick funktioniert bei mir nicht, obwohl das img (SVG-Container) etwas kürzer wird. Die Breite funktioniert gut.
Ich habe dieses jQuery-Plugin von Sidebar gefunden, es scheint sehr robust zu sein, ich dachte daran, es für meine eigene Website zu verwenden: http://svgmagic.bitlabs.nl/
Ja, das ist ziemlich praktisch, weil die Fallbacks für Sie erstellt werden, anstatt dass Sie sich selbst darum kümmern müssen. Aber es tut dies, indem es bei jedem Seitenaufruf eines nicht unterstützenden Browsers einen Ajax-Aufruf an seine Server macht, also seien Sie sich dessen bewusst.
Was es wert ist, diese Art von Feature-Test wird als "schwache Inferenz" bezeichnet. Der alte Feature-Test hatte seine Nachteile (er war asynchron und so weiter), aber er war robuster.
Ich habe das spezifisch angesprochen – aber das Team hielt es für lohnenswert, den Test synchron zu machen. Ich stimme zu, da hasFeature wahrscheinlich für immer true zurückgeben wird und Browser SVG auf diese Weise für immer unterstützen werden, wird es wahrscheinlich nie falsch sein.
Ich habe
document.implementation.hasFeatureletzte Woche zum ersten Mal entdeckt, als ich mir den Rafael.js Quellcode angesehen habe. Selbst wenn Sie Rafael nicht zur Erstellung von SVG verwenden, ist es eine unglaublich gute Referenz dafür, wie man SVG mit älteren Browsern verwendet.document.implementation.hasFeaturekam kürzlich auf mein Radar, als ich nach einer Umgehung des Problems suchte, dass Modernizr.touch in Chrome oder Firefox unter Windows 8 true zurückgibt, auch wenn kein Touchscreen auf dem Gerät vorhanden ist. Dieses Snippet scheint, soweit ich es testen konnte, ziemlich gut zu helfen, festzustellen, dass ein Gerät nur Touch-fähig istdocument.implementation && document.implementation.hasFeature('MouseEvent', '3.0')===falseIch habe noch ein Problem mit SVG-Logos.
Auf meinem Windows-PC funktioniert das SVG-Logo mit dem Safari-Browser einwandfrei, aber wenn ich es auf den Server hochlade, wird das SVG-Logo im Safari-Browser nicht geladen.
Hat jemand eine Lösung?....
Wenn Ihr Webserver Microsoft IIS verwendet, ist es möglich, dass ihm der MIME-Typ für eine SVG-Datei fehlt – http://www.iis.net/learn/manage/managing-your-configuration-settings/adding-ie-9-mime-types-to-iis
Seien Sie vorsichtig mit SVG-Bildern in HTML-E-Mails. Nachdem ich Tage damit verbracht hatte, meine E-Mail-Vorlagen in ein responsiveres, E-Mail-Client-zentriertes Format umzuwandeln und SVG-Bilder für mein Logo und meine Social-Media-Header-Bilder zu verwenden, scheint der Bildproxy von Gmail keine Pläne zu haben, SVG-Bilder zu unterstützen. Wenn jemand Informationen hat, die dem widersprechen, teilen Sie sie bitte mit.
http://stackoverflow.com/questions/20815613/svg-images-blocked-by-gmail-proxy?lq=1