Suchen Sie nach einer besseren Methode für SVG-Icons? Inline-SVG könnte Ihre beste Wahl sein, worüber Sie in diesem neueren Beitrag mehr erfahren können.
Sie könnten eine Icon-Sammlung entwerfen, bei der alle Icons exakt das gleiche Seitenverhältnis haben. Aber das wird wahrscheinlich nicht typisch der Fall sein. Der Container um ein kleines Becher-Icon könnte hoch und schmal sein. Der Container um einen kleinen Fisch vielleicht kurz und lang. Sie sollten darüber wahrscheinlich nicht zu viel nachdenken müssen, aber leider müssen Sie es doch irgendwie, wenn Sie ein SVG-Icon-System verwenden, wie ich es in der Vergangenheit beschrieben habe, da Sie das Attribut viewBox verwenden müssen, um diesen Container/Seitenverhältnis zu beschreiben.
Eine Verbesserung ist die Verwendung des -Elements in SVG anstelle der direkten Referenzierung von Formen (oder eines ), da Sie das viewBox direkt auf dem definieren können und dann keines benötigen, wenn Sie es später in einem verwenden.
Ein Beispiel ist angebracht.
Hier sind zwei Icons mit sehr unterschiedlichen Seitenverhältnissen, wie Sie am Zeichenbrett in Illustrator erkennen können.

Wir könnten sie so anpassen, dass sie alle innerhalb eines konsistenten Seitenverhältnisses platziert werden, aber ich finde es flexibler und praktikabler zu wissen, dass die Ränder Ihrer Icons genau dort sind, wo die Formen aufhören, nicht mit einem willkürlichen Leerzeichen darum herum.
Der „alte“ Weg
Wenn wir den Weg der -Blöcke gehen, könnten wir sie kombinieren zu
Dann verwenden Sie sie wie
Das legt eine beträchtliche Bürde auf den Implementierer, die viewBox-Attribute im Markup korrekt zu setzen. Das ist ein Grund, warum man versuchen möchte, all diese Icons mit einer konsistenten viewBox="0 0 100 100" (oder etwas Ähnliches) zu versehen, aber dann haben wir diese Art von willkürlichem Leerraum-Problem.
Der „neue“ Weg
Hier kommen Fabrice Weinberg und TxHawks ins Spiel. Fabrice arbeitet an grunt-svgstore, einem Grunt-Plugin zur Erstellung von SVG-Sprites aus einem Ordner von SVG-Dateien. Diese Art von Ding macht den SVG-Icon-Workflow schnell und einfach. Das heißt, abgesehen von der Tatsache, dass Sie viewBox für jedes Icon kennen müssen, bevor Sie es verwenden.
TxHawks schlug vor, dass grunt-svgstore zumindest data-*-Attribute auf die -Elemente setzen sollte, die jedes Icon umschließen, damit ein programmatischer Zugriff auf das Wesentliche möglich ist. Aber leider erlaubt SVG diese nicht (es hätte wahrscheinlich funktioniert, aber man kann genauso gut ein Build-Tool-spezifikationskonform machen). Aber es spielt keine Rolle, denn bald darauf schlugen sie vor, stattdessen zu verwenden, was sich als ziemlich gute Idee herausstellt.
Anstatt zu verwenden, um alle Icon-Formen zu umschließen, verwenden Sie , so:
Beachten Sie, dass die viewBox für jedes Icon definiert ist und Sie sie definieren, während Sie sie erstellen, im Gegensatz zu dem Zeitpunkt, an dem Sie sie verwenden. Das bedeutet, die Verwendung wird einfacher
Einfacher und weniger fehleranfällig.
Und es wird noch besser: Sie können hinzufügen
original-file's-desc
grunt-svgstore macht das jetzt, dank TxHawks und Fabrice!
Warum <symbol> besser für Icons ist
Nur um es auf den Punkt zu bringen
- Die
viewBoxkann auf dem Symbol definiert werden, sodass Sie sie nicht im Markup verwenden müssen (einfacher und weniger fehleranfällig). title- unddesc-Tags können innerhalb deshinzugefügt werden und sie „fahren mit“, wenn das Symbol verwendet wird, was die Barrierefreiheit erleichtert.- Symbole werden nicht angezeigt, wie Sie sie definieren, sodass kein
-Block erforderlich ist. - Dafür wurde
wahrscheinlich sowieso erfunden.
Demo
Es funktioniert
Siehe den Pen Hwcxp von Chris Coyier (@chriscoyier) auf CodePen.
Wundervoll. Werde ich definitiv auf einem meiner aktuellen Projekte ausprobieren. Danke Chris!
Das ist eine großartige Idee!
Wird Symbol überall dort unterstützt, wo Inline-SVG unterstützt wird?
Wow. Diese Technik ist *genau* das, wonach ich als Nachfolger des anderen mit dem SVG-Artikel gesucht habe.
Ich hatte eine Sammlung von Bildern, die alle SVG waren, aber unterschiedliche Ansichten hatten, dynamisch eingebunden und profitierten stark davon, über CSS gestylt zu werden, im Gegensatz zur alten Methode, die ich anwenden musste (ekliges Bild-Swapping). Ich denke, ich werde diese Technik noch oft zurückkommen. Danke Chris und Co!
Um die gute Laune nicht zu verderben… aber auf meinem System… das ist Windows 8 Pro mit Chrome 35 … Das Haifisch-Symbol im Codepen ist abgeschnitten…
Auf meinem gleichen System (Windows 8 Pro), aber mit Firefox 29 sieht der Hai gut aus…
Auch IE 11 sieht gut aus…
Trotzdem… toller Beitrag…
Michael Whyte
Wenn das Sie beruhigt, es sieht auf meinem Chrome 37 unter Windows 7 genauso gut aus.
Es besteht die Möglichkeit, dass es sich um einen temporären Fehler handelt und die Korrektur bald veröffentlicht wird.
Der Hai sieht bei mir in Chrome 35 gut aus, aber sobald ich hineinzoome, wird er abgeschnitten. Hineinzoomen macht etwas Ähnliches, es schrumpft nur. Ich weiß, dass Dinge durcheinandergeraten, wenn die Zoomstufe geändert wird, aber ich habe noch nie etwas so dramatisch geändert gesehen.
Ugh. Noch ein SVG-Implementierungsfehler.
Die „gute“ Nachricht ist, dass es nichts mit <symbol> oder <use>-Elementen zu tun hat (es gibt viele <use>-Element-Fehler).
Die schlechte Nachricht ist, dass es für jede grafische Darstellung gilt, die
a. Mit prozentualen Maßen dimensioniert ist oder eine prozentual basierte Standardgröße hat (wie ein <use>-Element, das auf ein <symbol>-Element verweist – die Standardgröße beträgt 100% der Höhe und Breite).
b. Sich in einem SVG befindet, das ein standardmäßiges Koordinatensystem verwendet (d.h. kein eigenes viewBox-Attribut hat).
Wie @Charles identifiziert hat, ist das Problem bei den Standardeinstellungen des Browsers nicht sichtbar, aber es tritt auf, wenn das Browserfenster hinein- oder herausgezoomt ist. Ich habe keine Beta-Versionen von neueren Chrome-Versionen, aber ich habe es mit Opera getestet und dasselbe Problem gehabt, also scheint dies tief in der Webkit-Quellcodebasis zu liegen.
Chromium Issue 334526 scheint relevant zu sein, keine Erwähnung einer bevorstehenden Behebung.
http://codepen.io/AmeliaBR/pen/stAki?editors=110
Ich hatte dasselbe Problem, als ich diese Technik kürzlich bei einem Projekt verwendete, und die Lösung war, das viewBox zum :( hinzuzufügen
Wenn jemand eine andere Lösung findet, bitte mitteilen!
Das war mein EINZIGES Problem, das ich mit SVG-Icon-Sprites hatte (ich habe sie immer noch benutzt und geliebt) und jetzt ist es gelöst! Danke, dass Sie großartig sind, ich kann es kaum erwarten, es in meinem nächsten Projekt zu verwenden und mir keine Sorgen mehr über diese verfluchten viewBoxes machen zu müssen.
Großartig! Ich hoffte, jemand würde das Problem mit der viewBox umgehen. Ich werde das auf jeden Fall zu meinen Gunsten gegenüber Font-Icons verwenden.
Hurra! Danke für Ihre sorgfältige Recherche, Chris.
Das ist endlich das fehlende Puzzleteil, auf das ich gewartet habe, um http://stackicons.com von Icon-Font-basiert auf SVG-basiert zu übertragen!
Gulp-Plugin: https://www.npmjs.org/package/gulp-svg-icons/
Haben Sie eine saubere Lösung für PNG-Fallback mit Gulp gefunden?
Ein wichtiger Tipp. Es vereinfacht das Markup wirklich.
Ein Hinweis zu den Titel- und Beschreibungs-Elementen: Nicht alle Browser/Screenreader-Kombinationen rufen den beschreibenden Text von einem Element ab, das mit einem <use>-Element dupliziert wird. Daher hat die Definition des Titels innerhalb des Symbols möglicherweise keine Auswirkung, wenn das Symbol verwendet wird.
Die Unterstützung von Screenreadern für diese Elemente ist im Allgemeinen noch nicht so gut wie gewünscht, aber ich habe andere Tests gesehen, die auf die spezifischen Probleme mit <use> hinweisen (Entschuldigung, konnte den Link nicht finden).
Hoffentlich wird die Unterstützung für die integrierten Barrierefreiheitsfunktionen bald besser, aber in der Zwischenzeit möchten Webentwickler möglicherweise andere Möglichkeiten in Betracht ziehen, Textbeschreibungen ihrer Icons einzufügen, wenn diese für die Bedeutung unerlässlich sind (siehe den verlinkten Artikel für Beispiele).
Ich habe diese Methode gerade ausprobiert und festgestellt, dass das Symbol nicht richtig in seiner viewBox angezeigt werden kann, wenn ich die Seite zoome, da die viewBox in defs definiert ist. Das tritt jedoch nicht auf, wenn ich verwende.
Das habe ich gerade auch entdeckt. Gibt es eine Lösung?
Das funktioniert auf meinem neuen Windows XP-Rechner mit IE6 nicht
Das ist ziemlich großartig. Aber damit das funktioniert, müssen diese Icons immer noch eine feste Breite und Höhe mit demselben Seitenverhältnis haben, oder? Aktuell muss man immer noch diese Padding-Bottom-Technik verwenden, um Flüssigkeit zu erreichen!
Es gibt keine Möglichkeit, das Wrapper-SVG auf seine Inhalte schrumpfen zu lassen, wie es ein Span mit einem proportionalen Icon-Font könnte. Das Symbol schrumpft oder dehnt sich, um in das SVG zu passen, angepasst an das preserveAspectRatio-Attribut, aber wenn Sie die tatsächlichen SVG-Dimensionen an die Proportionen anpassen möchten, benötigen Sie zusätzliche CSS-Regeln für jedes Seitenverhältnis.
Die „Padding-Bottom-Technik“ funktioniert irgendwie mit einem „Slice“-preserveAspectRatio-Attribut auf dem Symbol selbst, allerdings nur, wenn Sie mit Ihren
overflow:visible-CSS-Regeln großzügig sind. Sie müssen es für Chrome und IE auf dem Symbol zulassen und für Firefox auf verschachtelten <svg>-Elementen (wegen der Art und Weise, wie sie <use>-Elemente implementieren).Beim Verwenden von Bottom-Padding haben Sie jedoch ein oben ausgerichtetes Bild innerhalb des Icon-Quadrats. Wenn Sie einen Zentrierungswert für preserveAspectRatio verwenden, wird es innerhalb der „offiziellen“ Höhe des SVG zentriert, ohne Polsterung, sodass Sie das SVG innerhalb von oberen und unteren Polsterungen zentrieren müssen, um die Dinge zum Laufen zu bringen. Die Dinge geraten auch durcheinander, wenn Sie herunterskalieren, so dass die offiziellen SVG-Dimensionen dazu führen, dass das Symbol horizontal aus dem SVG herausragt.
Die Alternative besteht darin, viewBox- und preserveAspectRatio-Attribute auf dem SVG selbst anzuwenden, aber das hebt den Vorteil sauberer Markup durch die Verwendung von Symbolen mit eigenen viewBox-Attributen auf!
http://codepen.io/AmeliaBR/pen/lykCm/?editors=110
Ich hoffe wirklich, dass SVG2 bessere Regeln für die automatische Skalierung von Inline-SVG übernimmt, damit wir uns nicht mehr so abmühen müssen…
Tolles Tutorial, Sir… #Futuristisch
Ein weiterer Vorteil des Wechsels zu
symbolist, dass er die Einbeziehung vondefs-Blöcken aus den Original-SVGs in das generierte ermöglicht und somit die Verwendung von Verläufen, Clipping-Pfaden usw. in Icons ermöglicht.Das bedeutet, dass
wird zu
Dadurch können wir die innerhalb der ursprünglichen SVGs definierten Verläufe konsistent über alle
symbols hinwegusen.Das bedeutet jedoch, dass wir für die Darstellung von Verläufen das SVG mit
visibility:hidden;anstattdisplay:none;ausblenden müssen.Ich glaube, ich könnte vor Glück weinen. Ich habe letzte Woche mit viewBox-Parametern gerungen und nicht wirklich verstanden, warum es mir so schwer fiel.
Hat sonst noch jemand festgestellt, dass diese Technik bei IE nicht funktioniert, wenn externe SVG-Sprites mit dem Tag einbezogen werden? Mir ist bewusst, dass IE externe SVG-Dateien OOB nicht zulässt (obwohl Microsoft sagt, dass dies derzeit in Betracht gezogen wird).
Ich benutze svg4everybody, was früher funktionierte, aber jetzt, wo ich zu Symbolen wechsle, weigert es sich zu funktionieren. Irgendwelche Ideen?
Entschuldigung, Tippfehler. Meinte "externe SVG-Sprites mit dem 'use'-Tag einbeziehen".
Diese Technik wird mit externen SVGs in keinem Browser wie erwartet funktionieren. Das viewBox-Attribut wird ignoriert, egal ob es sich um das externe <symbol>- oder <svg>-Element handelt. Wie bei der <use>-Technik ignoriert IE das externe SVG komplett.
Ihre JavaScript-freien Optionen mit <symbol> sind
1. Nur interne SVGs verwenden.
2. Immer das viewBox-Attribut zu jedem SVG hinzufügen.
Ihre JavaScript-Optionen sind
1. Eine Syntax erraten und befolgen, von der Sie hoffen, dass sie nativ wird.
2. Eine Syntax verwenden, die völlig einzigartig ist.
Meiner Meinung nach sind all diese Optionen gültig. Die Anforderung eines JavaScript, das niemals kaputt geht, ist ein lohnenswerter Nachteil, um das viewBox-Attribut für jedes einzelne SVG auf jeder einzelnen Seite nie schreiben zu müssen.
In der Zwischenzeit werde ich Option 1 verfolgen: http://discourse.specifiction.org/t/simple-svg-markup/92
Danke für Ihre Antwort Jonathan, nur ein paar Dinge.
Ich glaube nicht, dass das wahr ist. Ich habe es geschafft, ein externes SVG von Symbolen erfolgreich zu verwenden. Es funktioniert in allen Browsern außer IE.
Ich glaube, die JavaScript-freien Optionen werden für große Projekte nicht funktionieren, also bleiben die JS-Optionen.
Ich überlege noch, was hier am besten wäre, werde aber diesen Thread aktualisieren, wenn ich etwas Zufriedenstellendes finde.
Diese SVG-Sache, die ich gerade gesagt habe. Total falsch. Nicht 100% falsch. Aber größtenteils falsch. Ich habe immer noch gegen <g> getestet. IE unterstützt externe SVGs immer noch nicht. Ich habe https://github.com/jonathantneal/svg4everybody aktualisiert, um mit <symbols> zu funktionieren.
Schön, muss ich mal ausprobieren. Wie funktioniert das vertikal ausrichten neben anderen Elementen?
Verwende derzeit display table & table cell.
Es sind aufregende Möglichkeiten, die wir mit den neuen Methoden anbieten, die auf dem neuesten Stand sind, obwohl alles ein wenig stressig ist.
Mit freundlichen Grüßen.
Könnten Sie die Vorteile der Verwendung von
symbolanstelle von (verschachteltem)svgerläutern? Gibt es welche?Beispiel
Hallo zusammen
Ist es möglich, einen Pfad im Symbol-Tag mit CSS3 Keyframe-Animationen zu animieren? In meinen Fällen funktioniert es nicht.
Beispiel: http://codepen.io/anon/pen/Hfbmr
Cheers Philip
Übrigens ist es nicht zwingend erforderlich, aber die SVG 1.1-Spezifikation empfiehlt,
symbol-Elemente innerhalb vondefsfür Klarheit und Barrierefreiheit zu platzieren. Es ist wahrscheinlich eher theoretisch, als dass es wirkliche Auswirkungen auf die Barrierefreiheit hat.Das ist so genial
Vektor (check)
Mehrfarbig (check)
Einzelner Serveraufruf für alle Ihre Vektorressourcen (check)
Es ist der heilige Gral
Hey, das scheint wirklich cool zu sein! Ich fand es cool genug, um diese Technik mit grunt-svgstore bei einem Projekt zu verwenden. Aber ich habe ein großes Manko bemerkt, bei dessen Lösung Sie mir hoffentlich helfen können. Wie gehen Sie mit Hover-Zuständen um? Wenn Sie das SVG auswählen, das Sie einem Hover-Zustand geben möchten, funktioniert es nicht, weil Sie die tatsächliche SVG-Form nicht auswählen können, wenn Sie nur „. Auf der anderen Seite, wenn Sie die Form direkt auswählen, wie z. B.
#icon-arrow, funktioniert es nicht, weil Sie diese Form nie tatsächlich überfliegen, da die sichtbare Form nur eine Referenz darauf ist… oder doch? Haben Sie Ideen/Erfahrungen, die Sie teilen können?Vielen Dank!
Meine Lösung dafür: http://codepen.io/jjenzz/pen/AxLKz
Das fill=”currentColor” im Symbolpfad, das am Anfang deklariert ist, scheint das zu ermöglichen?
Sie könnten Regeln hinzufügen, die nicht bereits im ursprünglichen SVG verwendet werden, wie
strokeoderstroke-width.Andere, wie
fill, die Standard sind, können mit ausgefallenen Werten geschrieben werden, sodass sie nicht angewendet und später behoben werden können. DEMODas war eigentlich eine Antwort auf ↑ Flavio Gortana https://css-tricks.de/svg-symbol-good-choice-icons/#comment-1583277
Hallo,
Gute Nachrichten. Alle Zoom-Probleme sind mit Chrome Canary v.38 gelöst.
Es stellt sich heraus, dass
<symbol></symbol>über<use></use>im Dokument stehen muss, sonst funktioniert diese Technik nicht. Sie können also nicht alle Ihre Icons am Ende des Dokuments haben.Problem mit Symbol gefunden, wenn die Seite in Webkit skaliert wird
http://monosnap.com/image/SRqgBNCb6qSjT12yAYPtxb5poXgdMI
Code hier – http://codepen.io/vikmind/full/sAmjK/