Vielleicht haben Sie schon von Data-URIs gehört. Es ist eine wirklich nette Methode, eine Ressource einzubinden, die sonst eine separate HTTP-Anfrage gewesen wäre. Das Format, das Sie in einem Data-URI verwenden, kann variieren. Im Wesentlichen geben Sie nur den Inhaltstyp an (z. B. image/png), ein Semikolon und dann die Daten dieser Datei.
Wie
<img src='data: ... '>
oder
.bg {
background: url('data: ... ');
}
Bei einem Rasterbild wie einem PNG müssen die Daten dieses Bildes im Base64-Format vorliegen. Ich bin kein großer Experte, aber soweit ich das verstehe, ist Base64 sicher für die Verwendung in HTML oder CSS, da es nur 64 Zeichen verwendet, die in diesen Formaten als sicher gelten.

Wahrscheinlich bessere Stack Overflow Antwort von Dave Markle
Man weiß nie – einige Protokolle interpretieren Ihre Binärdaten möglicherweise als Steuerzeichen (wie ein Modem), oder Ihre Binärdaten könnten beschädigt werden, weil das zugrunde liegende Protokoll glaubt, Sie hätten eine spezielle Zeichenkombination eingegeben (wie FTP Zeilenenden übersetzt).
Um dies zu umgehen, kodieren die Leute die Binärdaten in Zeichen. Base64 ist eine dieser Kodierungsarten.
Base64 sieht aus wie Kauderwelsch, und wir assoziieren Kauderwelsch oft mit Kompression im Web. Aber dieses Kauderwelsch ist keine Kompression, es ist tatsächlich etwas größer als das Original, denn um Jon Skeet im selben Stack Overflow Thread zu zitieren:
Es werden 4 Zeichen für je 3 Bytes Daten benötigt, plus möglicherweise etwas Padding am Ende.
Ich bin mir aber nicht sicher, wie Gzip hier einbezogen wird. Aber worauf ich hinauswill, ist, wie SVG hier einbezogen wird.
Sie können Data-URIs auch für SVG verwenden.
<img src='data:image/svg+xml; ... '>
.bg {
background: url('data:image/svg+xml; ... ');
}
Bei SVG müssen Sie die Daten nicht unbedingt in Base64 konvertieren. Wiederum, ich bin kein Experte, aber ich glaube, die SVG-Syntax enthält einfach keine verrückten Zeichen. Es ist einfach XML, genau wie HTML, also ist es sicher in HTML zu verwenden.
Sie können die Kodierung in UTF-8 belassen und die <svg>-Syntax direkt einfügen! So:
<img src='data:image/svg+xml;utf8,<svg ... > ... </svg>'>
.bg {
background: url('data:image/svg+xml;utf8,<svg ...> ... </svg>');
}
Da wir das tun können und wissen, dass Base64 oft die Größe erhöht, ist es dann nicht gleich gut, das zu tun? Ja. Als Nebeneffekt komprimiert die unveränderte <svg>-Syntax besser, da sie weitaus repetitiver ist als Base64. Nehmen wir an, Sie möchten zwei Versionen eines Icons, eine rote, eine gelbe. Sie können die gleiche SVG-Syntax duplizieren und nur die Füllfarbe ändern. Gzip wird das im Handumdrehen verarbeiten. Dank an Todd Parker für diesen Tipp, und das ist auch der Ansatz von Grunticon, das SVG in UTF-8 in CSS mit Data-URIs einbettet.
Ein Test
Um dies auszuprobieren, habe ich drei SVG-Icons von IcoMoon heruntergeladen.

cog.svg – 1.026 Bytes
play.svg – 399 Bytes
replay.svg – 495 Bytes
Ich habe sie durch SVGO laufen lassen, damit sie schön optimiert und quasi bereit für die Verwendung als Data-URI sind (Leerzeichen entfernt, obwohl das nicht unbedingt notwendig ist).
cog.svg – 685 Bytes
play.svg – 118 Bytes
replay.svg – 212 Bytes
Dann habe ich diese durch einen Base64-Konverter laufen lassen.
cog.svg – 916 Bytes – 133% der Originalgröße
play.svg – 160 Bytes – 136% der Originalgröße
replay.svg – 283 Bytes – 134% der Originalgröße
Das macht Sinn, oder? Wenn es 4 Zeichen für je 3 Bytes sind, ist das 133% größer, wobei die Abweichung von ungleichmäßigen Längen und damit Padding herrührt.
Nun, vielleicht ist das alles offensichtlich. Aber mir scheint, wenn man einen Data-URI für SVG verwenden möchte, gibt es keinen Grund, ihn jemals mit Base64 zu kodieren.
Ein Dank an Matt Flaschen für seine E-Mail vor ein paar Monaten, die mich auf dieses Problem aufmerksam gemacht hat.
UPDATE: zu IE
In den Kommentaren wird viel über IE 10/11/Edge gesprochen, die das nicht unterstützen. Das stimmt nicht, es ist nur wählerisch. Hier ist ein reduzierter Testfall, der in diesen IE-Versionen funktioniert. Beachten Sie, dass das zweite Beispiel, das URL-kodiert ist, funktioniert. Der Trick ist, überhaupt keinen Encoding-Typ anzugeben.
UPDATE: „Optimiert URL-kodiert“
Taylor Hunt hat etwas tiefer recherchiert und herausgefunden, dass Sie noch etwas mehr Optimierung herausholen können, indem Sie Dinge wie Leerzeichen und einfache Anführungszeichen nicht kodieren. Beispiel:
data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M224%20387.814V512L32 320l192-192v126.912C447.375 260.152 437.794 103.016 380.93 0 521.287 151.707 491.48 394.785 224 387.814z'/%3E%3C/svg%3E
Funktioniert nicht in allen Browsern. Wenn ich mich recht erinnere, können Safari 7 und IE11 das nicht.
Ich denke, die URL-Kodierung des SVG löst das Problem und ist immer noch kleiner als Base64.
URL-Kodierung? Wenn Sie wörtliches XML in einem Data-URI meinen, dann schlagen Sie vor, ein Problem mit dem Problem selbst zu lösen. Das funktioniert nicht in den von mir genannten Browsern.
Ich meine
Wenn Sie eine Zeichenkodierung meinten, wie Gunnar Bittersmann unten vorgeschlagen hat, könnte das die Lösung sein. Ich bin nie darauf gekommen, das auszuprobieren, als ich mit Data-URIs arbeitete, die SVG enthielten.
Ja, das meinte ich und ich hatte dieses Problem mit IE und FF (damals), beides wurde mit diesem kleinen Trick gelöst. Sie werden feststellen, dass die Rohgröße eines URI-kodierten Strings größer sein kann als Base64, aber wenn er mit Gzip komprimiert wird, ist er definitiv kleiner.
Ja, die Notwendigkeit, für IE URL-zu-kodieren, negiert die Einfachheit. Allerdings habe ich nicht darüber nachgedacht, dass Gzip immer noch gute Arbeit leisten kann, wenn mehrere ähnliche SVGs URL-kodiert sind, aber nicht unbedingt, wenn sie Base64-kodiert sind.
Wenn Sie noch nicht im Produktionsstadium sind oder an einer App oder etwas Ähnlichem arbeiten, bei dem keine Unterstützung für IE erforderlich ist, habe ich eine Liste von Tipps zusammengestellt, wie Sie das Brechen Ihrer Data-URIs in anderen Browsern vermeiden können.
Um zusammenzufassen, was andere gesagt haben und was ich gerade getestet habe:
Firefox 4+ unterstützt < und >, aber # muss URL-kodiert sein.
<=IE11 muss vollständig kodiert sein.
Chrome und Safari 5+ funktionieren ohne Kodierung einwandfrei.
Sie meinen 33% größer, nicht 133%.
Base64 wird in diesem Szenario häufig verwendet, da es die Notwendigkeit umgeht, das Bild per URL zu escapen, was sonst erforderlich wäre.
Sie sollten wirklich mal Mathe lernen, Chris… ;)
916/685 = 1.33 = 133% = **33% größer**, nicht 133%.
Aber ja, Base64 ist wahrscheinlich nicht immer eine gute Idee, aber SVG kann unsichere Zeichen enthalten (denken Sie daran, Vektorbilder können Bitmap-Teile enthalten…). Außerdem fügen Tools wie LESS das SVG standardmäßig als Base64 ein, wenn Sie ein Data-URI möchten…
133% der Originalgröße, nicht 133% größer als das Original.
Gibt es Unterschiede in der Browserunterstützung zwischen Base64 und reinem UTF8? Ich habe tatsächlich auf Base64 umgestellt, weil ich irgendwo gehört habe, dass der andere Weg in IE9 nicht funktioniert (kann die Quelle jetzt nicht mehr finden). Wäre schön, wenn das im Artikel erwähnt würde, egal in welche Richtung.
Mach weiter so, Chris – danke!
Laut RFC 2397 sollte der Parameter im Medientyp ein Attribut-Wert-Paar sein, d. h.
charset=utf-8(mit Bindestrich!) anstelle von nurutf8. Bei der Zeichenkodierung sollte der Data-URI beginnen mitdata:image/svg+xml;charset=utf-8,<svg…Bei der Verwendung von UTF-8 sollte es jedoch sicher sein, die Kodierungsdeklaration wegzulassen:
data:image/svg+xml,<svg…Meiner Erfahrung nach funktionieren nicht alle nicht-Base64-kodierten SVGs in allen Browsern. Ich würde das gerne verwenden, aber es war für mich fehlerhaft.
Ich frage mich, ob es ein Problem mit kodiert vs. nicht-kodiert war und nicht mit Base64.
Ein weiterer Vorteil ist, dass Sie Variablen von CSS-Präprozessoren verwenden können, um Ihr SVG zu erstellen. Natürlich wird dies das resultierende Stylesheet aufblähen, besonders wenn dieselbe SVG-Vorlage auf verschiedene Arten gerendert wird. Aber es spart eine HTTP-Anfrage, was für kleine Bilder wie das Navicon nützlich sein kann.
Seien Sie vorsichtig mit Anführungszeichen! Wenn Ihr SVG ein Attribut mit einem doppelten Anführungszeichen (“) hat und Sie Ihr url()-Attribut mit doppelten Anführungszeichen öffnen/schließen, wird das direkte SVG fehlschlagen. Dasselbe gilt natürlich auch für einfache Anführungszeichen.
Wenn Sie direktes SVG verwenden möchten, benötigen Sie wahrscheinlich einen Präprozessor, um die Anführungszeichen zu normalisieren (oder zu escapen).
Ich habe Base64 verwendet (http://www.phoca.cz/cssflags/), weil der Rohinhalt in allen „gängigen“ Browsern nicht funktionierte :-(. Daher war Base64, obwohl es den Inhalt größer macht, die einzige Möglichkeit für mich :-(
Nein, das ist es nicht. Leute machen das oft falsch. HTML ist nicht XML, und HTML ist ein paar Jahre älter als XML.
HTML-Geschichte
Interessant.
Der Punkt in diesem Fall ist jedoch: Winkelklammern, Attribute, was auch immer, die Tatsache, dass Inline-SVG großartig in HTML funktioniert. Sie sind verwandte Geister.
Es wäre cool, wenn es ein SASS-Mixin gäbe. Hat das schon jemand gesehen?
Sieht so aus, als ob jemand auf SO eines erstellt hat: http://stackoverflow.com/questions/15454014/url-or-base64-encode-strings-in-compass-sass. Es wäre toll, wenn es in Compass integriert würde.
Less.js hat ein optionales
mime typeArgument fürdata-uri.Gunners Punkt oben zum Medientyp-Parameter ist ziemlich wichtig…
Die Kurzform
data:image/svg+xml;utf8,schlägt in IE10/11 fehl.Die Verwendung von
data:image/svg+xml;charset=utf-8,oder das Weglassen des Medientyps scheint zu funktionieren.http://codepen.io/RwwL/pen/Aczds
Ich bin mir nicht sicher, ob Sie sagten, dass
data:image/svg+xml;charset=utf-8,in IE funktioniert, aber das tut es wirklich nicht.… mit nicht-kodiertem SVG.
Sieht jemand etwas Ähnliches wie
in Firefox? Noch besser, kennt jemand eine Lösung?
URL-kodieren Sie das SVG, bevor Sie es in den Data-URI einfügen? Firefox benötigt das; schauen Sie sich das Codepen an, das ich gerade oben gepostet habe.
Sie haben Recht, und die Kodierung muss auf
charset=utf-8gesetzt sein. Da wir davon ausgehen, dass wir FF immer noch unterstützen wollen, denke ich, dass dies im Artikel hervorgehoben und wahrscheinlich als Benchmark anstelle von einfachem XML verwendet werden sollte (obwohl kodiertes XML immer noch besser abschneiden würde).Firefox kommt mit ", eigentlich gut zurecht, es mag nur
#nicht. Das war das einzige Zeichen, das ich in meinen Tests kodieren musste.Ähm… mein obiger Kommentar ist kaputt gegangen.
„Firefox kommt mit < und >, eigentlich gut zurecht, es mag nur
#nicht.“Ja, man kann wirklich einfach reines SVG schreiben, aber einige Symbole müssen kodiert werden, wie Anführungszeichen, '#' und Klammern. Interessanterweise müssen das Gleichheitszeichen '=', das Komma und die SVG-Namespace-URL 'http://www.w3.org/2000/svg' (folglich auch Schrägstrich '/') nicht kodiert werden. IE muss Winkelklammern kodieren. Leerzeichen können durch einen Backslash ersetzt werden: '\ '.
Es gibt jedoch einen Trick, der viele Bytes sparen kann – verwenden Sie das zitierte URI: url("data:image/svg+xml,%3Csvg xmlns=’http://www.w3.org/2000/svg’…%3C/svg%3E"). Dann muss man keine Leerzeichen kodieren oder escapen, und einfache Anführungszeichen sind in Ordnung zu verwenden! (Aber nicht umgekehrt.) Das ist ziemlich praktisch, da SVG voller dieser Symbole ist.
Ich habe gerade damit herumgespielt und bemerkt, wie Grumpicon es handhabt.
background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%...svg%3E');Ich weiß nicht genug über Zeichenkodierung, um zu wissen, warum sie US-ASCII und nicht UTF-8 verwenden. Ich sehe, dass sie die Klammern und so kodieren, anstatt einfach nur reines XML hineinzufügen.
Ich weiß nur, dass ich generell großes Vertrauen in Filament-Group-Projekte habe.
Sie müssen die SVG-Syntax kodieren, damit sie in allen Browsern sicher verwendet werden kann. Zumindest IE benötigt das. Ich weiß, Chrome kann die Winkelklammern und so direkt verarbeiten, aber IE nicht. Also machen sie das Sicherste (kodieren es), aber ohne Base64.
Versuchen Sie,
utf8incharset=utf8zu ändern.Ich habe es geschafft, das Problem zu lösen.
Das Ergebnis ist das folgende:
http://codepen.io/verlok/pen/vCwoG
Das Problem war die Art der URL-Kodierung, die ich verwendet habe… Ich hatte eine online ausgewählt, aber Sie benötigen eine, die tatsächlich die Funktion
encodeURIComponentverwendet, wie http://infoheap.com/tool/url-encode-decode-online-tool/Prost!
Interessant. Als ich
utf8in Ihrem ursprünglichen Pen incharset=utf8geändert habe, hat es auch in IE gut funktioniert. Zeichenkodierung ist meiner Meinung nach eine seltsame Art von Zauberei.Ich hatte mehr Erfolg mit diesem Tool: http://pressbin.com/tools/urlencode_urldecode/
Ich bin auf ein seltsames Problem mit ungeschlossenen Anführungszeichen gestoßen. Ich erhalte immer wieder einen Fehler, habe aber eine völlig unlogische Lösung gefunden. Alles auf Stack Overflow, falls jemand Ideen hat.
http://stackoverflow.com/questions/27161390/sass-datauris-unclosed-quotes/27161553#27161553
Ich bin mir nicht sicher, ob jemand das gepostet hat, aber @Alexis2004 hat hier eine nette Sass-Funktion erstellt, bis sie in den Compass-Build integriert wird: https://github.com/Compass/compass/issues/1460
funktioniert perfekt und vermeidet die Notwendigkeit, Base64 zu verwenden, mit dem bereits verfügbaren Compass inline-image() [http://compass-style.org/reference/compass/helpers/inline-data/#inline-image].