SVG Vektorgrafik

Abschnitt 1

Grundformen

0 von 13 Übungen erledigt

Die Idee von SVG

Die meisten Bilder und Grafiken, die Sie verwenden und online finden, basieren auf Pixeln. Das ist ein Nachteil, da sie sich nicht gut skalieren lassen. Das heisst, wenn Sie ausreichend heranzoomen, werden Sie irgendwann immer die einzelnen Pixel sehen. Vektorgrafiken basieren auf einer völlig anderen Idee: Anstatt dem Computer zu sagen, welche Pixel ein- und ausgeschaltet werden sollen, geben wir dem Computer vor, welche Form wir möchten, und er füllt die Pixel bei Bedarf aus. Das bedeutet, dass der Computer immer weiss, wie das Bild aussehen sollte, unabhängig davon, wie stark wir heran- oder herauszoomen, und es mit der entsprechenden Auflösung zeichnen kann.

Derselbe Kreis als Rastergrafik und als Vektorgrafik. Zoomen Sie in diese Seite hinein (Ctrl/ + +): Der rechte Kreis bleibt scharf, der linke nicht.

Eine Rastergrafik ist also eine Tabelle von Farbwerten: für jeden Pixel ist gespeichert, welche Farbe er hat. Wie viele Pixel es gibt, wird beim Speichern des Bildes ein für alle Mal festgelegt — das ist die Auflösung. Eine Vektorgrafik ist dagegen eine Bauanleitung: «Zeichne einen Kreis mit Mittelpunkt (60, 60) und Radius 60». Erst wenn das Bild dargestellt wird, rechnet der Computer aus, welche Pixel dafür welche Farbe brauchen.

Rastergrafik Vektorgrafik
gespeichert wird die Farbe jedes Pixels die Form jedes Objektes
Auflösung fest beliebig
Vergrössern wird unscharf oder klotzig bleibt scharf
Dateigrösse je mehr Pixel, desto grösser je mehr Objekte, desto grösser
geeignet für Fotos Logos, Icons, Diagramme, Karten
Dateiformate .png, .jpg .svg, .pdf

Ein Foto lässt sich nicht sinnvoll als Vektorgrafik beschreiben — es besteht nicht aus einigen wenigen Formen. Umgekehrt ist ein Logo, das einmal auf einer Visitenkarte und einmal auf einem Plakat gedruckt wird, als Vektorgrafik viel besser aufgehoben. Genau deshalb sind Icons, Schriftarten und Landkarten im Web praktisch immer Vektorgrafiken.

Bemerkung

Eine SVG-Datei ist eine reine Textdatei. Sie können sie also mit jedem Texteditor öffnen und von Hand verändern — genau das machen wir in diesem Kapitel. Sie lässt sich auch mit einem Programm erzeugen und mit git versionieren. Für aufwändigere Zeichnungen gibt es Programme wie Inkscape, welche die Formen für Sie in SVG-Code umwandeln.

Grundstruktur

Skalierbare Vektorgrafiken (SVG) sind nichts anderes als eine Serie von Befehlen, die Ihrem Computer mitteilen, was er auf Ihrem Bildschirm zeichnen soll. Sie lassen sich ganz einfach in HTML-Code einbetten, können aber auch als separate Bilddateien (üblicherweise mit der Dateierweiterung «.svg») verwendet werden.

Der Aufbau ist derselbe, den Sie von HTML kennen: Es gibt Tags, die mit < und > geschrieben werden, und diese Tags haben Attribute der Form name="wert". Alles wird von einem <svg>-Tag umschlossen. Eine Form, die keinen Inhalt hat, schreiben wir als selbstschliessendes Tag, also zum Beispiel <circle … />. Kommentare werden wie in HTML mit <!-- … --> geschrieben.

Jedes SVG-Bild wird in einem Koordinatensystem gezeichnet. Das Koordinatensystem ist allerdings anders, als wir es aus der Mathematik gewohnt sind. Die y-Achse zeigt nach unten statt nach oben! Der Ursprung (0, 0) liegt also in der oberen linken Ecke. Die Längen werden dabei in «Benutzereinheiten» angegeben, was standardmässig einem Pixel entspricht.

Das SVG-Koordinatensystem. Diese Figur ist selber ein SVG, direkt in dieser Seite.

Beispiel


							
Listing 1. Roter Kreis als SVG (circle.svg)
Dasselbe Bild, hier im Browser gezeichnet.

Im vorliegenden Beispiel wird ein SVG-Tag zusammen mit einer Reihe von Attributen dargestellt. Wird das SVG-Tag direkt in eine HTML-Datei geschrieben, so geben die Attribute width und height des SVG-Tags an, wie viel Platz auf der Webseite für dieses Bild reserviert werden soll.

Wie wir in Listing 1 sehen können, lassen sich Grundformen mit diversen optionalen Attributen ergänzen. Unter vielen anderen sind da die folgenden zu nennen:

fill
Die Füllfarbe.
stroke
Die Strichfarbe.
stroke-width
Die Strichbreite.
opacity
Die Deckkraft der Form.

Wir werden diese Attribute in den folgenden Beispielen immer wieder anwenden.

Farben und Deckkraft

Für Farben gibt es — genau wie in CSS — mehrere Schreibweisen:

Farbnamen
Es gibt rund 150 vordefinierte Namen, zum Beispiel red, yellow oder tomato.
Hexadezimal
#4682b4 gibt den Rot-, Grün- und Blauanteil je als zweistellige Hexadezimalzahl an.
rgb(…)
rgb(60, 179, 113) gibt dieselben drei Anteile als Zahlen von 0 bis 255 an.
none
Gar keine Farbe. Ein fill="none" ist also nicht dasselbe wie ein weiss gefülltes Objekt: Was darunter liegt, bleibt sichtbar.

Beispiel


							
Listing 2. Die verschiedenen Schreibweisen für Farben (colors.svg)
Farbname, Hexadezimalwert, rgb(…) und none.

Die Deckkraft können wir mit einer Zahl zwischen 0 (durchsichtig) und 1 (deckend) steuern. Dabei gibt es drei Attribute, die man nicht verwechseln sollte:

opacity
Die Deckkraft der ganzen Form, inklusive Rand.
fill-opacity
Nur die Deckkraft der Füllung.
stroke-opacity
Nur die Deckkraft des Randes.

Beispiel


							
Listing 3. Deckkraft der ganzen Form, der Füllung und des Randes (opacity.svg)
Alle drei Quadrate sind gelb mit schwarzem Rand — nur die Deckkraft ist unterschiedlich verteilt.

Die Zeichenfläche und die viewBox

Neben width und height kann auch das viewBox-Attribut verwendet werden, um ein SVG-Element genauer zu platzieren.

<svg viewBox="min-x min-y width height">
Listing 4. Nutzung von viewBox

Die Attributwerte sind dabei die folgenden:

min-x
Die kleinste x-Koordinate, die dargestellt wird. Alles «weiter links» wird abgeschnitten.
min-y
Die kleinste y-Koordinate, die dargestellt wird. Alles «weiter oben» wird abgeschnitten.
width
Die Breite des zu zeichnenden Bildes. Alles «weiter rechts» wird abgeschnitten.
height
Die Höhe des zu zeichnenden Bildes. Alles «weiter unten» wird abgeschnitten.

Die viewBox ist also ein Ausschnitt des Koordinatensystems, und dieser Ausschnitt wird auf den zur Verfügung stehenden Platz gestreckt. Damit können wir zwei Dinge auf einmal erreichen: Wir wählen aus, welcher Teil der Zeichnung sichtbar ist, und wir bestimmen, wie stark sie vergrössert dargestellt wird.

Beispiel


							
Listing 5. Vier Kreise, von denen nur zwei sichtbar sind (viewbox-example.svg)
Der Code zeichnet vier Kreise. Die viewBox zeigt nur die rechte Hälfte, also sind nur zwei zu sehen.

Bemerkung

Es ist meistens praktisch, die viewBox so zu wählen, dass die Zeichnung genau hineinpasst, und auf width und height ganz zu verzichten. Dann passt sich das Bild automatisch dem Platz an, den es bekommt — und genau das ist ja der Sinn einer skalierbaren Grafik.

SVG in einer Webseite verwenden

Es gibt drei gängige Wege, eine Vektorgrafik in eine Webseite einzubauen.


					
Listing 6. Drei Möglichkeiten, ein SVG einzubetten (embed.html)

Der erste Weg schreibt den SVG-Code direkt in die HTML-Datei. Nur so können wir die einzelnen Formen später mit CSS gestalten oder mit JavaScript verändern. Die anderen zwei Wege verweisen auf eine separate Datei; das ist übersichtlicher und die Datei kann vom Browser zwischengespeichert werden.

Grundformen

Kreise und Ellipsen

Das Element <circle> erzeugt einen Kreis auf dem Bildschirm. Es verwendet drei grundlegende Attribute, um die Position und Grösse des Elements zu bestimmen:

r
Der Radius des Kreises.
cx
Die x-Koordinate des Mittelpunktes des Kreises.
cy
Die y-Koordinate des Mittelpunktes des Kreises.

Beispiel


							
Listing 7. Kreis (fancy-circle.svg)
Kreis mit Rand und Füllung.

Das Element <ellipse> erzeugt eine Ellipse. Es verwendet vier grundlegende Attribute:

rx
Die Länge der horizontalen Halbachse.
ry
Die Länge der vertikalen Halbachse.
cx
Die x-Koordinate des Mittelpunktes der Ellipse.
cy
Die y-Koordinate des Mittelpunktes der Ellipse.

Beispiel


							
Listing 8. Ellipse (ellipse-svg.svg)
Halb durchsichtige schwarze Ellipse.

Rechtecke

Das Element <rect> erzeugt ein Rechteck. Es gibt sechs Attribute, die die Position und die Form des Rechtecks steuern.

x, y
Die Koordinaten der oberen linken Ecke.
width, height
Die Breite und die Höhe des Rechtecks.
rx, ry
Die Radien für abgerundete Ecken. Fehlen beide, sind die Ecken nicht abgerundet. Ist nur einer der beiden angegeben, gilt er für beide.

Beispiel


							
Listing 9. Rechteck (rectangle-svg.svg)
Rechteck mit abgerundeten Ecken.

Linien, Polylinien und Polygone

Das Element <line> nimmt die Koordinaten von zwei Punkten als Parameter und zeichnet eine gerade Linie zwischen ihnen. Die Attribute heissen x1, y1 für den ersten und x2, y2 für den zweiten Punkt. Beachten Sie, dass eine Linie keine Füllung hat: Ohne stroke sehen Sie also gar nichts.

Beispiel


							
Listing 10. Linie (line.svg)
Eine grüne Linie.

Das Element <polyline> bietet die Möglichkeit, eine ganze Liste von Punkten miteinander zu verbinden. Da diese Liste lang werden kann, sind alle Punkte in einem einzigen Attribut points enthalten. Jeder Punkt muss sowohl eine x- als auch eine y-Koordinate enthalten. Die Liste (0, 0), (1, 3), (2024, 33) wird einfach als points="0 0 1 3 2024 33" geschrieben. Es empfiehlt sich für eine bessere Lesbarkeit, jeden Punkt auf eine neue Zeile zu schreiben.

Beispiel


							
Listing 11. Polylinie (polyline.svg)
Ein Zickzack aus sieben Punkten.

Beachten Sie, dass <polyline> standardmässig die Füllfarbe schwarz setzt. Um dies zu «entfernen», können wir fill="none" setzen.

Das Element <polygon> funktioniert sehr ähnlich wie <polyline>. Es verbindet ebenfalls eine Liste von Punkten geradlinig miteinander. Bei Polygonen wird allerdings der letzte Punkt wieder mit dem ersten verbunden, um eine geschlossene Form zu erstellen.

Beispiel


							
Listing 12. Polygon (polygon.svg)
Ein Dreieck als Polygon.

Text

Das Element <text> erzeugt einen Text auf dem Bildschirm. Wo der Text steht, bestimmen zwei Attribute: x ist die x-Koordinate des Textanfangs, y die y-Koordinate der Grundlinie. Buchstaben wie «g» oder «p» ragen also nach unten darüber hinaus.

Beispiel


							
Listing 13. Text (text.svg)
Der Punkt (0, 0) liegt links unter dem Text — der Text steht darum ausserhalb des Bildes.

Anders als bei den übrigen Formen steht der Text zwischen dem öffnenden und dem schliessenden Tag. Die Schrift selbst können wir mit den folgenden Attributen gestalten:

font-family
Die Schriftart, zum Beispiel sans-serif oder serif.
font-size
Die Schriftgrösse in Benutzereinheiten.
font-weight
Die Strichstärke der Schrift, zum Beispiel bold.
text-anchor
Welcher Teil des Textes bei (x, y) liegt: start (Standard), middle oder end. Mit middle wird der Text also um (x, y) zentriert.

Die Farbe des Textes wird mit fill gesetzt — ein Buchstabe ist für SVG eine Form wie jede andere.

Beispiel


							
Listing 14. Text gestalten (text-styled.svg)
Die graue Linie zeigt, wo x = 150 liegt: Beide Zeilen sind um diese Linie zentriert.

Striche gestalten

Bis jetzt haben wir von einem Strich nur die Farbe und die Breite bestimmt. Es gibt aber noch mehr zu holen:

stroke-linecap
Die Form der Strichenden: butt (Standard, gerade abgeschnitten), round (runde Enden) oder square (der Strich wird um die halbe Strichbreite verlängert).
stroke-linejoin
Die Form der Ecken: miter (Standard, spitz), round oder bevel (abgeflacht).
stroke-dasharray
Eine Liste von Längen für einen gestrichelten Strich. "30 10" bedeutet: 30 Einheiten zeichnen, 10 Einheiten Lücke, und so weiter.

Beispiel


							
Listing 15. Gerade Enden, runde Enden und ein gestrichelter Strich (stroke-styles.svg)
Alle drei Striche gehen von x = 20 bis x = 180. Der mittlere ist trotzdem länger — die runden Enden ragen hinaus.

Übungen

Zeichnen Sie einen blau ausgefüllten Kreis mit grünem Rand und Radius 30 px als SVG. Probieren Sie verschiedene Deckkraftstufen aus.

Zeichnen Sie drei Kreise in einer Reihe, die sich berühren und von links nach rechts kleiner werden. Die Kreise sollten alle unterschiedliche Füllfarben haben.

Lösungsvorschlag

										
Lösungsvorschlag (three-circles.svg)
Das Resultat.

Zeichnen Sie einen Kreis, dessen Füllfarbe hexadezimal und dessen Randfarbe mit rgb(…) angegeben ist. Die Füllung soll halb durchsichtig sein, der Rand aber deckend.

Hinweis

Es gibt ein Attribut, mit dem Sie nur die Deckkraft der Füllung verändern.

Lösungsvorschlag

										
Lösungsvorschlag (color-circle.svg)
Das Resultat.

Erstellen Sie die folgende SVG-Grafik.

Das Ziel.
Lösungsvorschlag

									
Lösungsvorschlag (big-ellipse.svg)

Erstellen Sie die folgende SVG-Grafik.

Das Ziel.
Lösungsvorschlag

									
Lösungsvorschlag (three-ellipse.svg)

Nehmen Sie Ihre Lösung von Übung 5.05 (sie ist in der Werkbank schon eingefüllt) und ergänzen Sie das <svg>-Tag mit einer viewBox.

  1. Wählen Sie die viewBox so, dass die ganze Grafik genau hineinpasst.
  2. Wählen Sie sie so, dass nur die linke Hälfte der Grafik zu sehen ist.
  3. Verdoppeln Sie nun in Ihrer viewBox nur die Breite und die Höhe. Was beobachten Sie?
Lösungsvorschlag
  1. viewBox="0 0 400 100"
  2. viewBox="0 0 200 100"
  3. Die Grafik wird kleiner dargestellt: Der Ausschnitt ist doppelt so gross, wird aber auf denselben Platz gezeichnet.

Erstellen Sie die folgende SVG-Grafik.

Das Ziel.
Lösungsvorschlag

									
Lösungsvorschlag (svg-square.svg)

Erstellen Sie die folgende SVG-Grafik.

Das Ziel.
Lösungsvorschlag

									
Lösungsvorschlag (two-squares.svg)

Zeichnen Sie die Schweizer Fahne. Diese ist quadratisch, und die vier Arme des Kreuzes sind gleich gross und um ein Sechstel länger als breit.

Hinweis

Sie brauchen dafür nur Rechtecke.

Das Ziel.
Lösungsvorschlag

									
Lösungsvorschlag (swiss-flag.svg)

Erstellen Sie die folgende SVG-Grafik.

Das Ziel.
Lösungsvorschlag

									
Lösungsvorschlag (simple-line.svg)

Zeichnen Sie drei waagrechte, gleich lange Striche untereinander:

  1. einen dicken Strich mit runden Enden,
  2. einen gestrichelten Strich,
  3. einen gepunkteten Strich.

Hinweis

Für die Punkte kombinieren Sie stroke-dasharray mit runden Strichenden.

Das Ziel.
Lösungsvorschlag

									
Lösungsvorschlag (dashed-lines.svg)

Erstellen Sie ein Schild mit einem abgerundeten farbigen Rechteck und zwei Zeilen Text darauf. Beide Zeilen sollen horizontal zentriert sein und sich in Grösse und Farbe unterscheiden.

Ein mögliches Ziel.
Lösungsvorschlag

									
Lösungsvorschlag (poster.svg)

Zeichnen Sie ein Haus mit Dach, Tür und zwei Fenstern. Verwenden Sie für das Dach ein <polygon>.

Ein mögliches Ziel.
Lösungsvorschlag

									
Lösungsvorschlag (house.svg)