vorige Präsentation: Pixel-Bilder | zurück zum Buch-Kapitel [esc] | Nächste Präsentation 2d Canvas
Scalable Vector Graphics (SVG, engl. „skalierbare Vektorgrafik“) ist die vom World Wide Web Consortium (W3C) empfohlene Spezifikation zur Beschreibung zweidimensionaler Vektorgrafiken. SVG ist ein Beispiel für XML.
SVG wurde erstmals im September 2001 veröffentlicht, die aktuelle Version ist Version 1.2, die seit Dezember 2008 vom W3C empfohlen wird, aktuell.
SVG hat eine lange und wechselvolle Geschichte hinter sich: es wurde bereits im Jahr 2001 veröffentlicht. Für die Darstellung im Browser war aber damals die Installation eines Plugins notwendig. Aber erst seit 2005 (Firefox, Opera), 2006 (Webkit) bzw. 2011 (Internet Explorer) wird SVG im Browser nativ dargestellt.
<svg width="200" height="200" style="float:left;"> <circle cx="100" cy="100" r="80" stroke="black" stroke-width="2" fill="#4e9a06" /> <rect x="80" y="100" width="90" height="90" stroke="black" stroke-width="2" fill="#204a87" /> </svg>
Mit SVG kann man zweidimensional zeichnen. Die grafischen Objekte werden
Inline SVG wird heute von den aktuellen Browsersn unterstütz, siehe can i use
Mit den Tags circle
, rect
, ellipse
, path
und polygon
werden
simple geometrische Elemente definiert.
Das Rechteck wird die Position seiner oberen linken Ecke, seiner Breite und seiner Höhe definiert. Der Kreis über Mittelpunkt und Radius, die Ellipse über Mittelpunkt und zwei Halbradien.
<circle cx="144" cy="38" r="18" stroke="#4e9a06" stroke-width="2" fill="#4e9a06" fill-opacity="0.6" /> <ellipse cx="170" cy="43" rx="27" ry="15" stroke="#73d216" stroke-width="2" fill="#73d216" fill-opacity="0.6" />
Viele Attribute kann man alternativ auch über CSS definieren.
<circle r="80px" cx="150px" cy="100px" style="stroke: #4e9a06; stroke-width: 2px; fill: #4e9a06; fill-opacity:0.6;" /> <ellipse cx="390" cy="100" rx="300" ry="80" style="stroke: #73d216; stroke-width: 2px; fill: #73d216; fill-opacity:0.6;" />
Für Pfade und Polygone wird eine Kurzschreibweise verwendet, bei der mehrere Punkte in
ein einziges Attribut d
des Tags geschreiben werden. Ein Pfad besteht aus Befehlen und Koordinaten.
Zwischen den Koordinaten kann man Kommas und beliebigen Whitespace einfügen.
<path d="M 149,109 L 149,127 L 127 144 L 140,172 L 188,167 L 191,119 L 149,109 z" fill="#edd400" fill-opacity="0.59" stroke="#c4a000" stroke-width="2" />
Wird der Befehl als Großbuchstaben geschrieben, dann werden die Koordinaten absolut interpretier, bei einem Kleinbuchstaben werden sie relativ interpretiert. Folgende Befehle erwarten eine fixe Anzahl von Koordinaten:
Buchstabe | Befehl | Parameter | Beschreibung |
---|---|---|---|
M,m | MoveTo | x y | Gehe zu dem angegebenen Punkt ohne eine Linie zu ziehen |
H,h | HLineTo | x | Ziehe eine horizontale Linie zur angegebenen Koordinate |
V,v | VLineTo | y | Ziehe eine vertikale Linie zur angegebenen Koordinate |
Z,z | Close Path | Schliesse den Pfad (gehe zurück zum Anfangspunkt) |
§
Folgende Befehle können mehrere Koordinaten auf einmal erhalten. Wie in der EBNF-Schreibweise wird hier die Wiederholung durch Klammern und ein + dargestellt:
<path d="M 0 10 l 50,50 50,-50 50,50 50,-50 50,50" /> <path d="M 270 35 q 25,-50 50,0 25,50 50,0 q 25,-25 50,0 q 25,25 50,0" />
Buchstabe | Befehl | Parameter | Beschreibung |
---|---|---|---|
L,l | LineTo | (x y)+ | Ziehe gerade Linie zu den angegebenen Punken |
Q,q | quadratic Bézier curveto | (x1 y1 x y)+ | Kurve zu x,y mit x1,y1 als Stützpunkt der beiden Tangenten |
C,c | cubic Bézier curveto | Kurve zu x,y mit x1,y1 und x2,y2 als Stützpunkte der Tangenten |
Farben werden wie in HTML mit hex-code definiert. Zusätzlich kann für jedes Objekt eine alpha-Transparenz mit opacity
gesetzt werden. Bei der ersten Abbildung mit dem kleinen blauen Quadrat war das:
fill="#204a87" opacity="0.75"
Farbverläufe werden separat definiert, und können dann mehrfach angewendet werden. In diesem Beispiel wird ein radialer gradient definiert und auf ein Objekte angewandt:
<radialGradient id="SVGID_1_" cx="0" cy="0" r="320.8304" gradientUnits="userSpaceOnUse"> <stop offset="0" style="stop-color:#FFDE17;stop-opacity:0.7"/> <stop offset="1" style="stop-color:#FFF200;stop-opacity:0"/> </radialGradient>
Der Effekt wirkt ganz verschieden, wenn man ihn auf ein Quadrat oder einen Pfad mit Sonnenstrahlen anwendet:
Mit dem Tag text
kann Text in SVG gesetzt werden. Das ist
an und für sich noch nicht sehr spannend:
<text x="122" y="81">Kreis + Ellipse</text>
Mit dem Tag textpath
kann der Text entlang eines
beliebigen Pfades gesetzt werden.
<defs> <path id="my_path" d="M 100,200 C 200,100 300, 0 400,100 C 500,200 600,300 700,200 C 800,100 900,100 900,100" /> </defs> <text font-family="Verdana" font-size="42.5" fill="red" > <textPath xlink:href="#my_path"> Es geht hinauf, und hinunter, und wieder... </textPath> </text>
Koordinaten in SVG werden als reelle Zahlen angegeben, nicht als Ganzzahlen! Es ist ein wirkliches Vektorformat.
Das ursprüngliche Koordinatensystem beginnt in der linken oberen Ecke,
die X-Achse zeigt nach rechts, die Y-Achse nach unten. Mit dem g
Tag
können Elemente gruppiert werden. Dabei kann man auch ein neues
lokales Koordinatensystem definieren.
<g transform="rotate(-5) translate(50,30)"> ... </g>
Fast jedes Attribut in SVG kann animiert werden. In folgendem
Beispiel wird as Attribut startOffset
des Elements textPath
animiert:
<textPath xlink:href="#my_path" startOffset="500"> Choo, choo, I'm a little train <animate attributeType="XML" attributeName="startOffset" from="1000" to="-600" dur="10s" repeatCount="indefinite" /> </textPath>
So sieht das Ergebnis aus:
Der SVG-Tag kann direkt in einem HTML-Dokument verwendet werden, wie auf dieser Seite.
Wenn man SVG-Nodes mit Javascript in das DOM einfügen will braucht man
eine neue Variante des createElement
Befehls: create Element with Namespace.
Der Namespace für SVG ist http://www.w3.org/2000/svg
.
const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg"); svg.setAttribute("width", 600); svg.setAttribute("height", 300); document.getElementById('grafik').appendChild( svg ); rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); svg.appendChild( rect );
Achtung: jQuery kennt nur Methoden zum Erzeugen von HTML, nicht von SVG. Aber muss sich also eine separate SVG-Erzeugungs-Method bauen wenn man jQuery für SVG verwenden will.
function $s(elem) { return $(document.createElementNS('http://www.w3.org/2000/svg', elem)); } var $svg = $s("svg"); var $circle = $s("circle").attr({...}); $svg.append($circle);
Code von Matthieu Charbonnier.
Die Library GSAP ermöglicht das definieren und kontrollieren von SVG und CSS Animation von JavaScript aus.
Hier ein Beispiel einer Translation:
gsap.to("#logo", {duration: 1, x: 100});
Unter der Adresse https://jakearchibald.github.io/svgomg/ kann man SVGs hochladen, optimieren und wieder herunterladen:
Fertige Icons und Illustrationen:
vorige Präsentation: Pixel-Bilder | zurück zum Buch-Kapitel [esc] | Nächste Präsentation 2d Canvas
/
#