HTML5 SVG
SVG
SVG står för Scalable Vector Graphics och är ett bildformat, som gif och jpg. Skillnaden mot dessa är att svg är vektorbaserad grafik(informationen sparas som geometriska figurer, som punkter, linjer, cirklar och liknande som tillsammans beskriver en bild jämfört med rastergrafik/bitmap som gif/jpg/png där varje pixel innehåller info) vilket gör att den kan förstoras respektive förminskas utan att bildinformation förstörs. Bildinformationen sparas i XML format. SVG är rekommenderat av W3C. Lite speciellt är att du kan skapa en svg bild i vilken texteditor som helst (även om det är mycket bättre att utnyttja ett program. Även online finns hjälpprogram).
Alla delar i en SVG bild finns i SVG DOM vilket gör att man lätt kan manipulera en del med hjälp av Javascript. Varje del blir som ett eget objekt och även om man bara ändrar en egenskap på delen(objektet) så ritar webbläsaren automatiskt om delen men ritar inte om övriga delar.
Vi visar nedan statiska bilder för att se hur de fungerar och ser ut. Men den stora vitsen med SVG-bilder är att de är dynamiska och kan vara interaktiva på webbsidan, dvs de kan ändra utseende beroende på vad användaren väljer.
SVG kontra PNG/JPG/GIF
SVG:
PNG:
Förstora sidan och se skillnaderna mellan vektorgrafik och raster(pixel)grafik.
Fördelar med SVG formatet kontra PNG/JPG/GIF:
SVG bilder kan skapas i en vanlig texteditor
SVG bilder är skalbara, dvs går att förstora utan kvalitetsförsämring
SVG är en öppen standard och använder XML för uppbyggnad
SVG bilder kan förändras med javascript
SVG går att komprimer och kan skrivas ut i olika upplösningar med hög kvalite
SVG på webbsidan
object
Object-taggen har en nackdel genom att det inte går att komma åt delarna via javascript.
embed
Embed-taggen har fördelen att det går att komma åt med javascript. Taggen är okej i HTML5 men egentligen inte i HTML4 och XHTML där taggen är "depreciated".
img
iframe
Det blir fult med ramen runt.
svg-kod direkt i webbsidan
<circle cx="50" cy="50" r="40" stroke="black" stroke-width="2" fill="red"/>
</svg>
Vad kan du rita
Vanliga figurer som cirklar, ellipser, rektanglar, linjer, polygoner, streckfigurer och text.
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="400" height="200">
<rect width="400" height="150" style="fill:rgb(255,0,0);stroke-width:5;stroke:rgb(0,0,0)"/>
<rect x="50" y="20" rx="20" ry="20" width="150" height="100" style="fill:green;stroke:black;stroke-width:5;opacity:0.5"/>
<circle cx="125" cy="55" r="30" stroke="black" stroke-width="2" fill="green"/>
<defs>
<linearGradient id="grad1" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" style="stop-color:rgb(255,255,0);stop-opacity:1" />
<stop offset="100%" style="stop-color:rgb(255,0,255);stop-opacity:1" />
</linearGradient>
</defs>
<ellipse cx="300" cy="75" rx="70" ry="30" fill="url(#grad1)" style="stroke:black;stroke-width:2"/>
<polyline points="220,20 240,20 240,30 260,30 260,20 280,20" style="fill:none;stroke:black;stroke-width:3" />
<defs>
<path id="path1" d="M65,55 a1,1 0 0,0 120,0" />
</defs>
<text x="10" y="150" fill="#ffffff" font-size="25" font-family="Verdana">
<textPath xlink:href="#path1">Kul med SVG!</textPath>
</text>
<text x="20" y="130" style="font-family: Arial;font-size:25;stroke:#000000;fill:#00ff00;">
<tspan x="20" dy="30" >Text på flera</tspan>
<tspan x="20" dy="30" >rader</tspan>
</text>
</svg>
Se w3schools sida med grundläggande figurtips. Där hittar du även många små exempel.
Där hittar vi även toningar(gradients).
Se upp med filter (fungerar inte i IE) och övrigt(misc) bland alla små exempel där vissa exempel bara fungerar i några webbläsare.
Lättast att rita svg-bilder är annars med ett program. Ett gratisprogram att ladda ner är Inkscape (rekommenderas av W3C och Microsoft). Det finns även flera online-editorer som ImageBot och Google's SVG-edit.
SVG kontra Flash
SVG är en konkurrent till Flash. Den största fördelen SVG har i det här fallet är att det följer olika standarder (som XML och DOM). Flash är inte öppen källkod utan ägs av Adobe.
SVG Animering (fungerar ej i IE)
<rect x="20" y="20" width="500" height="20" fill="black">
<animate attributeType="CSS" attributeName="opacity" from="1" to="0" dur="5s" repeatCount="indefinite" />
</rect>
</svg>
SVG filter
OBS! Filter fungerar väldigt begränsat eller inte alls i IE och Safari.
<defs>
<filter id="f1" x="0" y="0" width="200%" height="200%">
<feOffset result="offOut" in="SourceAlpha" dx="20" dy="20" />
<feGaussianBlur result="blurOut" in="offOut" stdDeviation="10" />
<feBlend in="SourceGraphic" in2="blurOut" mode="normal" />
</filter>
</defs>
<rect width="90" height="90" stroke="grey" stroke-width="4" fill="black" filter="url(#f1)" />
</svg>
SVG kontra Canvas
Båda har sin egen funktionalitet, det är inte så att man väljer en av teknikerna utan de har sina fördelar båda två.
Använd SVG:
för webbsidor med upplösningsoberoende delar, starkt interaktivt animerade delar, olika typer av statistik redovisningar, ändra i vektorbaserade bilder.
Använd Canvas:
interaktiv bildeditering som storleksändring, pixelförändringar, beskärningar. Skapa bilder(bitmapfiler) som statistikbilder, funktionskurvor, fraktaler. Skapa bakgrunder till spel.
Ibland kan det vara bra att använda båda teknikerna för att åstadkomma det du vill..
När ska man då inte använda dessa tekniker. För att till exempel skapa runda hörn, skuggor, effekter och genomskinlighet så finns det lösningar i HTML/CSS. I vsisa fall kan det vara bättre att använda Javascriptpaket som jQuery UI. Fråga dig själv om du verkligen behöver SVG eller Canvas över huvudtaget eller om du kan skapa allt med äkta HTML/CSS.
Källor
HTML5 & CSS3 FOR THE REAL WORLD, Goldstein, Lazaris, Weyl (Sitepoint 2011)
SVG Tutorial(Mozilla Developer Network)
dev.opera.com/articles/view/svg-or-canvas-choosing-between-the-two/ , maj 2012