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.
<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
Mehr zu SVG use
- SVG use – Elemente und Gruppen kopieren
- SVG g group SVG-Elemente als Gruppe zusammenfassen
- SVG Pattern Muster als Füllung
Externe Quellen
- Canvas für responsives Inline-SVG
- Nano SVG Compressor Minify & embed fonts to save 80%* bandwidth, exports to multiple image formats.