SVG Format
SVG mit Raphaël


SVG mit Raphaël—JavaScript Library

Ich habe im Beitrag SVG in Webseiten dargelegt, welche Möglichkeiten es gibt, SVG-Dateien in eine Webseite einzubinden. Daneben gibt es aber noch eine weitere Möglichkeit, die so aussieht, dass man mittels JavaScript den SVG-Code erzeugt und in den DOM-Baum der HTML-Seite einbindet. Es gibt eine ganze Reihe von JavaScript-Bibliotheken, die diese Vorgehensweise unterstützen. Eine der ältesten und umfangreichsten dieser Bibiotheken ist Raphaël.

Einleitung zu Raphaël—JavaScript

Raphaël ist eine JavaScript-Bibliothek für SVG-Inhalte. Diese JavaScriptdatei ist nicht gerade ein Leichtgewicht, die Entwicklerversion ist immerhin fast 300 kb groß und die verkleinerte Fassung bringt es auch auf fast 90 kb - gezippt sind es ca. 30 kb, aber Raphaël hat einiges zu bieten:

  • Der SVG-Code wird mit Hilfe von JavaScript direkt in den HTML-Code der jeweiligen Seite geschrieben
  • bei nicht SVG-fähigen Browsern von Microsoft (als Internet Explorer 8 oder auch älter) wird an Stelle von SVG VML (ein Eigengewächs von Microsoft) erzeugt
  • Raphaël liefert die Funktionen zum Erzeugen von Animationen gleich mit

Erstes Beispiel - Statische SVG-Grafik

Mit Raphaël kann man sowohl statische SVG-Grafiken, also solche, in denen sich nichts bewegt, als auch SVG-Animationen erstellen. Ich fange bei den Beispielen mit einer statischen SVG-Grafik an.

Das Grafikbeispiel

Das Beispiel zeigt einen Kreis, eine Ellipse, ein Rechteck, einen Pfad als Smiley und einen Text. Das sind alles Elemente einer SVG-Grafik, denen neben den Grundangaben zur Position und Größe noch weitere Parameter übergeben wurden.

Quellcode zur statischen SVG-datei mit Raphael

Der Quellcode für dieses Beispiel sieht so aus:

<!-- Raphael einbinden -->
<script src="raphael.js"></script>
<script>
// alles in onload, damit sichergestellt ist, dass Platzhalter zeichnung geladen ist
window.onload = function () {
// SVG-Zeichnungsfläche mit 640x480 Pixel im Element mit ID zeichnung erstellen
var paper = Raphael("zeichnung", 640, 480);
// Kreis bei x = 125, y = 240, mit Radius 60
var kreis = paper.circle(125, 240, 60);
// Eigenschaften des Kreises
kreis.attr({fill: "#ffff00", stroke: "#000", "stroke-width": 80, "stroke-opacity": 0.5});
// Ellipse
var elli = paper.ellipse(125, 140, 80,40);
// Eigenschaften der Ellipse
elli.attr({fill: "#00ff00", stroke: "#00f", "stroke-width": 80, "stroke-opacity": 0.5});
// Text
var text = paper.text(280, 190, "Alles\nfrisch\ngezeichnet");
// Texteigenschaften
text.attr({"font-size": 20, fill: "#000", stroke: "#f00", "stroke-width": 3, "stroke-opacity": 0.5});
// Text transformieren
text.transform("t100,100r45t-100,0");
// Rechteck gleich mit Eigenschaften
paper.rect(220, 140, 80,40,5).attr({fill: "#00ff00", stroke: "#00f", "stroke-width": 20, "stroke-opacity": 0.5});
// Pfad - ein Smiley
paper.path("m182,290q36,25 73,0m-65,-49c0,-4 3,-7 7,-7c4,0 7,3 7,7c0,4 -3,7 -7,7c-4,0 -7,-3 -7,-7m43,0c0,-4 3,-7 7,-7c4,0 7,3 7,7c0,4 -3,7 -7,7c-4,0 -7,-3 -7,-7m-82,20,0c0,-37 30,-67 67,-67c37,0 67,30 67,67c0,37 -30,67 -67,67c-37,0 -67,-30 -67,-67zm0,0l0,0c0,-37 30,-67 67,-67c37,0 67,30 67,67c0,37 -30,67 -67,67c-37,0 -67,-30 -67,-67z").attr({"stroke-width": 5});
}
</script>

Ich hätte den Smiley auch einfacher darstellen können, mit 3 Kreisen und einem kurzen Pfad, aber die von mir gewählte Variante zeigt eindrucksvoller die Fähigkeiten des Pfad-Befehls (siehe auch SVG Pfade). Ich werde im Abschnitt SVG mit Raphaël Schritt für Schritt erklären, wie man Raphaël zur Erstellung von SVG-Grafiken nutzt.

Beispiel mit Animation

Die Raphaël—JavaScript Library unterstützt auch Animationen mit SVG-Grafiken. Im Unterschied zu den im Abschnitt SVG Animationen erklärten Verfahren haben Animationen mit Raphaël den Vorteil, dass man sich um Browserkompatibiltäten keine Sorge machen muss.

Das Animationsbeispiel

Die SVG-Animation mit Raphaël zeigt einen roten Kreis, eine Art Button und daneben einen größeren grauen Kreis. Sobald man mit der Maus den roten Buttonkreis berührt, verfärbt dieser sich zu grün und der große graue Kreis verkleinert sich. Wenn man die Maus wegbewegt, wird der Button wieder rot.

Quellcode der SVG-Animation mit Raphaël

<!-- Raphael einbinden -->
<script src="raphael.js"></script>
<script>
// alles in onload, damit sichergestellt ist, dass Platzhalter holder geladen ist
window.onload = function () {
// Initialisierung
var R = Raphael("holder", 640, 480);
// Großer Kreis der später animiert werden soll
var grosserkreis= R.circle(320, 240, 200).attr({fill: "#000", "fill-opacity": .5, "stroke-width": 5});
// Button als Set von Elementen
var butt1 = R.set();
// zwei übereinanderliegende Kreise mit unterschiedlichen Eigenschaften
butt1.push(R.circle(25, 25, 30).attr({stroke: "#ccc", fill: "#f00", "fill-opacity": .9, "stroke-width": 2}),
 R.circle(25, 25, 30).attr({fill: "#fff","stroke-width": 1, opacity: .1}));
// Button verschieben
butt1.translate(10, 181);
// Button Mousereaktion zuordnen
// bei Mouseover andere Farbe, Umrandungsbreite, Fuellung etc. in 300 Millisekunden
butt1[1].mouseover(function () {
grosserkreis.animate({r:100, fill: "#0f0","stroke-width": 4, opacity: .9}, 300);
// bei Mouseover zweiten Kreis anpassen
}).mouseover(function () {
butt1[1].animate({fill: "#0f0","stroke-width": 4, opacity: .9}, 300);
// bei Mouseout zweiten Kreis wieder alte Eigenschaften
}).mouseout(function () {
butt1[1].animate({fill: "#fff","stroke-width": 1, opacity: .1}, 300);
});
};
</script>
<!-- der Platzhalter -->
<div id="holder"></div>

Ich werde im Abschnitt SVG mit Raphaël Schritt für Schritt erklären, wie man Raphaël zur Erstellung von SVG-Animationen nutzt.