Datakurser
Aktuell vecka: 48

Tillbaka till toppen

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: png-bild

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 data="cirkel.svg" height="100" width="100" type="image/svg+xml"></object>

Object-taggen har en nackdel genom att det inte går att komma åt delarna via javascript.

embed

<embed height="100" width="100" src="cirkel.svg" type="image/svg+xml" />

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

svg-bild

<img src="cirkel.svg" alt="svg-bild" height="100" width="100" />

iframe

<iframe height="100" width="100" src="cirkel.svg"> </iframe>

Det blir fult med ramen runt.

svg-kod direkt i webbsidan

<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="100" width="100">
<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.

Kul med SVG! Text på flera rader

<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)

<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="500" height="20" >
<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.

<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
<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)

w3schools

SVG Tutorial(Mozilla Developer Network)

dev.opera.com/articles/view/svg-or-canvas-choosing-between-the-two/ , maj 2012

openclipart (gratis svg-bilder)

svg tutorial på jenkov.com

Raphaël is a small JavaScript library that should simplify your work with vector graphics on the web.

Checka din kod

JSHint

Chrome Developer Tool
(F12 eller Ctrl+Shift+I)

Firefox Developer Tool
(F12 eller Ctrl+Shift+K)

En liten film om ovanstående (15 min)

Lösningsförslag

PB

Alrik's