Inline SVG mit Grunticon Fallback

Avatar of Chris Coyier
Chris Coyier am

DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!

Grunticon 2 ist da! Es gibt eine coole neue Website. Grunticon ist ein verdammt gutes Werkzeug zum Erstellen eines SVG-Icon-Systems. Der Workflow ist wie folgt:

  1. Habe einen Ordner voller SVG-Icons
  2. Führe Grunticon auf diesem Ordner aus, was alles produziert, was du brauchst
  3. Platziere das kleine Stück JavaScript im <head>
  4. Verwende HTML wie <div class="icon-image"></div>, wo du Icons haben möchtest
  5. Icons überall!

Grunticon 2 hat sogar eine Methode zum Einfügen von Inline-<svg>, damit du all diese Vorteile wie Skripting, Animation, CSS-Kontrolle usw. hast. Du fügst einfach ein Attribut hinzu

<div class="icon-burger alt" data-grunticon-embed></div>

Du könntest Grunticon genau so verwenden, wie es ist. Es ist nur ein etwas anderer Ansatz als der, über den ich viel gesprochen habe, der einen SVG-Sprite und inline <svg><use></use></svg> verwendet.

So wie ich es zeige, beginnst du mit inline <svg> im Dokument, wo du die Icons haben möchtest, und kümmerst dich von dort aus um die Fallbacks. Die möglichen Vorteile sind:

  • Wenn Inline-SVG unterstützt wird, findet überhaupt keine DOM-Manipulation statt, alles bleibt einfach liegen und funktioniert.
  • Es ist etwas einfacher, das Fallback eines Tages zu entfernen, wenn du entscheidest, dass du es nicht mehr brauchst.
  • (Danke an Scott für den Hinweis unten): Nicht-JS-Benutzer erhalten SVG-Icons anstelle von Fallback-PNGs, wenn du dich entscheidest, den Sprite nicht per Ajax zu laden, sondern ihn direkt in das Dokument einzubetten.

Das Coole an Inline-<svg>-First ist, dass wir Grunticon immer noch nutzen können, um uns bei den Fallbacks zu helfen!

1. Einen Ordner voller SVGs bekommen + SVG-Sprite erstellen

Du kannst sie auf jede erdenkliche Weise erhalten/erstellen, wie du SVG bekommen/erstellen kannst. Wir verwenden hier IcoMoon, weil es einfach und großartig ist und uns sofort den SVG-Sprite liefert. Wenn du die Sprite-Erstellung zu deinem Build-Prozess machen möchtest, lies dich ein.

2. Verwende die Icons wie gewohnt in deinem Dokument

Einfaches Beispiel

<button>
  <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-home">
    <use xlink:href="#icon-home"></use>
  </svg>
  Go Home
</button>

Stelle sicher, dass du xmlns="http://www.w3.org/2000/svg" darauf verwendest, was erforderlich ist, um ihnen in IE 8 Layout zu geben.

3. Verwende den normalen Grunticon-Build

Im Gruntfile.js

grunticon: {
  icons: {
    files: [{
      expand: true,
      cwd: "svg/",
      src: ["*.svg"],
      dest: "fallbacks/"
    }]
    // We don't need the enhanceSVG option here
  }
}

Dies erzeugt all die PNG-Fallback-Sachen für dich.

4. Im Kopf des Dokuments einen Inline-SVG-Test durchführen

Modernizr hat einen großartigen Inline-SVG-Test, den wir uns aneignen werden.

var supportsSvg = function() {
  var div = document.createElement('div');
  div.innerHTML = '<svg/>';
  return (div.firstChild && div.firstChild.namespaceURI) == 'http://www.w3.org/2000/svg';
};

if (!supportsSvg()) {

  // Do Grunticon stuff

} else {

  // Ajax for SVG sprite

}

5. Wenn der Test Inline-SVG unterstützt, per Ajax den Sprite laden

Das haben wir schon mal behandelt

var ajax = new XMLHttpRequest();
ajax.open("GET", "svgdefs.svg", true);
ajax.responseType = "document";
ajax.onload = function(e) {
  document.body.insertBefore(ajax.responseXML.documentElement,
                             document.body.childNodes[0]);
}
ajax.send();

Das hat nichts mit Fallbacks zu tun, das ist einfach der normale Prozess des Abrufens der Icons in unterstützten Browsern. Wir tun das, damit es in IE 9/10/11 funktioniert und wir den Sprite browserseitig cachen können.

6. Wenn der Test Inline-SVG nicht unterstützt, Grunticon verwenden

Es ist nur geringfügig modifiziert, indem du die erste CSS-Datei im grunticon()-Aufruf löschst. Das ist die, bei der SVG unterstützt wird, und die haben wir bereits abgedeckt.

// Inline script of grunticon.load.js here
grunticon(["", "/fallbacks/icons.data.png.css", "/fallbacks/icons.fallback.css"]);

Funktioniert anscheinend ziemlich gut

Moderne Browser
Immer noch zufrieden in IE 9, Fallback in IE 8 und Android gut.

Wenn du auch IE 6 und 7 brauchst...

So wie es ist, verwenden wir das <svg>-Element selbst und setzen bei Bedarf einen Hintergrund dafür als Fallback. IE 8 kann das, aber IE 6 und 7 nicht. Das SVG-Element verschwindet einfach (selbst wenn du den HTML5Shiv verwendest, seltsamerweise).

Wenn du diese alten Browser unterstützen musst, verschiebe die Klassennamen stattdessen auf ein umschließendes div.

<div class="icon icon-credit">
  <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-arrow-right"><use xlink:href="#icon-arrow-right"></use></svg>
</div>

Ein weiteres bemerkenswertes IE 6-7-8-Problem: Du erhältst kein background-size, also generiere die PNGs in der exakten Größe, in der du sie verwenden wirst.

Repo

Ich habe das Konzept in einem Repo hochgeladen, falls ich etwas vermasselt habe und ihr es beheben wollt.