SVG, Scalable Vector Graphics. Ein Grafikformat das in XML notiert wird. Das bedeutet die Bilddateien werden in Textform abgelegt. Somit kann nicht nur jedes Bild mit einem Texteditor bearbeitet werden, sondern wir können die Bilder auch direkt in HTML-Dokumente einbinden. Ganz nebenbei sind sie vollständig durchsuchbar, ist ja alles Text.
<svg width="300" height="300" xmlns="http://www.w3.org/2000/svg"> <rect width="100%" height="100%" fill="red" /> <text x="200" y="125" font-size="60" text-anchor="middle" fill="white">Hallo Welt!</text> </svg>
<img src="bilddatei.svg" >
<!DOCTYPE html> <html lang="de"> <head> ... </head> <body> ... <svg width="300" height="300" xmlns="http://www.w3.org/2000/svg"> ... </svg> ... </body> </html>
Jede Grafik kann einen Titel enthalten.
<svg width="300" height="300" xmlns="http://www.w3.org/2000/svg"> <title>Titel des Bildes</title> ... </svg>
<svg width="300" height="300" xmlns="http://www.w3.org/2000/svg"> <title>Titel des Bildes</title> <desc>Beschreibung des Bildes</desc> ... </svg>
<line x1="0" y1="0" x2="300" y2="300" stroke-width="3" stroke="blue" />
<line x1="0" y1="0" x2="300" y2="300" stroke-width="10" stroke="blue" stroke-linecap="round" />
<rect x="50" y="50" width="200" height="200" stroke-width="3" stroke="black" fill="blue" />
<rect x="50" y="50" rx="8" ry="8" width="200" height="200" stroke-width="3" stroke="black" fill="blue" />
<circle cx="150" cy="150" r="40" stroke-width="3" stroke="black" fill="white" />
<ellipse cx="200" cy="100" rx="40" ry="60" stroke-width="3" stroke="black" fill="white" />
<polygon points="10,10 50,50 10,90" stroke-width="3" stroke="black" fill="white" />
<polyline points="10,10 50,50 100,10 120,80 270,100 140,130" stroke-width="3" stroke="silver" stroke-linecap="round" fill="none" />
<text x="200" y="125" font-size="60" text-anchor="middle" stroke-width="1" stroke="black" >I love SVG!</text>
Verweise werden ähnlich wie in HTML angegeben. Inhalt des Verweises kann ein beliebiges Element sein, Text ebenso wie bspw. ein Kreis.
<a xlink:href="..."> <text ... </a>
<a xlink:href="..."> <circle ... </a>
Es können auch andere Bilder eingebunden und somit in SVG "verschachtelt" werden.
<image xlink:href="..." x="..." y="..." width="..." height="..." />
Wenn mehrere Elemente die gleichen Eigenschaften haben sollen, kann man diese gruppieren. Alle Elemente innerhalb der Gruppe übernehmen die Eigenschaften der Gruppe.
<g fill="none" stroke="black"> <line ... <rect ... <g>
fill="..."
- definiert die Farbe der Füllung (none, white, black, red, green, blue, ..., #FFFFFF, #EEEEEE, #666666, ...)fill-opacity="..."
- definiert die Deckkraft der Farbe durch eine Prozentuale Angabe zwischen 0 und 1 (0, 0.5, 1, ...)stroke="..."
- definiert die Farbe des Striches (Farbangabe)stroke-width="..."
- definiert die Stärke des Striches (in Pixel)stroke-linecap="..."
- definiert den Abschluss des Striches (butt, round, square)stroke-dasharray="..."
- definiert gepunktete Linienführung durch Prozentuale Verteilung (in Pixel)Jedes Element kann transformiert werden, die Transformation bezieht sich dabei auf Position und Rotation.
transform="translate(x,y)"
- Angabe für X und Y in Pixeln (+X | -X , +Y | -Y)transform="rotate(grad)"
- Angabe zur Rotation in Grad (-360..0..360)transform="translate(x,y) rotate(grad)"
- kombinierte Angabetransform="translate(100,100) rotate(45)"
<text x="100" y="100" font-size="16" text-anchor="middle" stroke-width="1" stroke="black" transform="translate(100,100) rotate(45)">I love SVG!</text>
Besondere Bedeutung erhalten Transformationen im Zusammenhang mit Gruppierungen. So kann der Startpunkt einer Gruppe verschoben werden. Alle Elemente innerhalb der Gruppe bestimmen ihre Position relativ zur Gruppe. Auf diese Weise lassen sich auch komplexe Figuren einmalig definiert in beliebig verschobener und gedrehter Position verwenden.
<text x="100" y="100" font-size="16" text-anchor="middle" stroke-width="1" stroke="black" >I love SVG!</text> <g transform="translate(100,100) rotate(90)"> <text x="100" y="100" font-size="16" text-anchor="middle" stroke-width="1" stroke="black" >I love SVG!</text> <g>
SVG-Grafiken eignen sich wegen ihrer Art (saklierbar) für den responsiven Einsatz. Erreicht wird das am einfachsten mit der prozentualen Angabe "100%" für Breite und Höhe. Der Bildausschnitt der betrachtet werden soll wird dann mit dem "viewport" festgelegt.
Wir nehmen die bisherigen Beispiele, ein Bild mit 300 Pixel Breite und 300 Pixel Höhe, und machen es responsive.
<!DOCTYPE html> <html lang="de"> <head> <style> .svgbox { width: 50%; } </style> </head> <body> <div class="svgbox"> <svg width="100%" height="100%" viewbox="0 0 300 300" xmlns="http://www.w3.org/2000/svg"> ... </svg> </div> </body> </html>
Das Bild nimmt immer den gesamten Platz seines umschließenden Elements ein, in diesem Fall ein DIV. Das DIV wiederum nimmt die Hälfte der Bildschirmbreite ein. Wie hoch das Bild sein soll wird anhand der verfügbaren Breite automatisch errechnet. Verringert sich die Breite, verkleinert sich das Bild.
Um das ganze deutlicher zeigen zu können, hier ein Beispiel mit einem Männchen das eine Hantelstange hebt.
<!DOCTYPE html> <html lang="de"> <head> <style> .svgbox { width: 100%; } </style> </head> <body> <div class="svgbox"> <svg width="100%" height="100%" viewbox="0 0 300 300" xmlns="http://www.w3.org/2000/svg"> // Hintergrund <rect width="100%" height="100%" fill="white" /> // Gruppierung <g stroke="darkblue" stroke-width="10" stroke-linecap="round"> // Stange <line x1="10" y1="40" x2="290" y2="40" /> // Gewichte links <line x1="20" y1="30" x2="20" y2="50" /> <line x1="30" y1="20" x2="30" y2="60" /> <line x1="40" y1="10" x2="40" y2="70" /> // Gewichte rechts <line x1="260" y1="10" x2="260" y2="70" /> <line x1="270" y1="20" x2="270" y2="60" /> <line x1="280" y1="30" x2="280" y2="50" /> // Unterarme <line x1="60" y1="40" x2="90" y2="90" /> <line x1="240" y1="40" x2="220" y2="90" /> // Oberarme <line x1="90" y1="90" x2="150" y2="120" /> <line x1="220" y1="90" x2="150" y2="120" /> // Körper <line x1="150" y1="100" x2="150" y2="175" /> // Kopf <circle cx="150" cy="80" r="20" fill="white" /> // Beine Oberschenkel <line x1="150" y1="175" x2="115" y2="220" /> <line x1="150" y1="175" x2="170" y2="220" /> // Beine Unterschenkel <line x1="115" y1="220" x2="110" y2="275" /> <line x1="170" y1="220" x2="170" y2="275" /> // Füße <line x1="110" y1="275" x2="90" y2="290" /> <line x1="170" y1="275" x2="180" y2="290" /> </g> </svg> </div> </body> </html>
Das ganze sieht dann so aus: (spielt ruhig etwas mit dem Browser-Fenster)
Copyright © 2024