SVG, eller Skalbar vektorgrafik, är en XML-stil markupdriven vektor grafisk återgivningsmotor för webbläsaren. SVG stöds i varje webbläsare, förutom IE < v9 and Android < v3. The same support is available for canvas (except canvas goes all the way back on Android), so the question often surfaces: which one should you use?
Idag ska vi undersöka SVG och förklara varför frågan om "vilken ska jag använda?" svaras vanligtvis av "vad försöker jag göra?". För att få en fullständig lista över element som utgör SVG, kolla in Mozillas dokument om ämnet. Du kan också se SVG DOM API där.
Vi börjar med att beskriva några unika fördelar med SVG. I stället för att granska alla 80 SVG-nodtyp kommer vi att förklara hur Illustrator snabbt kan få ett SVG-dokument till en webbsida. Vi tar också en titt på D3.js, ett kraftfullt SVG-manipulations JavaScript-bibliotek.
"SVG är inte avsett att användas för pixelmanipulation."
SVG har en hel del fördelar framför bilder eller kanvasbaserade renderingar för vissa applikationer. SVG är inte menat att användas för pixelmanipulation; Det hanterar emellertid vektorgrafik och programmatisk vektormanipulation mycket bra.
Om du inte har hört, är upplösningsoberoende och agnosticism för webbläsare ett hett ämne i front-end-utveckling (tänk "responsiv design") dessa dagar. De flesta av de lösningar som finns för att lösa upplösningsbaserade problem (till exempel i näthinneskärmar) involverar antingen en stor mängd onödiga data som hämtas (högbildsbyte) eller kompromiss för en webbläsare eller den andra (upping alla resolutioner, jämn när skärmen inte kommer att visa skillnaden). Detta gör att vi använder sig av hastigheten på flaskhalsen för nedladdning av data för att få högupplösta bilder till enheter som ofta finns på trådlösa datanät. Inte idealisk.
"SVG erbjuder ett sätt att göra grafiska element med full upplösning, oavsett storlekskärm, vilken zoomnivå eller vilken upplösning din användares enhet har."
SVG erbjuder ett sätt att göra grafiska element med full upplösning, oavsett vilken skärmstorlek, vilken zoomnivå eller vilken upplösning din användares enhet har. Detta är något som fram till SVG, vi såg bara med smart element styling via CSS och text rendering. Använda divs och: efter att elementen har skapat enkla former och andra effekter är onödiga med SVG. I stället kan du skapa vektorformer av alla slag.
Så skriver du HTML? JavaScript? CSS? Bra. Då vet du redan mycket om vad du behöver veta för att skriva SVG. SVG använder faktiskt ett XML-kompatibelt format för att definiera sina renderingsformer. Utöver detta kan du faktiskt utforma former i CSS och göra dem interaktiva med JavaScript. Flera JS-bibliotek finns för att hjälpa dig i den här världen, som D3.js och Raphael. Här är ett exempel på en SVG-elementgrupp (Envato-bladet). Du kan också se detta exempel på JSFiddle.
SVG: s DOM-nodbaserade API är redan tillgänglig mer än API-klientens klient-sida. Med denna konstruktion kan du:
DOM API ger ytterligare en rad klara fördelar för att använda SVG.
När du använder bilder i ett HTML-dokument med tagg, du definierar en fil som användarens webbläsare ska begäran. Den här förfrågan tar upp bandbredd och kräver mer dyrbar tid att ladda ner. Om din bild istället är en uppsättning domnoder knyter den den extra HTTP-begäran ut, vilket gör din webbplats snabbare och mer användarvänlig.
Trots webbläsarkrigarna erbjuder DOM API, över alla webbläsare, en omfattande flexibilitet när det gäller skriptinteraktivitet, som sträcker sig till SVG-element. Styling SVG händer via CSS. Att ha API-filer för webbläsarhändelser som är tillgängliga för SVG-element gör att interaktivt beteendeskript är en cinch. Anslut bara en hanterare till en specifik nod i SVG-elementet, och du är inställd.
Detta gäller inte för element som dras in på duken. Eftersom duken helt enkelt är en pixelbildningsmotor, hålls de dragna elementen inte i minnet som föremål. Skriptet skulle ha till uppgift att hålla dessa element samlade och övervaka all relevant position och storlek information att leta efter och brand händelser i en händelsesslinga. Utöver detta måste z-indexering hanteras av manuset också.
Låt oss ta en titt på ett exempel. Säg att du vill upptäcka svävar över en cirkel i duk. Obs! Vi säger bara att duken är full bredd i webbläsarfönstret, och vi använder jQuery bara för att hålla exemplet kortfattat.
var circleCenter = [200, 300], radie = 50; $ (fönster) .on ("mousemove", funktion (e) var mx = e.pageX, my = e.pageY; om (mx> circleCenter [0] - radie && mx < circleCenter[0] + radius && my > circleCenter [1] - radie && min < circleCenter[1] + radius) // now we are hovering );
Även om detta inte nödvändigtvis är ett svårt eller ovanligt kodmönster, om du är van vid webbläsarprogrammet, verkar det som en frustrerande process att bara kolla på svävaren. Detta är ett mycket vanligt mönster i andra lägre nivågränssnittsprogrammeringsmotorer som Unity3D eller Processing. Men i webbvärlden har vi verktyg till vårt förfogande som redan hanterar många gemensamma interaktiva mål vi kan ha. Du kan skriva en uppsättning av bekvämlighetsfunktioner för att göra vanliga uppgifter, men skulle du inte komma till rätta? Däremot kan vi se enkelheten i samma uppgift med SVG.
$ ("svg path # circle"). ("sväva", funktion (händelse) // Det är allt.);
Detta är tydligt mycket mer tidseffektivt för utvecklare som skriptar enkel interaktivitet.
Det finns många JavaScript-bibliotek där ute för duk (som KineticJS, som låter dig göra några ganska bra saker. Men om du är som jag, använder du inte full-on-fysikmotorer i dina webbapplikationer. Istället jag behöver oftast skalbara ikoner, interaktiva grafer och detaljerade, estetiskt underbara sätt att presentera information för mina användare. De flesta fysik jag behöver är enkla lätta ekvationer. Dessa grafiska element skapas enkelt med SVG och en mängd enkla fysik ekvationer kommer antagligen att hantera resten av mina behov. Så låt oss titta på några praktiska tillämpningar för SVG.
Nu när vi har tittat på några av fördelarna med SVG, låt oss undersöka varför många utvecklare fortfarande väljer att inte använda SVG. Det finns två huvudorsaker till att SVG inte används av många utvecklare.
Så självklart vill ingen verkligen sitta och redigera punkterna i SVG XML. Lyckligtvis behöver ingen! Det här är den del som människor ofta inte inser Det finns verktyg för att redigera SVG, så du behöver aldrig göra det för hand.
Om du äger en vektorredigerare kan det troligen spara din fil som en svg. Fortsätt och prova det. Öppna Illustrator, rita en cirkel eller två, och spara sedan filen som SVG. Öppna sedan den filen i Sublime Text eller en annan textredigerare. Du ser omedelbart att, förutom några extra metadata, är SVG XML redo att släppa direkt in i din HTML-fil. Du kommer troligen att se
(grupp),
(väg), och självklart (parent svg) -elementen.
Medan du helt kan släppa din SVG XML direkt i en HTML-fil, vad händer om du vill att SVG ska skapas dynamiskt? D3.js är "ett JavaScript-bibliotek för att manipulera dokument baserade på data". Med andra ord är det bra att generera SVG-element som stapeldiagram och linjekalkyler baserat på en uppsättning data. Vi har valt att visa D3 på grund av dess matchande ordförråd till själva SVG-implementeringen i webbläsaren; vara medveten om att det finns andra stora SVG-bibliotek ute i naturen (särskilt Raphael.js).
Även om D3.js gör mer än SVG-manipulation, för korthetens skull, det är allt vi ska använda för idag. (Se till att du tittar på exemplen på D3.js officiella webbplats, och kolla in den här verkstaden Mike har lagt upp på sin personliga sida.)
I det här första exemplet skapar vi helt enkelt en pulserande cirkel genom att använda Math.sin och en iterator med en setInterval. Pulserande cirkel
I det här exemplet uppdaterar vi en plottad linjediagram med några slumpmässiga värden. Linjediagram
SVG kommer att hantera mycket av dina behov för in-browser bildåtergivning. Medan det finns många skäl att använda SVG, som med något bra, finns det saker som det inte går bra med.
Här är några användbara länkar för att få dig vidare förankrad i SVG!
Vilka andra användningsområden har du hittat för SVG? Låt oss veta i kommentarsektionen och tack så mycket för att läsa.