Es gibt eine sehr clevere Technik von Alexey Ten, um einen Bild-Fallback für SVG bereitzustellen, die kürzlich im Internet die Runde macht. Sie tut genau das, was Sie in klassischen Browsern ohne SVG-Unterstützung wie IE 8 und älter sowie Android 2.3 wollen. Wenn wir etwas genauer hinschauen, finden wir einige ziemlich interessante Dinge, darunter ein unerwartetes Verhalten, das ein kleiner Wermutstropfen ist.
Alexeys Technik sieht so aus
<svg width="96" height="96">
<image xlink:href="svg.svg" src="svg.png" width="96" height="96" />
</svg>
Die Idee basierte auf Jake Archibalds Wiederholung der Tatsache, dass Browser das <image>-Tag wie ein <img>-Tag rendern. Es ist nur ein seltsamer Alias aus alten Zeiten, der ausgenutzt werden kann.
Was angezeigt wird
Die Technik ist in Bezug auf das, was unterstützende und nicht unterstützende Browser anzeigen, ziemlich nah an perfekt. IE 8, der SVG nicht unterstützt, zeigt das Fallback-PNG an. Android 2.3, die gleiche Geschichte.
Was mich verwirrte, waren iOS 3 und 4. Der native Browser auf diesen Betriebssystemen unterstützt SVG in Form von <img src="*.svg"> oder als CSS background-image. Aber bei dieser Technik wird das PNG anstelle des SVG angezeigt. Das Problem ist, dass iOS 3 & 4 kein „Inline“-SVG unterstützt (z. B. die Verwendung von SVG mit einem <svg>-Tag direkt im HTML) (Support-Chart). SVG-Unterstützung ist nicht einfach Ja oder Nein. Es hängt davon ab, wie es verwendet wird.
Der Punkt: Es ist seltsam zu sehen, dass <img> in diesen Fällen funktioniert und <image> nicht. Und da diese Browser SVG unterstützen, ist es schade, es nicht zu nutzen.
Was heruntergeladen wird
Natürlich interessiert uns auch, was heruntergeladen wird, denn das wirkt sich auf die Seitenleistung aus. Auch hier hauptsächlich gute Nachrichten. Moderne Browser wie Chrome laden nur das SVG herunter. Android 2.3 lädt nur das PNG herunter.
Aber wir stoßen auf ein Problem mit Internet Explorer Versionen 9, 10 und 11 (zu diesem Zeitpunkt eine Vorschau). In IE 9 können Sie sehen, wie beide Bilder in der Netzwerk-Timeline auftauchen.

Das PNG endet mit dem Ergebnis "Aborted" und wird als 0 B empfangen aufgeführt, beeinflusst aber dennoch die Download-Zeit.
In IE 10 ist es eine ähnliche Geschichte, es scheint einfach schneller abzubrechen und ohne viel Ausfallzeit zum SVG überzugehen.

Scott Jehl schlug vor, Charles Proxy zu verwenden, um genauer zu testen, was heruntergeladen wird. Charles bestätigt, dass das PNG angefordert wird.

Die Größe des Antwortkörpers beträgt tatsächlich 0 B, sodass der Abbruch schnell genug erfolgt, dass nicht viele Daten übertragen werden. Obwohl die kombinierte Anfrage und Antwort-Header 782 B beträgt und es ~300 ms dauert. Wie Yoav Weiss bemerkte, kann das Problem schlimmer sein, wenn blockierende Skripte oben auf der Seite stehen.
Beachten Sie auch, dass die Verwendung eines Proxys die heruntergeladenen und nicht heruntergeladenen Elemente beeinflussen kann, wie Steve Souders in diesem Artikel von Jason Grigsby über Charles Proxy darlegt.
Forschungen von Andy Davies legen nahe, dass die PNG-Anfrage in IE 11 unter Windows 7 überhaupt nicht abgebrochen wird.
@stopsatgreen @jaffathecake @chriscoyier In meinem IE11 / Win7 wird die Antwort nicht abgebrochen und erscheint in den Entwicklertools und pcap pic.twitter.com/ypitwTYAAH
— Andy Davies (@andydavies) 19. August 2013
Ergebnisse
Ich habe die Anzeigetests aus diesem Pen durchgeführt, aber die Download-Tests habe ich mit nur einer der Techniken auf der Seite und unter Verwendung von Debug View durchgeführt, sodass nichts anderes auf der Seite war als die reine Technik.
Sehen Sie sich den Pen SVG Tests von Chris Coyier (@chriscoyier) auf CodePen an
Also, Fallbacks
Alexey Tens Technik ist immer noch clever, und wenn das iOS-Anzeigeproblem und das IE-Downloadproblem für Sie akzeptabel sind, ist sie immer noch nutzbar. Hier sind einige weitere Fallback-Techniken, die davon abhängen, wie Sie SVG verwenden.
Wenn Sie SVG als Hintergrundbild verwenden...
Modernizr hat einen SVG-Test. Sie könnten also einen Fallback mit den Klassennamen deklarieren, die es dem HTML-Element hinzufügt.
.my-element {
background-image: url(image.svg);
}
.no-svg .my-element {
background-image: url(image.png);
}
Das sollte keine Doppel-Download-Probleme verursachen, aber es hat keine Modernizr-Abhängigkeit.
Eine sehr clevere Technik ohne jegliche Abhängigkeit ist die Verwendung eines kleinen CSS-Tricks mit mehreren Hintergründen und alten linearen Gradienten.
.my-element {
background-image: url(fallback.png);
background-image:
linear-gradient(transparent, transparent),
url(image.svg);
}
Es gab eine Technik, die nur mehrere Hintergründe verwendete. Aber das hat nicht ganz funktioniert, weil Android 2.3 das unterstützte, aber nicht SVG, und somit kaputt ging. Dies kombiniert alte Gradienten mit mehreren Hintergründen, sodass es überall funktioniert. Referenz.
Wenn beide Dinge unterstützt werden, verwendet der Browser die zweite Deklaration (mit SVG), andernfalls wird auf die erste Deklaration (mit PNG) zurückgegriffen.
Wenn Sie SVG als Inline-<svg> verwenden...
David Ensinger postete eine Technik, die das <foreignObject>-Tag in <svg> verwendet. Das Problem dabei ist jedoch, dass der Fallback immer geladen wird, was zu einem doppelten Download führt, anstatt nur manchmal wie bei der <image>-Technik.
Das wird etwas kompliziert, aber Artur A postete diese Idee, die den doppelten Download zu lösen und überall zu funktionieren scheint
<!DOCTYPE html>
<html>
<head>
<title>HTML5 SVG demo</title>
<style>
.nicolas_cage {
background: url('nicolas_cage.jpg');
width: 20px;
height: 15px;
}
.fallback {
}
</style>
</head>
<body>
<svg xmlns="http://www.w3.org/2000/svg" width="0" height="0">
<style>
<![CDATA[
.fallback { background: none; background-image: none; display: none; }
>
</style>
</svg>
<!-- inline svg -->
<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40">
<switch>
<circle cx="20" cy="20" r="18" stroke="grey" stroke-width="2" fill="#99FF66" />
<foreignObject>
<div class="nicolas_cage fallback"></div>
</foreignObject>
</switch>
</svg>
<!-- external svg -->
<object type="image/svg+xml" data="circle_orange.svg">
<div class="nicolas_cage fallback"></div>
</object>
</body>
</html>
Alternativ könnten Sie etwas tun wie
<svg> ... inline SVG stuff ... </svg>
<div class="my-svg-alternate"></div>
Verwenden Sie dann erneut den Modernizr SVG-Test, um die Support-HTML-Klasse zu erhalten, und dann...
.my-svg-alternate {
display: none;
}
.no-svg .my-svg-alternate {
display: block;
width: 100px;
height: 100px;
background-image: url(image.png);
}
Oder umschließen Sie das SVG in diesem div, damit das div für eine konsistente Größenanpassung verwendet werden kann.
Wenn Sie Inline-SVG verwenden, ist die Wahrscheinlichkeit groß, dass Sie dies mit <use> tun. In diesem Fall leistet das Skript svg3everybody ziemlich gute Arbeit. Wenn SVG auf die von Ihnen verwendete Weise unterstützt wird, funktioniert es einfach. Wenn es in IE (was nicht funktioniert) extern referenziert wird, sorgt es dafür, dass es per Ajax geladen wird. Wenn es überhaupt nicht funktioniert, gibt es eine Syntax, mit der Sie eine PNG-Fallback angeben können.
Wenn Sie SVG als <object> verwenden...
Sie könnten das object-Tag selbst als Element zum Stylen nach dem Modernizr-Test verwenden.
<object type="image/svg+xml" data="image.svg" class="logo"></object>
.no-svg .logo {
display: block;
width: 100px;
height: 100px;
background-image: url(image.png);
}
Wenn Sie SVG als <img> verwenden...
Es gibt eine Technik, bei der eine fehlerhafte SVG-Datei im laufenden Betrieb ausgetauscht werden kann.
<img src="image.svg" onerror="this.src='image.png'">
Das erfordert spezielles HTML, wie Sie sehen können. Wenn das nicht möglich oder praktikabel ist, könnten Sie Quellen mit Modernizr austauschen. Dies verwendet die JS-API von Modernizr, nicht die Klassennamen.
if (!Modernizr.svg) {
$("img[src$='.svg']")
.attr("src", fallback);
}
Wobei fallback ein String mit einer URL ist, wo das Nicht-SVG-Bild als Fallback dient. Sie könnten es in einem data-fallback-Attribut belassen, ein konsistentes URL-Muster verwenden, das einfach .svg durch .png ersetzt oder eine andere clevere Sache tun, die Ihnen einfällt. SVGeezy ist eine Bibliothek, die genau das tut und eine clevere Erkennungsmethode verwendet.
Das Problem bei diesen Methoden ist, dass sie ein <img src> erfordern und dieser src vorab geladen wird und es keine Möglichkeit gibt, dies zu verhindern. Sie müssen also mit potenziellen Doppel-Downloads rechnen, was immer schlecht ist.
Oder Sie könnten eine ähnliche Technik wie bei Inline-SVG und Objekttechniken verwenden, bei der ein verstecktes DIV angezeigt wird, das einen Fallback enthält.
Eine weitere ziemlich gute Option ist die Verwendung von Picturefill. Das <picture>-Element ermöglicht Content-Type-Fallbacks. Sie benötigen das Polyfill, da Picture noch nicht sehr gut unterstützt wird. Dies löst zwar das Problem des Doppel-Downloads, funktioniert aber nicht ohne JavaScript. Aber dann tun es die anderen Methoden auch nicht. Es sieht so aus:
<picture>
<source srcset="graph.svg" type="image/svg+xml">
<img srcset="graph-small.png, graph-medium.png 400, graph-large.png 800" alt="A lovely graph.”>
</picture>
Denken Sie daran, dass eine Art von Fallback nichts ist
Wenn Sie SVG als Hintergrundbild verwenden, ist das wahrscheinlich dekorativ und nicht essenziell für die Funktionsfähigkeit der Website, sodass kein Fallback wahrscheinlich in Ordnung ist.
Ähnlich wie bei SVG-Verschönerungen jeder Art, wie einem Symbol, das von einem Wort in einem Button begleitet wird. Ohne dieses SVG ist es immer noch ein Button mit einem Wort, also ein akzeptabler Fallback.
Nun denn
Wenn Ihnen dieser Beitrag nicht viel bedeutet, weil Sie noch kein SVG verwenden, sollten Sie es tun, denn es ist großartig. Dieser Beitrag könnte Ihnen den Einstieg erleichtern.
Wenn Sie mehr Daten zum Teilen haben, würden wir uns freuen, davon zu hören.
Viel Glück!
beeinflusst.
Vielleicht sollten Sie
this.onerror = null;in dieonerror-Methode einfügen, damit Sie keine unendlichen Ersetzungsversuche haben, falls die Fallback-png-Anfrage fehlschlägt.<img src="image.svg" onerror="this.src=image.png;this.onerror=null;">+1 zu Mats Punkt. Das konnte ich nicht in den Tweet packen :)
Es gibt ein weiteres Problem mit IE und Bildern, die als CSS-Selektor verwendet werden. IE aliasiert den Selektor 'image' zu 'img'.
Ganz zu schweigen davon, dass die Stile im Head oder in einer separaten CSS-Datei sind
http://codepen.io/Kseso/pen/vdzJy/
Ich verwende gerne Modernizr und JS, um SVG-Dateien in Bildelementen auszutauschen. Ähnlich wie oben beschrieben. Wenn ich jedoch viele SVG-Dateien auf einer Website habe, verwende ich dieses Skript, um auf PNG-Dateien zurückzugreifen.
Schöne Technik, Steve. Ich verwende einen ähnlichen Ansatz.
Gute Arbeit bei der Aufschlüsselung, obwohl ich denke, dass die Vorteile die Probleme bei weitem überwiegen. iOS 5+6 machen praktisch 96%+ der iOS-Geräte aus (laut diesem Bericht vom Juni), daher bin ich mir nicht sicher, wie viele Leute sich um iOS 3/4 kümmern sollten.
Was die IE-Versionen angeht – was wahrscheinlich der größte Grund für die Verwendung des Fallbacks ist – habe ich persönlich immer den Ansatz verfolgt: „Wenn Sie IE wirklich nutzen wollen, müssen Sie mit den Konsequenzen leben.“ Sie präsentieren Modernizr als die größte, „sicherere“ Alternative, aber ist es wirklich so viel besser?
Wenn man schnell eine benutzerdefinierte Build mit den Standard-Extras erstellt und nur die beiden SVG-Optionen auswählt, liefert die Bibliothek bereits eine 8 KB große Minifizierte Datei. Wenn ich Modernizr verwende, füge ich praktisch diese 8 KB zu ALL meinen Browsern hinzu, NUR damit IE nicht doppelt herunterlädt? Es sei denn, Ihre Website besteht hauptsächlich aus IE-Nutzern, das ist einfach albern, und ich lasse lieber die 5 % oder so IE-Nutzer das zusätzliche Bild herunterladen, das in den meisten Fällen (ich denke an ein Logo oder so) sowieso nicht viel größer wäre.
Das hängt davon ab, wie viele SVG-Dateien Sie auf einer Website verwenden. Außerdem hat Modernizr viele andere Verwendungszwecke. Ich benutze es aus irgendeinem Grund auf fast jeder Website, die ich heutzutage erstelle.
Außerdem wäre Modernizr wahrscheinlich in Ihrem globalen JS enthalten und stellt einmalige / zwischengespeicherte Kosten dar, während jedes SVG seine eigenen Kosten für doppelte Downloads verursacht. Aber durchaus berechtigte Punkte. Wie bei allem muss man abwägen, was für einen selbst funktioniert.
Das Einbetten von SVG in HTML ist keine Frage der Unterstützung des SVG-Formats, sondern der Unterstützung von HTML5-Parsing-Regeln. Vor dem HTML5-Parser konnten HTML-Browser Elemente aus dem SVG-Namensraum im als text/html ausgelieferten Markup nicht erkennen. Firefox 3.6- und andere Browser, die keinen HTML5-Parser implementiert haben, verhielten sich ähnlich wie der iOS5-Browser. Sie unterstützten jedoch Inline-SVG für application/xhtml+xml.
Aber ich nehme an, dass iOS5- derzeit keine großen Probleme bereitet, da sein Anteil weniger als 8 % beträgt (http://www.14oranges.com/2013/08/) und meiner Erfahrung nach für solche alten Nicht-Retina-Geräte PNG eine bessere Option zu sein scheint.
Dies ist eine schöne Aufschlüsselung, die diese Technik erforscht. Ich habe die Twitter-Konversation hier und da verfolgt, aber es ist schön, all das dokumentiert zu sehen.
Um den Download des PNG in IE9+ zu verhindern, könnten Sie einen bedingten Kommentar um das Bildelement im SVG wickeln, der ihn auf IE8 und niedriger beschränkt. Die Probleme, die ich damit sehe, sind, dass Nicht-IE-Browser, die SVG nicht unterstützen, den PNG-Fallback nicht sehen würden, sodass Sie einen ODER-Operator im bedingten Kommentar benötigen, um Browser wie Android 2.3 und ältere native Browser zu berücksichtigen.
Ich denke so etwas wie
Ich habe kein Gerät, um dies in alten IE- oder alten Android-Versionen zu testen, um zu sehen, ob es funktioniert, aber ich glaube, dies sollte die von Ihnen erwähnten Doppel-Download-Probleme verhindern.
Ich habe ein Beispiel hier, das diese Idee in Aktion zeigt. Ich bin einer guten Lösung ziemlich nahe gekommen, aber leider hat sie immer noch Probleme.
Ich konnte das Problem des Doppel-Downloads in IE9+ verhindern.
Ich habe in IE 10, IE 9, IE 8 und IE7 getestet.
Ich habe festgestellt, dass die Verwendung des bedingten Kommentars den Doppel-Download in IE9+ verhindert und das .png in IE8 und IE 7 problemlos anzeigt.
In IE8/IE7, als ich den oben von mir geposteten Code-Schnipsel verwendete, wurde ein leeres Bildsymbol neben dem png gerendert, für das Bild ohne das src-Attribut für das SVG. Also fügte ich einige Inline-Stile zum SVG hinzu, und das schien das Problem zu lösen, das Bild für das SVG, das als leeres Bildsymbol in IE8/IE7 gerendert wird, zu verstecken.
Hier ist der Code
Die Nachteile
Dies führte dazu, dass das .png im alten Android nicht angezeigt wurde. Ich habe nur in 2.3 getestet, würde aber wetten, dass es bei älteren Versionen genauso ist. Stattdessen rendert eine leere Box mit einem grauen Rand darum.
Ich werde dies noch etwas ausprobieren, um zu sehen, ob es einen Weg gibt, dieses Android-Problem zu umgehen und gleichzeitig Doppel-Downloads in IE9+ zu verhindern.
Was meiner Meinung nach von enormem Vorteil wäre, wäre, wenn wir ein natives HTML-Element hätten, das es uns ermöglicht, Fallback-Bilder ohne Doppel-Downloads bereitzustellen, wenn die Browser den primären Bildtyp, für den wir uns entscheiden, nicht unterstützen, sei es .svg, .webp, ein neues responsives Bildformat oder was auch immer.
Chris, ich fürchte, die Verwendung von Modernizr für SVG in
<img>undbackground-imageist nicht so einfach, wie Sie es vorgeschlagen haben. Es kehrt zu Ihrer ursprünglichen Verwirrung zurück, dass Browser unterschiedliche Unterstützung für SVG in verschiedenen Kontexten haben (<img>, Hintergrund, Inline usw.).Modernizr.svgerkennt nur die Unterstützung für SVG in einem<embed>oder<object>.Modernizr.svgasimgist das, was Sie für SVG in<img>benötigen – obwohl es erst in v3.0 enthalten sein wird (der Code ist hier, wenn Sie ihn jetzt verwenden möchten) und es ist knifflig, weil es asynchron ist – mehr Details unten.Wir kennen keinen Detect für SVG in Hintergrundbildern, aber wie in diesem Thread erwähnt, können Sie
Modernizr.svgasimgverwenden, wenn Sie vorsichtig sind.Modernizr.inlinesvgist das, was Sie für Inline-SVG benötigen (obwohl Sie es in Ihrem Beispiel geschafft haben, Modernizr nicht zu benötigen – gute Nachrichten).Asynchron
Ich sagte,
Modernizr.svgasimgist asynchron... das bedeutet, dass die Seite mit dem Rendern beginnt, bevor der Test abgeschlossen ist, sodass Ihr Beispiel beide Bilder anfordern wird:.my-element {}wird übereinstimmen, und kurz danach wird.no-svgasimg .my-element {}übereinstimmen.Mein WebP-Tutorial erklärt Muster, um dies zu vermeiden (
Modernizr.webpist ebenfalls ein asynchroner Detect und hat sehr ähnliche Anwendungsfälle). Der Fall<img>ist umständlich und wird am besten mitModernizr.on()behandelt – lesen Sie den Artikel dazu – aber hier ist ein Muster, das alle Eventualitäten abdeckt für Hintergrundbilder (wenn Sie schummeln undModernizr.svgasimgverwenden).Es stellt sich heraus, dass das Internet schwer ist. Wer hätte das gedacht?
Einige schöne Gedanken gehen hier sicher ein. Liebe die Tatsache. Ich hoffe jedoch, dass es in Zukunft bessere Optionen geben wird.
Bezüglich der Probleme mit IE und seinem Preload-Scanner, der
<image src>erkennt, könnte jemand einige der verrückten Parser-Hacks testen, um zu sehen, ob sie den Scanner täuschen? Zum Beispiel analysiert<image/src=foo xlink:href=foo>korrekt im Inline-HTML.Ich habe derzeit nicht die notwendigen Betriebssysteme, um dies zu testen.
Ja, ich auch nicht...
Aber ich denke, es wäre interessant zu sehen, wenn jemand anderes, der sie hat, sich dazu äußert...
~ Steve
Ich habe dies in IE9 und IE10 getestet. Hier ist der Code, den ich verwendet habe. http://codepen.io/bjankord/pen/xlgfC
In IE10 wurde das PNG-Bild abgebrochen, genauso wie in Chris' Tests. In IE9 wurde das PNG nicht abgebrochen und heruntergeladen. Es scheint, dass dies weniger optimal ist als Chris' Demo :(...
Wunderbare Arbeit, alle miteinander.
Ist das ein Tippfehler? Ich vermute, es sollte JS statt HTML sein, das für diese Methode benötigt wird?
Ich meine, es erfordert das
onerror-Bit direkt im HTML auf jedem einzelnen Bild. Wenn Sie ein CMS verwenden, das die Bilder einfügt, kann der Code, der dies tut, vielleicht geändert werden. Aber zum Beispiel auf CSS-Tricks gibt es Tausende von Beiträgen mit Bildern, bei denen dies nicht vorhanden ist (sie sind nicht SVG, aber Sie wissen, was ich meine), sodass es nicht praktikabel ist, sie zu aktualisieren, um es zu haben, und eine andere Methode müsste verwendet werden (einfach genug).Wie bereits erwähnt, lädt die von mir verwendete Technik mit
switchundforeignObjectsowohl SVG als auch den Fallback herunter, aber ich glaube nicht, dass dies eine zu schlimme Leistungseinbuße ist, solange beide SVG und Fallback optimiert sind (und idealerweise base64-kodiert im Fall des Fallbacks). Ich war überrascht, dass nicht mehr über die Technik geschrieben wurde, da die Nachteile bei kleineren Bildern nicht so schlimm sind.Für das Logo auf meiner Website beträgt das gesamte Paket 5,55 KB und davon sind 2,33 KB das base64-kodierte PNG (das ich zuerst durch ImageAlpha und dann durch ImageOptim laufen ließ, um die Dateigröße zu reduzieren). Ich spare zwei HTTP-Anfragen, erhalte eine ziemlich solide Browserabdeckung und das alles auf Kosten der Leistung von mobilen Browsern beim Dekodieren von Base64 (obwohl die Jury darüber noch nicht entschieden hat) und einem Mangel an (oder kürzerer Dauer) des Caches für das Bild. Wenn die Bilder klein sind, ergibt es für mich Sinn, sie beide zusammenzufassen, trotz der Nachteile.
Dennoch bin ich von dieser
image-Alias-Technik fasziniert. Danke Chris, dass Sie bei all dem konsequent einen pragmatischen Ansatz verfolgen. Es gibt so viele Faktoren zu berücksichtigen und Sie haben sie alle gut erklärt.Wirklich schöne Zusammenfassung.
Für die Verwendung von
<img>-Tags für SVG habe ich eine leicht erweiterte Version deronerror-Methode, die bedingte Kommentare verwendet, sodass alte IE-Versionen den Fallback-PNG ohne JavaScript-Intervention oder zusätzliche HTTP-Anfragen erhalten.http://davidgoss.co.uk/2013/01/30/use-svg-for-your-logo-and-still-support-old-ie-and-android/
Wir haben gestern einige Gerätetests durchgeführt und die Ergebnisse hier notiert: http://waterpigs.co.uk/notes/4RdDTh/
tl;dr: Die meisten unserer Geräte forderten nur das SVG an, außer IE 10, das beide anforderte, älteres iOS Mobile Safari und IE8, die das PNG anforderten. Das überraschendste Ergebnis war, dass der Kindle das PNG anforderte, obwohl er SVG unterstützt.
Auch die Tatsache, dass SVG-
<image>s nicht mit Prozentangaben größenverändert werden können, ist seltsam und ärgerlich. Weiß jemand eine Lösung?In Bezug auf die Größenanpassung schlägt dieser Stack-Exchange-Thread eine Art Lösung für Prozente vor.
http://stackoverflow.com/questions/16813829/responsive-inline-svg-content-of-svg-must-fill-parent-width
Ich habe es selbst noch nicht ausprobiert, aber ich untersuche die Kombination der Vorschläge dort mit den hier gemachten Vorschlägen. Ich denke, wir werden die SVG-Landschaft in den nächsten Jahren erheblich verändern sehen, als Reaktion auf die Weiterentwicklung der Geräte.
Hier ist ein Ausschnitt aus der Lösung, auf die ich mich beziehe
Wenn wir weiter in den DOM vordringen, zwingt die Deklaration von 100 % Höhe auf Ihrem SVG-Element das SVG, sich auf den übermäßig hohen Wrapper auszudehnen. Und das ist ein weiterer Teil des Problems.
Die Lösung, die ich verwende, beinhaltet intrinsische Verhältnisse. CSS wie dieses
Falls der Thread verschwindet, verweist er auf ein Fiddle
http://jsfiddle.net/pcEjd/
Charles zeigt null Bytes übertragen, weil es ein Cache ist (siehe den 304-Status). In meinen Tests wird das gesamte PNG empfangen, bevor es die Chance hat, abzubrechen.
Bah, ich meine „ein Cache-Treffer“.
Für SVG als Hintergrundbild gefällt mir der Trick, den Sie in Ihrem anderen SVG-Artikel verwendet haben, noch besser.
Trotz verschiedener reaktionsfähiger Bildlösungen und Fallback-Methoden dafür und SVG, wie im Beitrag diskutiert, benötigen wir immer noch eine tatsächliche Lösung, die in den HTML5-Spec eingeführt wird, um uns zukünftig eine höhere Kompatibilität und Zugänglichkeit zu ermöglichen.
Ich habe gerade einen PNG-Hintergrund mit einer einzelnen Hintergrunddefinition und einen SVG-Hintergrund mit einer Mehrfachhintergrunddefinition eingestellt.
Altes IE fällt auf das PNG-Bild zurück, während moderne Browser SVG verwenden.
Siehe folgendes Codebeispiel.
HTML
CSS
Diese Lösung ist wirklich gut, aber ich habe festgestellt, dass das Umgeben mit Links zu unerwünschtem Leerraum darunter führte, aufgrund des verschachtelten
<image>-Tags. Falls jemand auf dasselbe Problem stößt, habe ich eine Lösung gefunden, die hoffentlich in den meisten Fällen funktioniert.HTML
CSS
Ich habe festgestellt, dass Scotts "onerror"-Technik gut funktionierte, aber die Verwendung des "IE8-Modus" in IE 10 funktionierte nicht. Es funktioniert jedoch tatsächlich in IE8, also kann ich damit leben. Ich hoffe, das spart jemandem die Zeit, die ich zum Ausarbeiten gebraucht habe!!
Vielen Dank.
Eine Sache, die ich festgestellt habe, ist, dass die Erstellung all dieser PNG-Fallback-Bilder aus den SVGs zeitaufwendig sein kann. Daher habe ich eine kleine Anwendung geschrieben, um diesen Prozess zu beschleunigen. Interessierte können die Beta hier ausprobieren: http://svgtoimage.com/ – Ich würde mich über Feedback freuen.
Warum lässt man das object-Tag nicht seinen eigenen Fallback-Mechanismus nutzen und überspringt den Modernizr+CSS-Schritt?
Dies ist die einzige Lösung, die für mich funktioniert, obwohl ich IE9 benutze und den Browser-Modus auf IE8 umstelle, um zu testen. Vielen Dank, jetzt muss ich Modernizer nicht mehr verwenden.
Die Verwendung dieser Methode bewirkt, dass sich das SVG in Firefox Android (25) verkleinert, was schade ist, da es für mich die einfachste Lösung war.
Ich habe es umgangen, indem ich den SVG-Teil wie folgt inline eingefügt habe:
Und damit meine ich die img-Tag-Lösung.
Die Lösung für das PNG-Ladeabbruchproblem finden Sie hier, Sie müssen haben
Hallo,
Sie können den HTTP Debugger Pro http://www.httpdebugger.com zur Analyse des HTTP-Datenverkehrs verwenden.
Es ist eine proxylose Lösung und hat keinerlei Auswirkungen auf die übertragenen Daten.
Vielen Dank,
Khachatur
Anekdotisch gesehen, das Beispiel
Fällt auf Android 2.3-Geräten, die ich getestet habe (die vermutlich mehrere Hintergründe unterstützen, aber kein SVG), nicht auf PNG zurück.
VERDAMMT. Traurig.
Sie haben Recht. Android 2.3 unterstützt zwar mehrere Hintergründe, aber kein SVG (in keiner Weise), daher schlägt es fehl. Ich habe es getestet.
Diese Technik funktioniert für IE 6-8, was immer noch ziemlich gut ist, aber ein Bildausfall bei Android 2.3 ist ziemlich schlecht.
Android enttäuscht mich in letzter Zeit. Ich habe gerade entdeckt, dass es unmöglich ist, auf die korrekte Unterstützung von background-clip zu prüfen, was scheiße ist.
Die Kombination mehrerer Hintergrundbilder mit linearem Verlauf scheint dies zu umgehen und ältere Android-Geräte glücklich zu machen.
Quelle: pauginer.tumblr.com/post/36614680636/invisible-gradient-technique
Ich würde es vorziehen, JS zu verwenden, um das DOM abzugreifen und das .svg durch ein .png zu ersetzen, aber in Rails-Apps führt das Caching in der Produktion dazu, dass dies fehlschlägt.
Zum Beispiel:
= image_tag "some_image.svg"Im DOM (in der Produktion) sehen Sie etwas wie
/assets/some_image-e262ae2535d6490521680316bbe7676e.svgfür Browser, die dies unterstützen. Aber für Browser, die es nicht unterstützen, tauscht JS es genau aus, ersetzt aber im Grunde das .svg durch .png, wie z. B./assets/some_image-e262ae2535d6490521680316bbe7676e.png.Leider wird das nicht funktionieren. Die Datei
some_image-e262ae2535d6490521680316bbe7676e.pngexistiert nicht.Hallo, ich versuche, Ihre "Verwendung von SVG als..."-Lösung mit Ihrer SVG-Sprite-Lösung (https://css-tricks.de/svg-symbol-good-choice-icons/) zu kombinieren. Aber es funktioniert nicht. Wissen Sie, warum xlink:href="svg.svg#id-tag" im image-Tag nicht funktioniert, aber im use-Tag?
Beste Grüße
Philipp
Ich glaube, ich habe es. Hier ist die Antwort: http://www.w3.org/TR/SVG/struct.html#ImageElement
"Im Gegensatz zu 'use' kann das Element 'image' keine Elemente innerhalb einer SVG-Datei referenzieren."
Aber wie kann ich SVG-Sprites mit einem PNG-Fallback verwenden?