SVG ist ein Bildformat für Vektorgrafiken. Es steht wörtlich für Scalable Vector Graphics (Skalierbare Vektorgrafiken). Im Grunde das, womit man in Adobe Illustrator arbeitet. Man kann SVG recht einfach im Web verwenden, aber es gibt einiges, was man wissen sollte.
Warum überhaupt SVG verwenden?
- Kleine Dateigrößen, die sich gut komprimieren lassen
- Skaliert auf jede Größe, ohne Klarheit zu verlieren (außer sehr klein)
- Sieht auf Retina-Displays großartig aus
- Designkontrolle wie Interaktivität und Filter
Einige SVG-Elemente zum Arbeiten erhalten
Etwas in Adobe Illustrator entwerfen. Hier ist ein Kiwi-Vogel, der auf einem Oval steht.

Beachten Sie, dass das Zeichenbrett direkt an den Kanten des Designs beschnitten ist. Der Canvas ist bei SVG genauso wichtig wie bei PNG oder JPG.
Sie können die Datei direkt aus Adobe Illustrator als SVG-Datei speichern.

Beim Speichern erhalten Sie ein weiteres Dialogfeld für die SVG-Optionen. Ehrlich gesagt, weiß ich nicht viel darüber. Es gibt eine vollständige Spezifikation für SVG-Profile. Ich finde SVG 1.1 funktioniert gut.

Der interessante Teil hier ist, dass Sie entweder auf OK klicken und die Datei speichern oder auf „SVG-Code…“ klicken können, und es öffnet TextEdit (zumindest auf einem Mac) mit dem SVG-Code darin.

Beides kann nützlich sein.
SVG als <img> verwenden
Wenn ich das SVG in eine Datei speichere, kann ich es direkt in einem <img>-Tag verwenden.
<img src="kiwi.svg" alt="Kiwi standing on oval">
In Illustrator war unser Zeichenbrett 612px ✕ 502px.

Das ist genau so groß wie das Bild auf der Seite sein wird, wenn es allein gelassen wird. Sie können die Größe jedoch ändern, indem Sie einfach das img auswählen und seine width oder height ändern, genauso wie Sie es bei einem PNG oder JPG tun könnten. Hier ist ein Beispiel dafür
Check out this Pen!
Browser-Unterstützung
Die Verwendung auf diese Weise hat ihre eigenen spezifischen Browserunterstützungen. Im Wesentlichen: Es funktioniert überall außer bei IE 8 und darunter und Android 2.3 und darunter.
Wenn Sie SVG verwenden möchten, aber auch diese Browser unterstützen müssen, die die Verwendung von SVG auf diese Weise nicht unterstützen, haben Sie Optionen. Ich habe verschiedene Techniken in verschiedenen Workshops behandelt, die ich gehalten habe.
Eine Möglichkeit ist, die Unterstützung mit Modernizr zu testen und die src des Bildes zu ändern
if (!Modernizr.svg) {
$(".logo img").attr("src", "images/logo.png");
}
David Bushell hat eine wirklich einfache Alternative, wenn Sie mit JavaScript im Markup einverstanden sind
<img src="image.svg" onerror="this.onerror=null; this.src='image.png'">
SVGeezy kann auch helfen. Wir werden weitere Fallback-Techniken behandeln, wenn dieser Artikel fortschreitet.
SVG als Hintergrundbild verwenden
Ähnlich einfach wie die Verwendung von SVG als Bild, können Sie es in CSS als background-image verwenden.
<a href="/" class="logo">
Kiwi Corp
</a>
.logo {
display: block;
text-indent: -9999px;
width: 100px;
height: 82px;
background: url(kiwi.svg);
background-size: 100px 82px;
}
Beachten Sie, dass wir die Hintergrundgröße auf die Größe des Logo-Elements eingestellt haben. Dies müssen wir tun, sonst sehen wir nur einen kleinen Teil unseres viel größeren ursprünglichen SVG-Bildes. Diese Zahlen sind aspektverhältnisbewusst für die ursprüngliche Größe. Sie könnten jedoch background-size-Schlüsselwörter wie contain verwenden, wenn Sie sicherstellen möchten, dass das Bild passt und die Elternbild genau die richtige Größe hat.
Browser-Unterstützung
Die Verwendung von SVG als Hintergrundbild hat ihre eigenen speziellen Browserunterstützungen, aber es ist im Wesentlichen dasselbe wie die Verwendung von SVG als Bild. Das einzige Problem, das Browser haben, sind IE 8 und darunter und Android 2.3 und darunter.
Modernizr kann uns hier helfen, und zwar auf effizientere Weise als die Verwendung von Bildern. Wenn wir das background-image durch ein unterstütztes Format ersetzen, wird nur eine HTTP-Anfrage statt zwei gemacht. Modernizr fügt dem HTML-Element eine Klassenbezeichnung „no-svg“ hinzu, wenn es SVG nicht unterstützt. Wir verwenden das also.
.main-header {
background: url(logo.svg) no-repeat top left;
background-size: contain;
}
.no-svg .main-header {
background-image: url(logo.png);
}
Eine weitere clevere, progressive Enhancement-orientierte Technik zur Verwendung von SVG als Hintergrundbild besteht darin, es in Verbindung mit mehreren Hintergründen zu verwenden. SVG und mehrere Hintergründe haben eine sehr ähnliche Browserunterstützung. Wenn der Browser mehrere Hintergründe unterstützt, unterstützt er SVG, und die Deklaration funktioniert (und überschreibt jede vorherige Deklaration).
body {
background: url(fallback.png);
background-image: url(image.svg), none;
}
Das Problem mit <img> und Hintergrundbild...
Ist, dass man die Innereien des SVG nicht mit CSS steuern kann, wie es bei den folgenden zwei Methoden der Fall ist. Lesen Sie weiter!
SVG "inline" verwenden
Erinnern Sie sich, wie Sie den SVG-Code direkt aus Illustrator erhalten können, während Sie speichern, wenn Sie möchten? (Sie können auch einfach die SVG-Datei in einem Texteditor öffnen und diesen Code kopieren.) Sie können diesen Code direkt in ein HTML-Dokument einfügen und das SVG-Bild wird genauso angezeigt, als hätten Sie es in ein img eingefügt.
<body>
<!-- paste in SVG code, image shows up! -->
</body>
Dies kann von Vorteil sein, da das Bild direkt im Dokument geladen wird und keine zusätzliche HTTP-Anfrage benötigt. Mit anderen Worten, es hat die gleichen Vorteile wie die Verwendung eines Data URI. Es hat auch die gleichen Nachteile. Ein potenziell „aufgeblähtes“ Dokument, ein großer Brocken Mist direkt im Dokument, das Sie erstellen möchten, und die Unfähigkeit, es zu cachen.
Wenn Sie eine Backend-Sprache verwenden, die die Datei abrufen und einfügen kann, können Sie zumindest die Autorenerfahrung bereinigen. Zum Beispiel
<?php echo file_get_contents("kiwi.svg"); ?>
Eine kleine PHP-spezifische Sache hier… mir wurde gezeigt, dass file_get_contents() die richtige Funktion hier ist, nicht include() oder include_once(), wie ich sie zuvor verwendet habe. Speziell weil SVG manchmal mit <?xml version="1.0" encoding="UTF-8"?> als erste Zeile exportiert wird, was den PHP-Parser zum Absturz bringt.
Zuerst optimieren
Wahrscheinlich keine große Überraschung, aber das SVG, das Adobe Illustrator Ihnen liefert, ist nicht besonders optimiert. Es enthält eine DOCTYPE- und Generator-Notiz und all diesen Kram. SVG ist bereits ziemlich klein, aber warum nicht alles tun, was wir können? Peter Collingridge hat ein Online-Tool SVG Optimiser. Laden Sie das alte hoch, laden Sie das neue herunter. In Kyle Fosters Video geht er sogar noch einen Schritt weiter und entfernt nach dieser Optimierung Zeilenumbrüche.
Wenn Sie noch härter eingestellt sind, hier ist ein Node JS-Tool, um es selbst zu tun.
Jetzt können Sie mit CSS steuern!
Sehen Sie, wie das SVG HTML sehr ähnlich aussieht? Das liegt daran, dass beide im Grunde XML sind (benannte Tags mit spitzen Klammern mit Dingen darin). In unserem Design haben wir zwei Elemente, die das Design ausmachen: eine <ellipse> und ein <path>. Wir können in den Code springen und ihnen Klassennamen geben, genau wie jedes andere HTML-Element.
<svg ...>
<ellipse class="ground" .../>
<path class="kiwi" .../>
</svg>
Jetzt können wir in jedem CSS auf dieser Seite diese einzelnen Elemente mit speziellem SVG-CSS steuern. Dies muss kein CSS sein, das in das SVG selbst eingebettet ist; es kann überall sein, sogar in unserer globalen Stylesheet, die verlinkt ist. Beachten Sie, dass SVG-Elemente einen speziellen Satz von CSS-Eigenschaften haben, die auf sie angewendet werden. Zum Beispiel ist es nicht background-color, sondern fill. Sie können jedoch normale Dinge wie :hover verwenden.
.kiwi {
fill: #94d31b;
}
.kiwi:hover {
fill: #ace63c;
}
Noch cooler, SVG hat all diese schicken Filter. Zum Beispiel Weichzeichnen. Fügen Sie einen Filter in Ihr <svg> ein
<svg ...>
...
<filter id="pictureFilter" >
<feGaussianBlur stdDeviation="5" />
</filter>
</svg>
Dann können Sie das bei Bedarf in Ihrem CSS anwenden
.ground:hover {
filter: url(#pictureFilter);
}
Hier ist ein Beispiel für all das
Check out this Pen!
- Mehr über das Anwenden von Filtern auf SVG
- Die beste Liste, die ich über SVG-spezifische CSS-Eigenschaften finden konnte (spezifisch für Opera)
- SVG-Filtereffekte-Spielplatz (von Microsoft)
Browser-Unterstützung
Inline-SVG hat seine eigene Reihe von Browserunterstützungen, aber auch hier ist es im Wesentlichen nur ein Problem in IE 8 und darunter und Android 2.3 und darunter1.
Eine Möglichkeit, Fallbacks für diese Art von SVG zu handhaben, ist
<svg> ... </svg>
<div class="fallback"></div>
Verwenden Sie dann Modernizr erneut
.fallback {
display: none;
/* Make sure it's the same size as the SVG takes up */
}
.no-svg .fallback {
background-image: url(logo.png);
}
SVG als <object> verwenden
Wenn "inline" SVG nicht Ihr Ding ist (denken Sie daran, dass es einige legitime Nachteile hat, wie z. B. schlecht zu cachen), können Sie auf eine SVG-Datei verweisen und die Möglichkeit behalten, ihre Teile mit CSS durch die Verwendung von <object> zu beeinflussen.
<object type="image/svg+xml" data="kiwi.svg" class="logo">
Kiwi Logo <!-- fallback image in CSS -->
</object>
Für den Fallback funktioniert die Modernizr-Erkennung hier gut
.no-svg .logo {
width: 200px;
height: 164px;
background-image: url(kiwi.png);
}
Dies funktioniert gut mit Caching und hat tatsächlich eine *tiefere* Unterstützung als jede andere Methode. Wenn Sie jedoch die CSS-Sachen verwenden möchten, können Sie keine externe Stylesheet oder <style> im Dokument verwenden, sondern Sie müssen ein <style>-Element innerhalb der SVG-Datei selbst verwenden.
<svg ...>
<style>
/* SVG specific fancy CSS styling here */
</style>
...
</svg>
Externe Stylesheets für <object> SVG
SVG hat eine Möglichkeit, eine externe Stylesheet zu deklarieren, was für das Authoring und Caching usw. nützlich sein kann. Dies funktioniert nur mit der <object>-Einbettung von SVG-Dateien, soweit ich getestet habe. Sie müssen dies in der SVG-Datei über dem öffnenden <svg>-Tag einfügen.
<?xml-stylesheet type="text/css" href="svg.css" ?>
Wenn Sie das in Ihr HTML einfügen, wird die Seite abstürzen und nicht einmal versuchen, sie zu rendern. Wenn Sie eine SVG-Datei verlinken, die das enthält, als <img> oder background-image, wird sie nicht abstürzen, aber sie wird nicht funktionieren (die SVG wird trotzdem gerendert).
Data-URLs für SVG
Eine weitere Möglichkeit, SVGs zu verwenden, ist die Umwandlung in Data-URLs. Data-URLs sparen Ihnen möglicherweise keine tatsächliche Dateigröße, können aber effizienter sein, da die Daten direkt vorhanden sind. Es erfordert keine zusätzliche Netzwerkanfrage.
Mobilefish.com bietet ein Online-Konvertierungstool für die Base64-Kodierung, aber ich halte das generell für keine gute Idee für SVG. Fügen Sie einfach den Inhalt Ihrer SVG-Datei ein und füllen Sie das Formular aus, und es zeigt die Ergebnisse in einem Textfeld an, das Sie kopieren können. Denken Sie daran, Zeilenumbrüche in den Daten zu entfernen, die es Ihnen zurückgibt. Es sieht wie reines Kauderwelsch aus.

Sie können das überall verwenden, wo wir bisher gesprochen haben (außer inline <svg>, weil das einfach keinen Sinn ergibt). Fügen Sie einfach das Kauderwelsch dort ein, wo in diesen Beispielen [data] steht.
Dieser Konverter ist mein Favorit, da er das SVG als weitgehend lesbaren Text belässt.
Als <img>
<img src="data:image/svg+xml;base64,[data]">
Als CSS
.logo {
background: url("data:image/svg+xml;base64,[data]");
}
Relevanter Hinweis: Normales CSS kümmert sich nicht darum, ob Sie Anführungszeichen um die Data-URI setzen, aber Sass tut es, also habe ich sie oben zitiert (Thx Oziel Perez).
Als <object>
<object type="image/svg+xml" data="data:image/svg+xml;base64,[data]">
fallback
</object>
Und ja, wenn Sie ein eingebettetes <style> in Ihrem SVG haben, bevor Sie es Base64-kodieren, funktioniert es immer noch, wenn Sie es als <object> verwenden!
Format für Data-URI
Alle oben genannten Beispiele verwenden Base64 als Kodierung, aber Data-URIs müssen nicht Base64 sein. Tatsächlich ist es im Fall von SVG wahrscheinlich besser, kein Base64 zu verwenden. Hauptsächlich, weil das native Format von SVG viel repetitiver ist als Base64 und besser komprimierbar ist.
<!-- base64 -->
data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL...
<!-- UTF-8, not encoded -->
data:image/svg+xml;charset=UTF-8,<svg ...> ... </svg>
<!-- UTF-8, optimized encoding for compatibility -->
data:image/svg+xml;charset=UTF-8,%3Csvg xmlns='http://...'
<!-- Fully URL encoded ASCII -->
data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A//...
Befehlszeilen-Tool zum Base64-Kodieren von SVG
@chriscoyier @hkfoster vielleicht könnten Sie eine Abkürzung nehmen mit >>> echo -n `cat logo.svg` | base64 | pbcopy
— Benny Schudel (@bennyschudel) 2. März 2013
Oder alternativ hat Mathias Bynens einige Techniken
Verwenden Sie
openssl base64 < path/to/file.png | tr -d '\n' | pbcopyodercat path/to/file.png | openssl base64 | tr -d '\n' | pbcopy, um das Schreiben in eine Datei zu überspringen und nur die Base64-kodierte Ausgabe ohne Zeilenumbrüche in die Zwischenablage zu kopieren.
Und ein Drag-and-Drop-Tool.
Automatisierungswerkzeuge
- grunticon:
Aus Sicht der CSS ist es einfach zu verwenden, da es eine Klasse für jedes Icon generiert und keine CSS-Sprites verwendet.
grunticon nimmt einen Ordner mit SVG/PNG-Dateien (typischerweise Icons, die Sie in einer Anwendung wie Adobe Illustrator gezeichnet haben) und gibt sie in 3 Formaten an CSS aus: SVG-Daten-URLs, PNG-Daten-URLs und eine dritte Fallback-CSS-Datei mit Verweisen auf reguläre PNG-Bilder, die ebenfalls automatisch generiert und in einem Ordner platziert werden.
- iconizr:
Ein PHP-Kommandozeilen-Tool zur Konvertierung von SVG-Bildern in eine Reihe von CSS-Icons (SVG & PNG, einzelne Icons und/oder CSS-Sprites) mit Unterstützung für Bildoptimierung und Sass-Ausgabe.
Verwandte Themen
- David Bushell: Eine Einführung in Front-End-SVG-Hacking
- David Bushell: Auflösungsunabhängigkeit mit SVG
- MDN zu SVG
- Browserunterstützung für eine Vielzahl von verschiedenen SVG-bezogenen Dingen.
- Peter Gasston: Bessere SVG-Sprites mit Fragment-Identifikatoren
- simuari: SVG-Stacks
- SVG.js – „Eine leichtgewichtige Bibliothek zur Manipulation und Animation von SVG.“
- Emmet hat eine großartige Möglichkeit, eine Data-URI aus einem SVG direkt aus Ihrem Code-Editor zu erhalten.
- Compass bietet einen Helfer für Data-URIs.
- Adobe: SVG-Styling
- Andrew J. Baker: Das SVG-Monster zähmen
- Illustrator-Alternativen: Inkscape, Sketch
- Krister Kari: Umgang mit SVG-Bildern in mobilen Browsern
Kyle Fosters Ein optimierter SVG-Workflow, der einbettenswert ist
… und die Fortsetzung + Folien.
1 Und was den Android 2.3-Browser angeht, dies. Aber wenn Sie den nativen Browser unbedingt unterstützen müssen, dies.
Wirklich umfassender Artikel Chris, ein Opus tatsächlich. Geht direkt in die TOP-Ressourcen-Mappe der Lesezeichen.
War bereits mit SVG beschäftigt, die Art und Weise, wie ich die Fallbacks damals gehandhabt habe, war das Austauschen der Endung .svg gegen .png, wenn Modernizr zeigte, dass der Browser den Test nicht bestanden hat..
+1
Danke für den Beitrag Chris, ich brauchte eine SVG-Zusammenfassung. Nur um zu sagen, dass Inkscape ein fantastisches plattformübergreifendes, quelloffenes SVG-Vektoreditor-Programm ist, *viel* besser als Illustrator ;) plus SVG ist sein natives Format.
+1. Inkscape ist großartig unter Windows/Linux.
Nicht so großartig auf Mac. Sketch ist eine viel schönere Erfahrung auf einem Mac.
Ich habe einen Test mit Inkscape gemacht, ein einfaches Textbild als SVG gespeichert, aber nichts wird im Browser angezeigt. Ich habe andere Bilder aus dem Internet ausprobiert und es funktioniert gut. Gibt es spezielle Einstellungen, die ich in Inkscape verwenden muss?
@Christos Inkscape speichert als "Inkscape SVG" oder als "Plain SVG" – letzteres ist das Format, das Sie für das Web wünschen. Aber in den meisten Fällen funktioniert beides, und ich hatte noch nie, dass eines einfach "nicht angezeigt" wird. Können Sie das Bild auf Ihrem Computer sehen (welchen Bildbetrachter Sie normalerweise verwenden)? Können Sie das Bild in Inkscape wieder öffnen?
Ich arbeite für alle meine professionellen Grafiken mit Inkscape, auf einem Mac. Es verhaut nur die Tastenkombinationen, die Sie bearbeiten müssen, und das war's. Außerdem musste ich eine "Pasteboard"-Einstellung deaktivieren, damit es Vektordateien wie-ist von anderen Mac-Apps kopieren kann. Das ist alles und es funktioniert großartig!
Das ist großartig, danke Chris. Okay, wenn wir SVGs wie IMGs behandeln können, können wir sie dann für fließenden Text verwenden? . . . klingt nach einem Codepen, den ich mir ansehen werde.
Compass-Benutzer vergessen nicht, dass Sie SVGs mit Base64 in CSS kodieren können, indem Sie einfach 'inline-image' anstelle von 'image-url' verwenden.
Ohh… wie sieht das aus?
Gerade als ich dachte, ich hätte alles gelernt, kam SVG. Danke für die Insider-Infos dazu. Ich freue mich darauf, seine Kraft zu nutzen.
Auch, wenn Sie Inkscape verwenden, gibt es hier einige Hinweise zur Optimierung: http://benfrain.com/tips-for-using-svgs-in-web-projects/
Eine weitere coole Funktion von SVG: Sie können Media Queries *innerhalb* des <style>-Elements (innerhalb Ihres SVG) verwenden.
So reagiert das Bild auf die Größe des Elternteils (z. B. <object>). Dann können Sie den Inhalt Ihres SVG neu organisieren, je nach Größe des Elternteils: ein kleinerer Text oder Positionen von "Blöcken" von Inhalten (Text ist rechts vom "Bild" in Querformat-Ausrichtung und geht nach oben im Hochformat).
Ich habe hier ein *hässliches* Demo davon gemacht (gehen Sie zum Ende der Seite und klicken Sie auf den Link "Probieren Sie es aus") ein "Tag" erscheint in der oberen rechten Ecke des Bildschirms und lautet "Sie können SVG in Responsive Webdesign verwenden" auf breiten Bildschirmen und "SVG in RWD verwenden" auf kleineren.
Auf dieser Seite finden Sie einige Möglichkeiten, SVG einzubetten
Der von mir verwendete Schnipsel war (ist immer noch?) nützlich, wenn einige Browser einen unerwünschten Abstand am unteren Rand beim Ändern der Größe anzeigen. Seit ich dies gemacht habe, hat sich die Browserunterstützung verbessert, ich bin mir nicht sicher, ob es noch benötigt wird (ich muss neue Tests machen…)
Die Zebra-SVG-Farben ändern sich mit Breakpoints
Sie können auch JavaScript innerhalb von SVG und Filter verwenden, die in Browsern recht gut unterstützt werden ;) (manchmal besser als Illustrator oder Inkscape).
Inkscape ist eine kostenlose und quelloffene Software, die sich SVG widmet, sehr nützlich…
Pascal
Habe den Link zu meiner Demo vergessen :(, sorry
http://soqr.fr/testsvg/embed-svg-liquid-layout-responsive-web-design.php
Hallo @eqroeil, Ihr Kommentar adressiert, was ich herauszufinden versuche – wie SVG in Responsive Design funktioniert. Niemand adressiert das.
Hier ist mein Codepen: http://cdpn.io/qItAC
Links ist #ALA Kunst – der Pinsel. Daneben mein Logo und dann eine zweite Version des Pinsels. Die zweite Version und das Logo haben beide Breite und Höhe entfernt, nur viewBox und „preserveAspectRatio=„xMinYMin meet“. Diese skalieren mit dem Container, aber sie brechen die Objektbox. Warum warum warum?
Ich suche nach der richtigen Lösung. Ihr Beispiel funktioniert. Ich werde es heute auseinandernehmen, um zu verstehen, warum! Jeder Kommentar wäre sehr willkommen.
Ich habe versucht, SVG-Bilder als Hintergrundbild auf responsiven Divs zu verwenden
div class="span4"aber im Gegensatz zu einem
imgkann ichwidth="100%"nicht verwenden, was es automatisch skaliert, und obwohl sich meindivbeim Ändern der Browserfenstergröße anpasst, bleiben die Hintergrund-SVG-Dimensionen gleich. Das ist nicht wirklich spezifisch für SVG, da es auch bei PNGs/JPGs passiert, aber man muss es bedenken.Kein Problem in modernen Browsern, aber Ihre üblichen Verdächtigen (IE 8 und niedriger und möglicherweise IE9) haben damit Probleme.
Sie sollten es mit preserveAspectRatio="xMinYMin meet" in Ihrem SVG prüfen und nur viewBox="0 0 800 960" beibehalten (Breite und Höhe entfernen, aber es sollte nicht notwendig sein…)
in Ihrem CSS versuchen background-size: cover (oder contain)
vielleicht…
als Fallback für IE: bedingte Klassen und PNG-Fallback ; )
.ie8 .span4{
background: url(thepngone.png);
}
Ich glaube nicht, dass es das ist, was Sie brauchten, aber es könnte für jemanden nützlich sein.
Responsives Element mit SVG als Hintergrund, das das Verhältnis beibehält
Guter Beitrag Chris! Kleiner Fehler in Ihrem Objekt-Fallback, aber
.no-svg .logo {
background-image: url(kiwi.svg);
}
Sollte sein
.no-svg .logo {
background-image: url(kiwi.png);
}
Danke! Ursache behoben.
Gut, mehr Informationen über Fallbacks für SVG zu bekommen. Ich werde daran arbeiten müssen für meine Websites.
Meine letzten beiden Designs enthielten nichts als SVGs im Hauptlayout, wobei Hintergrundtexturen, Header-Bilder, Logos und andere Elemente nur aus SVG bestanden. Sie sehen auf einem Retina-Display großartig aus! Was mir jedoch aufgefallen ist, ist, dass die Grafiken in verschiedenen Browsern leicht unterschiedlich aussehen. Auf Storiva.com zum Beispiel scheint es, dass Fireworks einige meiner Farbverläufe im Header-Hintergrund korrekt als Ellipsen-Farbverlauf interpretiert, während sie in Chrome und Safari als radiale Farbverläufe interpretiert werden, was zu etwas weniger lebendigen Farben führt. Ich fand das ziemlich interessant, aber definitiv kein Dealbreaker.
Auf jeden Fall vielen Dank für eine so gründliche Überprüfung Chris! Sehr geschätzt.
Ich hatte kürzlich ein Problem mit SVG in ie10 (und möglicherweise 9).
Ich baute eine Website mit einem SVG-Logo im Header und Footer. Im Header (der position: fixed hat) verwendete ich ein div-Tag mit dem SVG als Hintergrund, und im Footer verwendete ich es als img-Tag. Der Hintergrund im a-Tag wird in der Originalgröße verwendet, während das img-Tag aus Designgründen etwas kleiner ist.
Das Problem ist, dass Explorer manchmal den Hintergrund im Header verschiebt und abschneidet, wenn ein anderes Element mit derselben SVG-Datei als Quelle eine andere Größe hat. Dieses Problem tritt in ie10 auf, aber ich denke, es tritt auch in ie9 auf.
Ich habe einen Fiddle gemacht in: http://jsfiddle.net/uK2La/
(Ich habe auch einen Pen unter http://codepen.io/anon/pen/zviwF erstellt, aber meistens zeigt sich der Fehler erst, wenn Sie das Fenster vergrößern).
Ich habe es in diesem spezifischen Fall gelöst, aber ich weiß nicht, ob das ein IE-Bug ist oder ob ich etwas übersehen habe. Andere Browser scheinen gut zu funktionieren.
Hallo,
http://jsfiddle.net/uK2La/14/
scheint IE10 genau dasselbe Bild zu verwenden und es irgendwie zu vermasseln. Ein Workaround scheint ein zusätzlicher Parameter für ein Bild zu sein. Wird andere Probleme haben (wie Cache, nehme ich an), aber scheint zu funktionieren. Sie sollten einen Bug-Report bei Microsoft einreichen, generell habe ich weniger Probleme mit IE10 als z. B. Chrome mit Dingen.
Übrigens funktioniert die classList API gut für Ihr Beispiel… unterstützt in allem außer IE<=9, scheint es.
Toller Artikel! Danke, ich habe mich in letzter Zeit wirklich damit gequält, wie ich SVG in meine Projekte integrieren kann.
Die Canvas-Größe wird schnell alt, wenn man nicht daran gewöhnt ist. Eine Sache, die ich beim Speichern als SVG hilfreich fand, ist, Ihr Objekt auszuwählen und dann zu gehen: Objekt > Zeichenbrett > Ausgewähltes an Kunst anpassen. Hoffe, das erleichtert jemandem das Leben.
Wie handhabt man SVGs in einem Link? Ich habe versucht, den besten Weg dafür herauszufinden.
Ich habe diese Methode als Fallback für SVGs als Hintergrundbilder verwendet –
Die Idee ist, dass das SVG entweder überschrieben wird oder ignoriert wird, je nach Unterstützung.
Es ist etwas einfacher als Chris' Methode. Scheint für mich gut zu funktionieren, aber vielleicht gibt es einen Fehler darin, den ich nicht sehe, auf den jemand hinweisen könnte?
Sie werden beide unnötigerweise laden, wenn nur eines angezeigt wird. Aber ich denke, das ist ziemlich raffiniert, um es zum Laufen zu bringen.
Ich habe nie daran gedacht, Vinay, also habe ich beschlossen, mit dem Netzwerk-Profiler von Chrome und Firefox nachzusehen und es wird nur die SVG-Datei heruntergeladen. Ich habe keine Lust, VMware zu starten, um IE zu testen, aber ich gehe davon aus, dass es dasselbe ist. Ich frage mich immer noch, ob es ein Problem mit dieser Methode gibt, weil sie fast zu einfach erscheint.
Ich bin ziemlich sicher, dass Sie beide in allen oben genannten Beispielen laden werden. Der Unterschied zwischen dem obigen und dem von James ist die Einfachheit. Der einzige Weg, um sicherzugehen, dass nicht beide heruntergeladen werden, ist die Verwendung einer Data-URI (vorab geladen) oder die Prüfung der Browserunterstützung, bevor Elemente geladen werden, und das Ersetzen/Einfügen verschiedener Erweiterungen.
Sie können auch versuchen
:roothat zumindest bei Desktop-Browsern das gleiche Unterstützungsniveau wie SVG. Bei mobilen Geräten bin ich mir nicht sicher. Da ungültige Selektoren und Eigenschaften ignoriert werden, wird die SVG-Datei nur in moderneren Browsern heruntergeladen. Der Nachteil ist, dass Browser, die SVG unterstützen, beide herunterladen :(Dies war meine erste Idee, als ich den Artikel gelesen habe. Warum nicht einfache Kaskadierungsregeln verwenden, um diesen Fallback zu erreichen? Ich beschloss, weiter nachzuforschen und ich kann Ihnen sagen, warum das falsch ist. Ich bin mir zu 100 % sicher, dass in fast jedem Browser (tatsächlich in allen, die ich getestet habe, und ich habe viele getestet) NUR ein Bild geladen wird. Das war mein erster WOW-Moment. Aber kann das so einfach sein? Die Antwort ist NEIN. Da nur ein Bild geladen wird, gibt es keinen Fallback. Wenn die SVG nicht geladen wird (weil sie z. B. nicht unterstützt wird), dann wird nichts geladen. Diese Situation tritt z. B. in IE8 auf.
Mit freundlichen Grüßen.
Dawid.
Berücksichtigen Sie auch diese Methode, um einen PNG-Fallback für Browser zu erstellen, die bei SVG in einem img-Tag einen Fehler auslösen. jQuery
Demo: http://wedelivery.com/lab/svg/
Wenn ein Browser SVG nicht unterstützt und Sie einen Fallback für Ihre Inhalte bereitstellen möchten, können Sie genauso gut versuchen, alle zu ersetzen. Die Definition eines bestimmten Musters und das Festhalten daran wird helfen. Zum Beispiel sind vielleicht alle Ihre Fallback-Bilder gleich benannt wie die SVG-Datei, außer mit der Endung .png anstelle von .svn.
Schön!
Nur als Anmerkung für jemanden, der dies möglicherweise verwendet: Denken Sie daran, dass Sie diese .png-Ersetzungen tatsächlich erstellen und sie jedes Mal nebeneinander im selben Verzeichnis haben müssen.
Danke für das Teilen dieses tollen Artikels.
Chris, bitte erwähnen Sie dieses wichtige SVG-Problem mit Firefox
In Firefox wird SVG als CSS-Hintergrundbild in seinen ursprünglichen Designabmessungen gerastert, bevor es skaliert wird. Dies führt zu sehr verschwommenen Bildern beim Hochskalieren eines kleinen SVG. Einige schlagen vor, einfach ein gigantisches SVG zu verwenden, damit man nie hochskalieren muss, nur runterskalieren. Aber ich habe schreckliche Leistung gesehen, wenn man ein riesiges SVG verwendet und es runterskaliert (obwohl es dann im Element 3D transformiert und animiert wurde).
Ein bisschen lustig, dass diese Implementierung von SVG nicht S oder V ist…
Sehen Sie sich diese Seite in FF an, sie zeigt den Fehler gut
http://dbushell.com/demos/svg/scaling-09-03-12/
(Bugzilla ist in Wartung, aber das könnte der Bug sein, ich kann es jetzt nicht prüfen)
https://bugzilla.mozilla.org/show_bug.cgi?id=600207
Workaround sind die oben genannten anderen Optionen, wie Inline-SVG.
Firefox hat diesen Bug seit vielen, vielen Versionen nicht behoben. Daher denke ich, dass SVG als CSS-Hintergrund im Moment keine gute Option ist. Was traurig ist, weil background-cover und Zentrierung es zu einer so attraktiven Option machen.
Danke! Ich war dabei, etwas Ähnliches zu posten. Ich hatte einige ernsthafte Frustrationen beim Versuch, SVG-Hintergründe zu verwenden, nur um zu sehen, dass sie in FF schrecklich aussehen. Inline hilft definitiv, aber es gibt einige echte Vorteile bei Hintergrundbildern, und es ist interessant, dass Firefox diesen Bug immer noch hat.
Schauen Sie sich diese Side-by-Side-Nahaufnahme des Menüs von apple.com an, das einen SVG-Sprite verwendet. Chrome ist links, FF ist rechts.
Ich bin tatsächlich auf das Gegenteil gestoßen, als ich SVGs für Mobilgeräte eingerichtet habe. Firefox für Mobilgeräte hat sie perfekt angezeigt, während Chrome für Mobilgeräte sie so stark pixelig machte, dass ich die SVGs verworfen und doppelt so große PNGs verwendet habe, die mit background-size skaliert wurden.
Ich habe alle Workarounds für FF ausprobiert, und sie scheinen alle weniger als 100% effektiv zu sein. Gehen Sie auf die Homepage von David Bushell, und Sie werden sehen, dass sein .svg-Logo unscharf und weniger unscharf wird, wenn Sie in FF hinein- und herauszoomen.
Die Verwendung eines img-Tags hat das Problem für mich nicht gelöst.
Das Entfernen von Höhe und Breite aus dem .svg-Code ist harmlos und hilft etwas.
Ich ziehe in Erwägung, einfach ein FF-Conditional zu verwenden, um .png zu liefern…
@Peter Foti – stimme zu,
'img[src$=".svg"]'viel besser!Beschämt und stolz, Teil dieses Artikels zu sein. Danke, guter Herr.
Ich hatte eine unordentliche Erfahrung hier mit Inline-SVG und Animation.
Ich hatte keine Zeit, zu optimieren. Es ist ziemlich süß in FF; es gibt so viel zu tun mit SVG Inline und CSS. Danke für die guten Ratschläge. (Ich benutze Inkscape unter Linux)
Sehr schöner Beitrag, ich habe auch vor kurzem einen Beitrag über SVGs und ihre Animation erstellt. Sie finden ihn hier: Animieren von Eigenschaften von injizierten SVG-Elementen
Ich denke, SVGs sind für viele Zwecke hervorragend, aber sie bekommen nicht die Aufmerksamkeit, die sie verdienen, besonders in dieser neuen Multi-Screen-Ära, die wir erleben, ihre Skalierbarkeit ist lebensrettend.
Welche Art von magischem Base64-Encoder verwenden Sie, um es zu schrumpfen?
Base64 ist größer als Rohformate, einschließlich Klartext.
Danke für das Tutorial. Ich benutze SVGO GUI zur Optimierung von SVG-Vektorgrafikdateien.
Ich bevorzuge die Technik des unsichtbaren Farbverlaufs als Fallback für SVG
Fantastische Informationen.
Was es wert ist, hier ist ein Demo von einem zieh- und zoombaren SVG
http://www.cyberz.org/projects/SVGPan/tiger.svg
Quelle: http://www.cyberz.org/blog/
Wow, schöner Beitrag, ich habe hier etwas gelernt
Ausgezeichneter Artikel.
Nur eine Anmerkung. Sie sagen
Das stimmt nicht. Man kann sie definitiv mit CSS stylen.
Man muss nur <style> verwenden, das Element innerhalb Ihres SVG
(weil nicht alle Browser <?xml-stylesheet type=”text/css” href=”svg-stylesheet.css” ?> unterstützen)
Ein sehr guter Artikel, wenn auch nicht umfassend – er enthält keine Informationen über die Verwendung von Links innerhalb eines SVG sowie über die Möglichkeiten der Animation (obwohl das einen eigenen Artikel verdienen würde).
Ich habe schon lange vor, SVG auf einer Website zu verwenden, aber im Moment benutze ich es nur zur Erstellung prozeduraler Grafiken, wie z. B. Guilloche-Muster, wie dieses Beispiel –
Guilloche-Experiment #1
Ich wünschte wirklich, dieser Beitrag wäre vor 6 Monaten erschienen. Google lieferte früher so viele schreckliche Adobe-Links aus dem Jahr 2001, wenn man etwas über SVG googelte.
SVG wird mit all den hochauflösenden Geräten, die herauskommen, nur noch größer werden.
Unten ist der Sass/SCSS-Mixin, den ich auf vielen Builds verwendet habe.
Hallo!
Ich möchte nur darauf hinweisen, dass SVG tatsächlich als Anwendungsprogramm-Engine mit integrierter Vektorgrafikdarstellung betrachtet werden kann, da Sie das Dokument per Skript steuern und es genauso stylen können wie HTML. SVG könnte anstelle von HTML verwendet werden, wenn Sie mehr Low-Level-Grafikprimitive in Ihrem Hauptlayout wünschen, anstatt der High-Level-Semantik "Dokument", die in HTML verfügbar ist (Browser benötigen wahrscheinlich, dass der SVG-Viewport zumindest derzeit vom HTML-Tag umschlossen ist).
Wow, toller Artikel Chris. Ich habe ihn nur überflogen, werde ihn aber auf jeden Fall bald eingehend studieren.
Nur eine kurze Anmerkung: Wenn Sie eine SVG-Datei haben, müssen Sie sie nicht explizit als "Code" speichern, eine SVG-Datei ist bereits "in Code geschrieben".
Eine kleine Korrektur: Base64-kodiertes SVG für Data-URIs wird immer *mehr* Bytes haben als ein unkodiertes SVG. Ich denke, die Optimierung, die Sie meinen, ist die HTTP-Anfrage, die Sie durch Einbetten vermeiden?
Theoretisch können Sie unkodierte SVG in Data-URIs verwenden, aber die Browserunterstützung ist etwas wackelig.
http://rod.vagg.org/2012/05/data-uri-svg/
Fantastischer Artikel. Genau für solche Dinge abonniere ich! Danke :)
Schauen Sie sich diesen Tipp von Ben Schwarz an
„Alle Browser, die SVG-Hintergrundbilder unterstützen, unterstützen auch mehrere Hintergrundbilder.“
Android 2.3 macht dem einen Strich durch die Rechnung. Ich habe das persönlich nicht getestet.
Guter Fang! Danke, dass Sie darauf hingewiesen haben.
Alle Browser, die SVG-Hintergrundbilder unterstützen, unterstützen auch background-size ohne Präfix. IE8 unterstützt kein SVG oder background-size, Android 2.3 unterstützt kein SVG, erfordert aber ein Präfix für background-size.
Gute Bildwahl – ein Kiwi ist nicht nur eine Frucht!
Beim Verwenden des Optimierungstools immer auf Verzerrungen in der SVG-Ausgabe prüfen und auch prüfen, ob etwas nicht stimmt..
in meinem Fall hat es die ID für meinen linearen Farbverlauf nicht beibehalten, was zu einer reinen Farbe statt eines Farbverlaufs führte :P
SVG sollte mehr genutzt werden. Wikipedia ist die einzige Website, die mir einfällt, die SVG regelmäßig nutzt.
MSN verwendet auf unseren IE10/Windows8-Seiten Inline-SVG für das Header-Logo und CSS, um die Farbe für verschiedene Kanäle zu ändern, anstatt viele unterschiedlich gefärbte PNGs zu haben.
Toller Artikel! Tatsächlich habe ich SVG erst vor ein paar Tagen zu verwenden begonnen, daher bin ich neu darin. Aber der größte Vorteil ist, dass ich Vektorgrafiken einfach in Software wie Illustrator erstellen und sie als SVG in meinen Designs verwenden kann. Sie helfen mir, die Größe meiner Designs erheblich zu reduzieren.
Danke, dass Sie solch wertvolle Informationen geteilt haben, sie helfen mir wirklich sehr, SVG besser zu verstehen.
Bitte beachten Sie, wie ich Ihnen getwittert habe, dass SVG als Hintergrundbild in Opera nicht gut funktioniert: http://stackoverflow.com/questions/15220910/svg-as-css-background-problems-with-zoom-level-in-opera
Außerdem, wie caniuse.com erwähnt, ist SVG als Bild in allen Browsern außer Chrome 23+ und IE9+ unscharf/pixelig, wenn es gezoomt oder gedruckt wird, da die Browser SVG zuerst in eine Bitmap rendern und dann diese Bitmap vergrößern, anstatt neu zu rendern, wenn sich der Zoomfaktor ändert.
Das ist eine erstaunliche Ressource. Ich habe viel über SVG gelesen, aber es noch nie in meinen Projekten verwendet. Ich werde es auf jeden Fall in Zukunft tun!
Hot Link Flat UI funktioniert nicht.
Entschuldigung – ich wusste nicht, wo ich das sonst posten sollte, da es keinen Kommentarbereich für diese Links gibt.
Bin ich richtig, dass man das SVG nicht stylen kann, wenn es Base64-kodiert im CSS enthalten ist? Wie in http://codepen.io/anon/pen/oFhzA
Codepen scheint die Eigenschaft 'inline-image' nicht zu mögen, aber Sie verstehen den Punkt.
Wie kann man über SVG im Web sprechen und nicht RaphaelJS erwähnen? Zugegeben, es geht mehr um das dynamische Rendern von SVG und die Interaktion damit, aber um ihre Website zu zitieren
Ich bin ziemlich sicher, dass es Touch-Support (Ziehen) integriert hat. Schauen Sie sich die Demos auf ihrer Website an.
Und einige gute Plugins
exportiere „Anweisungen“ als JSON
exportiere „Anweisungen“ als tatsächliches SVG
Konvertiere zu PNG/JPG im Browser mit canvg – das ist super genial für den Export; Sie können im Grunde Ihren eigenen Bildeditor im Browser erstellen.
Beispiel einer Zeichen-App – Raphael SketchPad
Und wenn Sie einige Polygonformeln finden, macht es das Erstellen komplexer Formen sehr einfach (ich habe etwas für Herzen, Sterne und Dreiecke erstellt).
+1
Ich verwende die Raphael-Bibliothek zur Verarbeitung von SVG-Grafiken auf einer unserer Websites. Ich verstehe, dass sie VML auf IE-Plattformen verwendet, die SVG nicht unterstützen.
Ich verwende sie für benutzerdefinierte Diagramme, die zuvor mit einer Grafikbibliothek auf dem Server gezeichnet und als Bilder an den Browser gestreamt wurden. Die Umstellung auf SVG hat es mir ermöglicht, mit den Diagrammen in JavaScript zu interagieren, z. B. kann ich einen Plot im Diagramm hervorheben, wenn der Benutzer mit der Maus über einen Namen in der Legende fährt.
Die Raphael-Befehle sind in das HTML eingebettet, was die Seitengröße etwas größer macht als zuvor, aber die Seitenleistung hat sich nicht merklich beeinträchtigt und die Seiten werden jetzt mit einer einzigen HTTP-Anfrage anstelle mehrerer ausgeliefert.
Guter Artikel Chris.
Kürzlich habe ich SVG für ein Logo verwendet (als
<img>-Tag), und da es praktisch keine Benutzer dieser Website auf Android 2.3 gibt, musste ich mich nur um alte IE-Versionen kümmern, was bedeutete, dass ich bedingte Kommentare verwenden und JavaScript komplett vermeiden konnte.Ich habe es hier aufgeschrieben.
Das ist großartig, Chris! Vielen Dank für die Zusammenstellung. Besonders die Kombination von SVG und CSS eröffnet so viele Möglichkeiten. Ich werde das Zeug selbst ausprobieren müssen! Nochmals vielen Dank.
Toller Artikel. Noch eine nützliche Information. Wenn Sie ein SVG in LESS und wahrscheinlich auch SASS einbetten, können Sie die Füllfarben mit Variablen festlegen. Das ist für mich sehr praktisch, da ich Standard-Icons auf mehreren Websites verwenden kann, aber jede Website ihre eigenen Farben festlegt.
Das ist eine einfachere, verständlichere Base64-Codierung (für das Terminal)
openssl base64 -in kiwi.svg -out kiwi_64.txtIch habe dem Inline-SVG-Beispiel ein paar Dinge hinzugefügt, um es zugänglich zu machen
http://codepen.io/bensmithett/pen/oyqhc
Super hilfreicher Artikel :)
Obwohl SVG sensationell ist, bedauere ich die Tatsache, dass er es zu langsam verwendete, um es in Spielen mit JavaScript einzusetzen. Ich denke, wir könnten mit SVG mehr erreichen als mit Canvas, aber aufgrund seiner Langsamkeit müssen wir auf Canvas zurückgreifen.
Ich habe diesen Artikel geöffnet in der Erwartung, eine kleine Erklärung und einige Code-Schnipsel zu finden. Mein Geist wurde jedoch von Anfang bis Ende offiziell weggeblasen. Wahnsinnig guter Artikel, dieser bekommt definitiv ein Lesezeichen. Danke Herr Coyier, dass Sie mein Gehirn mit mehr Wissen gefüllt haben.
Das ist ein ziemlich umfassender Artikel über SVG, ich habe ihn geliebt. Ich speichere ihn für später. Ich bin auch wirklich verwirrt zwischen all dem SVG vs. Canvas-Zeug im Kontext von Web-Gaming.
Das habe ich zum ersten Mal gehört. Mehr Leute sollten davon wissen. Ich twittere das definitiv! Ich muss das als Lesezeichen speichern und SVG erstellen, wenn ich Zeit habe.
Großartig, vielen Dank.
Wow! Definitiv der beste Artikel, den ich über SVG gefunden habe.
Ich werde dieses Format für ein Website-Logo verwenden. Wäre es aus semantischer Sicht besser, es im HTML als IMG-Tag zu machen und den zusätzlichen HTTP-Request in Kauf zu nehmen, anstatt es über CSS zu tun?
Wenn Sie es als Teil des Inhalts betrachten, dann verdient es ein img-Tag. Wenn Sie denken, dass es nur Präsentation ist, dann machen Sie es zu einem Hintergrundbild über CSS.
Nun, ich bin ziemlich sicher, dass das Hauptlogo einer Website Inhalt und keine Präsentation ist. Die Verwendung eines IMG-Tags wäre also die beste Vorgehensweise. Meine Frage in diesem Fall war Semantik vs. Leistung.
Ich denke jetzt über die letzte Technik nach, die Chris erwähnt, die Verwendung von Base64 im IMG-Tag, zusammen mit einem 'alt'-Tag
Wow, ich wusste nicht, dass man das reine SVG von Illustrator bekommen kann. Großartige Funktion!
Hallo!
In unserer Android-App, die mit HTML5 + Backbone + PhoneGap erstellt wurde, haben wir uns entschieden, SVG für einige Illustrationen zu verwenden. Diese Entscheidung bereitet mir jetzt einige echte Schwierigkeiten. Die SVG, die ich einbetten möchte, sind keine einfachen SVG.
Ich habe es geschafft, den Schatten als Filter direkt in das SVG einzufügen. Das Coole daran ist, dass es in jedem der Browser, die ich auf dem Android-Gerät verwendet habe, gut gerendert wird. Aber wenn Sie die aus demselben HTML5 erstellte App mit PhoneGap öffnen und auf demselben Gerät ausführen, wird der Schattenfilter nicht gerendert. Ich benutze zum Testen ein HTC One X mit der neuesten Android-Distribution.
Hat jemand eine Idee, warum PhoneGap Filter aus dem SVG zu entfernen scheint? Ich habe im Web nach diesem Problem gesucht, aber noch keine Lösung gefunden...
danke
Mike
Danke für die Übersicht, Chris! Vieles davon, was ich nicht für möglich gehalten hätte!
Sie können auch PHP verwenden, um Data-URLs im laufenden Betrieb zu generieren. Zum Beispiel
Sie rufen es mit diesem auf
Okay, ich bin mir immer noch nicht sicher, welches SVG-Format ich verwenden soll. Zum Beispiel, für Animationen mit CSS3, welche Methode ist die beste? Und für responsive Grafiken (wie Logos), welche ist die beste? Ich habe gesehen, dass viele Leute unterschiedliche Dinge vorschlagen, aber es sollte mindestens eine geben, die gut für Styling und Manipulation mit CSS funktioniert...
Ich habe gerade eine Einschränkung beim Styling der Eigenschaft
fillmit CSS entdeckt – Sie müssen jedes fest kodiertefill-Attribut entfernen, das Illustrator exportiert.Z.B.
<svg class="foo"><g fill="#FFF700"><path... /></g></svg>wird sein
fill-Attribut nicht überschrieben durch.foo {fill: #bada55;
}
Wenn Sie das SVG-Element ansprechen, das die Füll-Eigenschaft hat, überschreibt dies hart kodierte Attribute. D.h. ändern Sie zu
.foo path { würde auch funktionieren.
Um SVG zu verwenden, müssen Sie sicherstellen, dass Ihr Server den richtigen MIME-Typ für die Bereitstellung dieses Dateityps eingestellt hat: "image/svg+xml".
Danke für diese großartige Zusammenfassung guter Praktiken für die Verwendung von SVG auf Ihrer Website.
Falls Sie Schwierigkeiten haben, das SVG auf Ihrer Seite anzuzeigen, ist eine einfache Lösung, AddType in Ihrer HTACCESS-Datei zu ändern.
Fügen Sie dies am Anfang Ihres HTACCESS hinzu
Vielen Dank! Das hat mich wahnsinnig gemacht. Ich ging fälschlicherweise davon aus, dass mein Hoster dies standardmäßig hat.
Chris, du bist großartig!
Immer großartig :)
Ich habe gerade über SVG Stacking als Ersatz für CSS Sprites geschrieben. Daher wird jedes Symbol in derselben SVG-Datei gespeichert, aber in seiner eigenen Ebene
» http://hofmannsven.com/2013/laboratory/svg-stacking/
Schade, dass man das SVG XML in eine Seite einbetten muss, um es zu stylen. Es wäre so mächtig gewesen, mehrere Instanzen auf einer Seite zu haben und sie je nach Kontext unterschiedlich zu stylen.
Ich habe angefangen, mit der Raphaël JavaScript-Bibliothek zu spielen. Sie ist hübsch und scheint mächtig zu sein. Von der Website
Es ist auf der Website gut dokumentiert, aber es gibt wenige Tutorials im Web.<br/>
Hat jemand Erfahrung damit?
Ja – wie ich erwähnt habe und dieser Typ hat geantwortet. Einige der enthaltenen Beispiele in ihrer Dokumentation sind schwer zu befolgen, aber fast alles, was Sie brauchen, ist vorhanden. Bei Fragen melden Sie sich.
Ich möchte gerne wissen, ob sonst noch jemand auf das gleiche Problem gestoßen ist, das ich bei einer Website habe, die ich baue.
Ich teste die Website in Chrome (neueste Version). Modernizr gibt Unterstützung für SVG zurück und ich kann direkt auf die SVG-Datei im Browser zugreifen (wird gut angezeigt), aber sie erscheint einfach nicht auf der Seite. In allen Fällen sind die SVG als Hintergrundbilder in CSS eingestellt.
Ich habe dies für die JS-Erkennung von SVG-Unterstützung verwendet.
/* einfache Erkennung von SVG-Bildunterstützung */
if (document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Image", "1.1")) {
document.documentElement.className = "svg";
}
mit diesem in CSS
#content {background-image: url(images/logo4.gif);}
html.svg #content {background-image: url(images/logo4.svg);}
danke an diese Seite für die Informationen zur SVG-Nutzung.
http://www.voormedia.nl/blog/2012/10/displaying-and-detecting-support-for-svg-images
Habe ein Bash-Skript erstellt, um die von Mathias Bynens autorisierte Base64-Option zu vereinfachen.
„Unfähigkeit zu cachen“? Inline-SVG ist doch einfach Teil des HTML-Dokuments, oder? Wenn das Dokument also zwischengespeichert wird, wird das Inline-SVG auch zwischengespeichert? Ich verstehe es nicht.
Richtig, aber Sie cachen das HTML wahrscheinlich nicht sehr stark, wenn überhaupt. Zum Beispiel wird das zwischengespeicherte HTML dieser Seite gerade ungültig, da ich diesen Kommentar hinzufüge.
Beim Herunterladen von kostenlosen oder Stock-Vektorgrafiken im Web konnte ich sie oft nicht anzeigen lassen. Es scheint, dass einige Browser die Präfixe „inkscape:“ und „sodipodi:“ im Code, die in vielen SVG-Bildern vorkommen, nicht mögen. Für mich schien es, dass, wenn ich die Datei in einem Texteditor öffnete und diese Phrasen löschte, es gut funktionierte.
Guter Tipp zum Thema Unschärfe in Firefox. Die meisten meiner Bilder sehen in Firefox gut aus, also habe ich aufgehört, sie in FF genau zu prüfen, aber es gibt einige, die skalierte Bilder schlecht aussehen lassen.
Dieses zu lesen hat schlechte Erinnerungen an PHP geweckt… So eine nervige Sprache, die wortreichen Anforderungen an Semikolons… sogar in Vorlagen.
Die Arbeit mit Django ist viel einfacher.
@Chris Coyler Wenn Ihr Seiten-Cache durch einfache Änderungen wie Kommentare ungültig wird, müssen Sie ein besseres Templatesystem verwenden.
Django hat das Konzept von Application Level Cache, Whole Page Cache und Block Level Cache: https://docs.djangoproject.com/en/dev/topics/cache/
Im von Ihnen beschriebenen Szenario würde ich die SVG-Einbindung in einen Block-Level-Cache einschließen, der nur ungültig wird, wenn das SVG aktualisiert würde (angenommen, es wird aus einer ORM-Abfrage abgerufen).
Sicherlich haben die PHP-Goblins etwas Ähnliches?
Ähm… er spricht von Client-seitigem Page-Caching – buchstäblich, wenn sich das HTML geändert hat, ist es eine „neue“ Seite. Nichts mit Ihrer Wahl der Sprache zu tun.
Mögliche Umgehung wäre, wirklich dynamische Inhalte wie die Kommentare per AJAX einzubinden, aber dann muss man durch Crawler-Hürden springen, um sie zu indizieren.
Hallo, ich habe gerade (basierend auf einem Video von TeamTreehouse mit einer Korrektur in bedingten Kommentaren von Ian Lunn) ein SVG als Logo mit bedingten Kommentaren als Fallback zu einem PNG verwendet. Hier ist der Code
Es funktioniert großartig! Und um einen Link hinzuzufügen, können Sie diesem einfachen Beispiel auf Fiddle folgen (kein JS)
http://jsfiddle.net/WEbGd/
Entschuldigung, im schließenden Objekt gibt es einen Fehler… es ist Objekt und nicht objetct. :D
Raphael ist eine sehr notwendige Bibliothek bei der Arbeit mit SVG! Aber ein cooles Artikel, danke
Für IE7 – 8 und Crossbrowser gibt es
http://www.pep-site.fr/logo_html5.php
Seltsam, dass ich meine SVG mit CSS in IE9 nicht skalieren kann. Die SVG haben Viewports, Breiten und Höhen, sie scheinen einfach nicht auf CSS-Regeln zu reagieren. Es gibt (oder sollte es in IE9 geben) SVG in der oberen rechten Ecke jeder der 6 weißen Felder hier
Ersetzen
svg width=”640″ height=”480″ version=”1.1″ baseProfile=”full” xmlns=”http://www.w3.org/2000/svg” xmlns:xlink=”http://www.w3.org/1999/xlink” xmlns:ev=”http://www.w3.org/2001/xml-events”
Mit
svg xmlns=”http://www.w3.org/2000/svg” xmlns:xlink=”http://www.w3.org/1999/xlink” x=”0px” y=”0px”
viewBox=”0 0 640 480″ enable-background=”new 0 0 640 480″ xml:space=”preserve”
Und es sollte gut funktionieren. Ich habe Skalierungsprobleme mit Breiten- und Höhenattributen in SVG gehabt und scheine nie Probleme zu haben, sie einfach zu eliminieren.
Du rockst! Mein Viewport fehlte!! Kein Coding mehr um 3 Uhr morgens. Vielen Dank für das Erfassen, ich hätte schwören können, dass ich einen drin hatte. Also, für IE9 scheint es einen guten Grund zu geben, eine Höhe und Breite einzuschließen, schauen Sie sich diesen Blogbeitrag an.
Ich kann die Probleme, die seowarp.com hatte, durch Weglassen der Höhen- und Breitenattribute nicht reproduzieren. Ich habe .svg-Bilder sehr ausgiebig auf mehreren Websites verwendet (responsives Resizing mit rem) und sie haben alle das richtige Seitenverhältnis im Cross-Browser-Test. Immer wenn ich ein Bild mit einem schlechten Seitenverhältnis bemerkte, hatte es immer eine Höhe und Breite im .svg-Code, die ich vergessen hatte zu löschen. Ich definiere immer Höhe und Breite mit CSS und lasse sie aus dem .svg selbst weg. Ich habe bemerkt, dass Sie nur die Breite auf Ihrer Website definiert haben.
Ich bin sicherlich kein Experte… …interessiert, was der eigentliche richtige Weg dafür ist.
Was denken die anderen Trickser?
Nach weiterer unbeabsichtigter Wissenschaft scheine ich gelegentliche Probleme bei der Verwendung von .svg als Hintergrundbild mit Höhe und Breite zu haben, die durch das Löschen von Höhe und Breite innerhalb des .svg und die Verwendung von CSS zur Skalierung des Bildes behoben werden. Verwirrenderweise kann ich Probleme haben, wenn ich Höhe und Breite innerhalb des .svg weglasse, wenn ich ein .img-Tag zur Einbettung des Bildes verwende.
Hallo, ich habe festgestellt, dass Sie auch @import innerhalb des SVG-Dokuments verwenden können, um eine externe CSS-Datei zu laden.
Vielen Dank für Ihre detaillierte Behandlung von SVG-Bildern, Chris. Es war sehr hilfreich für mich, da wir es in einigen Apps (nur Webkit) verwenden wollen. Daher müssen wir uns auch keine Gedanken über Fallbacks oder Inkompatibilität machen.
Zuerst Chris, ein riesiges Dankeschön für den Artikel. Ich habe eine Menge Wissen gewonnen.<br/><br/>Ich bin auf eine „Ausgabe“ gestoßen, die vielleicht erwähnenswert ist, da ich nichts darüber gefunden habe. Wenn Sie das <object>-Tag und eine Data URI verwenden (um das CORS-Problem von Chrome zu umgehen, da ich Zugriff auf Elemente innerhalb des SVG haben wollte), scheint Chrome die Fähigkeit zu verlieren, Farbverläufe zu rendern.<br/><br/>Beispiel hier: http://jsfiddle.net/mikedidthis/rXJXq/1/<br/><br/>Ich glaube nicht, dass ich etwas übersehen habe. : (
Hallo, toller Artikel in der Tat, ich habe nur ein Problem
Ich habe mein SVG Base64-kodiert über den Mobilefish.com-Dienst, aber manchmal bekomme ich einen Fehler in Chrome, der sagt: ERROR 414 – URI too long.
Ich denke, es hängt von meinem Webserver ab, aber ich muss meine Sachen in die Produktion bringen und ich muss sicher sein, dass ich diesen Fehler nicht haben werde.
Haben Sie Ideen/Vorschläge, wie ich dieses Problem „beheben“ kann?
Vielen Dank im Voraus.
Hat jemand dasselbe Problem mit Base64-SVG-Data-URIs erlebt?
Ein zusätzlicher Trick für die Liste, rein zur Vollständigkeit, wenn nichts anderes. Ähnlich wie bei der Methode
<object/>mit dem Zusatz, dass sie auch CSS unterstützt (glaube ich… vielleicht).Anscheinend keine IE-Unterstützung überhaupt.
Chris, stell dir vor, eine ganze Tüte Erdnuss-M&Ms wäre heutige Währung für 100 Dollar. Stell dir dann vor, ich würde deine Adresse kennen. Ich würde dir ohne zu zögern eine Tüte Erdnuss-M&Ms schicken, mein Freund! Wie du schreibst – in leicht verständlicher Sprache artikulierend – ist Balsam für meine Seele. Ich habe das Internet durchsucht, um zum ersten Mal SVG zu lernen. Ich wurde fast abgeschreckt. Gott. Reden wir verwirrend. Dann fand ich dieses Juwel, Stunden später… Mann, erinnerst du dich an die Tüte M&Ms? Ja. Ich meinte es ernst! Vielen Dank, Mann!!!
Gute Sache, Chris, habe es bereits für einen Kunden verwendet. Sehr gute Zusammenfassung, vielleicht besser als MDN, was die Praktikabilität angeht. Danke nochmal!
Ich habe eine Weile nach Informationen über das Drucken von SVGs gesucht. Einige scheinen zu rendern, sind aber beschnitten, einige werden gar nicht angezeigt und ich kenne die Unterschiede nicht.
Zum Beispiel druckt dieser einfache Auflösungstest sie überhaupt nicht.
Aber Ihr Codepen-Beispiel rendert sie, aber sie sind beschnitten.
Irgendwelche Hinweise?
Hallo zusammen, ich verwende die Option „Data URIs for SVG“, und alles ist in Ordnung, außer der Hintergrundposition in IE.
Es scheint, dass IE das SVG nur zentriert anzeigt. Kann das nicht überschreiben. Ich hatte die Ausrichtung ursprünglich in einem Hintergrund-Kurzschlusscode, habe aber auch versucht, die CSS-Hintergrunddeklarationen zu trennen, ohne Erfolg.
Bestätigt das noch jemand, da ich vielleicht meine Zeit mit der Behebung dieses Problems verschwende!!
Hallo, danke für diesen nützlichen Leitfaden. Basierend auf diesem Leitfaden habe ich Weltflaggen erstellt, die nur von CSS gerendert werden: http://www.phoca.cz/cssflags/ . Natürlich hat es Vor- und Nachteile. Und der CSS kann verbessert werden (es ist nur experimentell).
Eine Sache, die ich entdeckt habe, ich weiß nicht, ob das für alle Dateigrößen gültig ist, aber die Base64-Kodierung ist viel größer als reiner SVG-Code.
Leider unterstützt Internet Explorer keinen rohen SVG-Code im Hintergrund-Attribut, daher ist dies der einzige Grund, SVG-Code zu kodieren, denke ich (vielleicht irre ich mich). Dasselbe mit URI-Encoding, die Ausgabe ist kleiner als Base64, aber für Firefox müssen Sie dieses Zeichen ändern: „#“ und natürlich funktioniert es in Internet Explorer auch nicht.
Auf jeden Fall nochmals vielen Dank für diesen Leitfaden.
Jan
@Jan gute Arbeit. Entschuldigung, dass ich das hier statt in Ihrem Support-Forum poste, aber mir sind die Streifen oben rechts und unten links im AU-Flag aufgefallen, die falsch sind…
@Jeremy
Hallo,
danke für die Info, es scheint, als gab es einige Probleme bei der Bereinigung des SVG.
Ich habe es manuell bereinigt und es scheint, dass es jetzt in Ordnung ist
http://www.phoca.cz/cssflags/#australia (drücke F5 – aktualisiere die Seite, da das falsche SVG zwischengespeichert sein kann)
Danke, Jan
Toller (inspirierender) Artikel. Ich verwende jetzt seit mehreren Jahren SVGs auf meinen und den Websites von Kunden. Ich habe sogar mein Logo in ein SVG umgewandelt – die Sprache scheint einfach genug zu sein. Ein letztes Rätsel für mich ist das verdammte CSS. Ich habe einen Farbverlauf als Hintergrund, der derzeit in „html“ zusammen mit „min-height:100%“ eingestellt ist. Warum? Dies scheint sicherzustellen, dass der Farbverlauf über die gesamte Länge des Viewports weiterläuft, auch auf Seiten, deren Inhalt *sehr* kurz ist. (Wie Einzeiler.) Der Farbverlauf wird jedoch für längere Seiten auf die volle Länge des Inhalts statt auf den Viewport gedehnt. Wie fülle ich konsistent (gerätunabhängig) den Viewport?
Vielen Dank für den Artikel – ich bin neu in SVG (und Illustrator) und das hat mir enorm geholfen.
Ich habe einen gläsernen Knopf in Illustrator nach diesen einfachen Anweisungen erstellt und ihn als SVG-Datei mit Ihren oben empfohlenen Einstellungen gespeichert. Er sieht in Illustrator großartig aus, sieht aber im Browser schrecklich aus: Der transparente Farbverlauf funktioniert überhaupt nicht. Ich habe danach gegoogelt, bis meine Finger bluten, aber nichts gefunden – gibt es eine Lösung?
Vielen Dank nochmals für Ihren großartigen Artikel.
Hallo Chris / wer sonst noch das liest,
Ich habe ein Bild in einem Unicode-Zeichen, ▼, das mir einen schönen Effekt gibt, ohne ein transparentes PNG erstellen zu müssen. Es sieht eigentlich ziemlich gut aus.
Ich frage mich, ob es möglich ist, das Bild darin zu animieren? Habe versucht, die Opazität zu animieren, aber es sieht nicht sehr gut aus (erreicht aus irgendeinem Grund nie die volle Opazität, schätze ein Bug in Webkit?) http://jsfiddle.net/n7Wy6/
Ich frage mich nur, was sonst noch möglich ist?
Ich habe so viel online recherchiert und kann wirklich nicht herausfinden, wie man ein SVG-Logo in Illustrator erstellt und es mit transparentem Hintergrund auf einer Website erscheinen lässt…
Ich möchte eine SVG-Datei für ein sehr kleines Symbol in einem Menü verwenden (um Zoom-Probleme zu bekämpfen), aber es erscheint mit einem weißen Hintergrund. Gibt es eine Lösung dafür??
Toller Artikel/Tutorial, hat sehr geholfen … Zusätzlichen Dank an Ben für seine Tweaks zur Barrierefreiheit (Post vom 7. März).
J
Wie macht man eine Fülländerung bei :hover, wenn das SVG-Symbol wie eine „hohle“ Box ist? Sobald ich in der Box bin und nicht wirklich auf dem dünnen SVG, verliere ich den Hover. Ich habe versucht, display:block auf einem übergeordneten Div zu setzen und den Hover darauf zu legen. Es scheint, dass ich nichts im XML-geladenen Stylesheet mit einem externen überschreiben kann.
Ich hoffe, das ergibt Sinn. Ich versuche, mit einem Umschlag-Symbol zu arbeiten, das aus sehr dünnen Linien besteht. Die Innenseite des Umschlags ist transparent. Wenn ich nicht auf den dünnen Linien bin, verliere ich den Hover.
Ich habe das obige Problem gelöst, indem ich einen Hover auf eine Gruppe verwendet habe, ein Rechteck mit Opazität 0 darin definiert und dann meinen Pfad. Auf diese Weise, wenn Sie ein dünnes Symbol haben, verwenden Sie das unsichtbare Quadrat, um den „Hotspot“ zu definieren.
Hinweis: Ich habe den HTML hier nicht gepostet, aber ich habe die von Chris beschriebene Objektmethode verwendet.
svg.css
/* Icons */
SVG
Hallo Technik-Nerds,
Kann mir jemand in einfacher Sprache sagen, wie man eine .svg-Bilddatei in eine HTML5-Webseite einfügt?
Ich bin altmodisch und benutze normalerweise das Standard-HTML-Format, möchte aber wissen, wie und wo ich den eingebetteten SVG-Code platzieren soll?
Was für ein fantastischer Beitrag und eine tolle Diskussion. Danke!
Ich frage mich, ob jemand mit der Erstellung eigener Schriften als alternatives Mittel zur Erzielung von Vektorgrafiken/skalierbaren Grafiken mit CSS-Steuerung experimentiert hat? Hat Fontface nicht eine bessere Unterstützung in älteren IE-Versionen als SVG?
http://caniuse.com/fontface
http://caniuse.com/svg
Ich möchte SVG in meinen Projekten verwenden, aber die Unfähigkeit zu cachen scheint ein riesiger Dealbreaker zu sein. Wenn man es für sein Logo verwendet, das auf jeder Seite ist, würde das nicht die gesamte Website nicht zwischenspeicherbar machen? Was ist, wenn es sich um eine große komplexe Website handelt, bei der das Caching für die Leistung entscheidend ist?
Danke für den Artikel! Zu den verwendbaren Eigenschaften für Styling habe ich Folgendes gefunden
http://www.w3.org/TR/SVG11/styling.html#SVGStylingProperties
Ich weiß nicht, ob das aktuell/relevant/implementiert ist.
Das Problem mit Firefox, das skalierte SVGs unscharf macht, wurde oben erwähnt, wurde ab Version 24 behoben. Die neueste Version zum Zeitpunkt des Schreibens ist 28. (24-04-2014)
Vielleicht bin ich verwirrt, aber da IE8 Javascript eigentlich nicht unterstützt, sehe ich nicht, wie das funktionieren wird.
if (!Modernizr.svg) {
$(‘img[src$=”.svg”]’).each(function() {
var $this = $(this); // this = img
$this.attr(‘src’, $this.attr(‘src’).replace(/svg$/, ‘png’));
});
}
Ich habe versucht, es hinzuzufügen (in einem Skript-Tag-Paar im Header) und es schlägt bei IE8-Tests fehl, ebenso wie die hier vorgeschlagene Lösung http://wedelivery.com/lab/svg/ (von jemandem oben gepostet).
Fehlt mir etwas? Kann mir jemand eine Seite zeigen, die einen sauberen Tausch von SVG zu PNG in IE8 mit diesem globalen Skript zeigt?
Die Version, die onerror verwendet, funktioniert, weil die Überlappung zwischen jscript (M$s Skriptversion und Javascript) ausreicht, um sie zum Laufen zu bringen, aber die globale funktioniert scheinbar nicht. Ich hätte gerne eine globale Lösung dafür, da wir jetzt die gesamte Website degradieren und vorschlagen, dass sie vielleicht einen neueren Browser in Betracht ziehen sollten.
Basierend auf Ihrem Artikel habe ich einen SVG-Optimizer und Base64-Encoder für die Befehlszeile erstellt. Er ist sehr einfach zu bedienen. „svgoptimizer -h“ zeigt an, wie er verwendet wird. https://gist.github.com/mrinterweb/11303706
Ich habe eine Frage? Ich habe die Objektroute für die .svg verwendet. Sie funktionierte in gewisser Weise großartig. Der Fallback .png funktionierte. Meine .svg zeigte online als Box in der richtigen Größe, aber sie enthielt den Code der .txt-Datei?? Ich habe meine .svg in ILL CS3 erstellt und DW CS3 zu HTML gemacht und hochgeladen… Ich habe es auf jede Weise versucht, sogar Ihre anderen Optionen, und immer noch – ich denke, es funktioniert, aber meine .svg zeigt als Textcode im Bildbereich mit Scrollbalken an… Ich habe sogar alle verschiedenen Optionen beim Speichern von .svg ausprobiert, die ich auf verschiedenen Websites gefunden habe… hmmm, können Sie mir helfen? Hat jemand das [was ich sicher bin, ist ein kleiner…] schon einmal erlebt… Muss ich die Cloud oder CS5 oder höher verwenden… Meine Website ist HTML 5 und responsiv… Ich bin ratlos. Es war mein erster Versuch, da ich möchte, dass alle meine Vektoren .svg sind, damit sie skalieren und großartig aussehen!
Vielen Dank für diesen Artikel, er ist sehr gut geschrieben und informativ, aber ich habe eine Frage. Wenn ich meine SVG aus Illustrator speichere, erkennt mein Code nicht die Größe meines Zeichenbereichs (Höhe und Breite werden nicht im Markup angezeigt) und mein Bild ist nicht responsiv. Laut Artikel scheint dies das Standardverhalten zu sein. Ich benutze Adobe CC, also sollte es das aktuellste sein. Muss ich eine Einstellung vornehmen, damit das SVG die Größe des Zeichenbereichs übernimmt? Derzeit rendert es, wenn ich es im Browser öffne, die volle Höhe und Breite, nicht die von mir eingestellten Werte. Gibt es eine Lösung dafür?
Toller Artikel. Ich habe vor kurzem angefangen, SVGs zu verwenden, und fand dies wirklich nützlich. Ich frage mich jedoch, ob mir jemand bei einem Problem helfen kann, mit dem ich mich beschäftige. Ich habe ein einzelnes SVG-Logo, das DEFS und USE für verschiedene Farben verwendet. Ich binde das Logo dann mit dieser Methode ein. Da das Logo in zwei separaten Bereichen der Seitenvorlage verwendet wird, wollte ich CSS verwenden, um die SVG-Füllfarbe abhängig von der eindeutigen ID des Objekts zu stylen. Ist das mit CSS möglich? Ich kann dies mit Skripten oder durch direktes Einfügen des SVG-Codes in die Vorlage tun, wollte es aber idealerweise mit CSS machen. Danke!
Vielen Dank für die Informationen, Sie haben alle meine Fragen auf einmal beantwortet.
Gutes Zeug, Chris! Danke für die detaillierte Erklärung.
Ich stoße gerade auf eine Open-Source-SVG-Hintergrundmusterbibliothek auf GitHub: http://buseca.github.io/patternbolt/