Use SVG Use

SVG use für wiederholte Elemente

SVG inline in die Seite einzubinden, hat seinen Reiz: Kein zusätzlicher HTTP-Request bremst die Seite aus. Aber niemand kann sich des Gefühls erwehren, dass der HTML-Quelltext mit inline-SVG schneller aufgeht als ein Hefekloß.

18-12-15 SITEMAP

SVG ab nach unten

Ein oder zwei KB sind vielleicht erträglich, wenn es bei einem Einschluss bleibt. Mit einem iframe für die SVG-Datei geht nichts verloren, weder Schriften noch Javascript, aber ein responsives iframe-Element ist nicht so einfach responsiv wie ein direktes SVG und zudem kommt wieder der zusätzliche HTTP-Request ins Spiel.
Verbannen wir den gesamten SVG-Quelltext in den Fuß der Seite und verbergen ihn mit display:none, reichen drei Zeilen, um die Grafik mitsamt CSS und Animationen an Ort und Stelle zu platzieren.

Ans Ende der Seite
<div class="hidden">
   <svg viewBox="0 0 400 240">
      <g id="darktable" style="font-size:12px;font-family:Helvetica, Arial, sans-serif;fill:#ccc">
      …
      </g>
   </svg>
</div>
An Ort und Stelle platziert
<figure>
  <svg viewBox="0 0 400 240" width="100%" height="100%">
    <title>Infografik Darktable</title>
    <use xlink:href="#darktable" />
  </svg>
</figure>

SVG use ist also nicht nur praktisch zum Duplizieren von SVG-Elementen innerhalb einer Grafik, sondern zieht komplette Gruppen von einem Platz auf einen anderen. Die Gruppe rund um die vollständige Grafik braucht nur das ID-Attribute, das im use-Tag aufgeführt wird. Das angezeigte Duplikat braucht nur das use-Tag mit href=“#<ID“>.
Das SVG-Tag selber braucht keinen xlink-Namensraum, wenn sie inline in HTML sitzen.

SVG pattern und gradient

Braucht das SVG pattern, gradient oder filter, müssen die Elemente mit nach oben zur Anzeige der Grafik.

<div class="svginside" style="max-width:400px">
   <canvas width="747" height="526"></canvas>
   <svg viewBox="0 0 747 526" width="100%" height="100%">
      <title>Spektralkurven X,Y,Z</title>
      <linearGradient id="sp" y2="1" x2="700" y1="1" x1="0" gradientUnits="userSpaceOnUse">
         <stop stop-color="hsl(300,90%,10%)" offset="0"/>
…
         <stop stop-color="hsl(10,90%,40%)" offset="0.9"/>
         <stop stop-color="hsl(0,90%,20%)" offset="1"/>
      </linearGradient>
      <use href="#curves" />
   </svg>
</div>

Der Rest des SVG-Markups sitzt weiterhin im Fuß der Seite, und zwar ohne Gradient, Filter oder Pattern – einmal oben reicht. Das ist natürlich etwas schade, den ein paar Verläufe blasen das Markup schnell wieder auf.
Und warum sitzt das canvas-Tag über dem SVG?

Inline SVG responsive – auch in IE11

Eigentlich ist inline-SVG automatisch responsive. Alles war gebraucht wird ist das magische viewBox-Attribut des SVG-Elements. Im ewigen Ballast von Internet Explorer 11 funktionierte das einfache viewBox-Attribut allerdings nicht.

Mit einem leeren unsichtbaren <canvas>-Element passt auch IE 11 das SVG an die Größe des umfassenden Elements an.

SVG-Element mehrfach kopiert mit SVG use
<div class="turtle">
  <canvas width="300" height="234"></canvas>
  <svg viewBox="0 0 300 234">
    <use href="#turtle" />
  </svg>
</div>

Mit einer Handvoll CSS:

canvas {
  display: block;
  width: 100%;
  visibility: hidden;
}
svg {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
}
.turtle {
  position:relative;
  width:100%;
  max-width: 420px;
}

Gefunden bei Using canvas to fix SVG scaling in Internet Explorer

Externe Quellen

2022-04-15 SITEMAP BLOG