Perché non stai usando SVG?

SVG, o Grafica vettoriale scalabile, è un motore di rendering grafico vettoriale basato su markup in stile XML per il browser. SVG è supportato in tutti i browser, ad eccezione di 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?

Oggi esamineremo l'SVG e spiegheremo perché la domanda "quale dovrei usare?" di solito viene risposto da "cosa sto cercando di fare?". Per ottenere un elenco completo di elementi che compongono SVG, consulta i documenti di Mozilla sull'argomento. Puoi anche vedere l'API DOM SVG.

Panoramica

Inizieremo illustrando alcuni vantaggi unici di SVG. Quindi, invece di rivedere tutti gli 80 tipi di nodi SVG, spiegheremo come Illustrator può ottenere rapidamente un documento SVG in una pagina web. Daremo anche un'occhiata a D3.js, una potente libreria JavaScript di manipolazione SVG.

"SVG non è pensato per la manipolazione dei pixel."

I principali vantaggi di SVG

SVG presenta alcuni vantaggi rispetto alle immagini o ai rendering basati su canvas per alcune applicazioni. SVG non è pensato per la manipolazione dei pixel; tuttavia, gestisce molto bene la grafica vettoriale e la manipolazione vettoriale programmatica.

Risoluzione dell'indipendenza

Nel caso in cui non si sia ascoltato, l'indipendenza dalla risoluzione e l'agnosticismo del browser è un tema scottante nello sviluppo front-end (si pensi al "responsive design") al giorno d'oggi. La maggior parte delle soluzioni esistenti per risolvere i problemi basati sulla risoluzione (ad esempio per gli schermi retina) comportano una grande quantità di dati non necessari scaricati (sostituzione immagine ad alta risoluzione) o compromessi per un browser o l'altro (aumentando tutte le risoluzioni, anche quando lo schermo non mostra la differenza). Questo ci fa affidare alla velocità del collo di bottiglia della velocità di scaricamento dei dati per portare immagini ad alta risoluzione a dispositivi che spesso si trovano su reti di dati wireless. Non ideale.

"SVG offre un modo per realizzare elementi grafici a piena risoluzione, indipendentemente dalla dimensione dello schermo, dal livello di zoom o dalla risoluzione del dispositivo dell'utente".

SVG offre un modo per realizzare elementi grafici a piena risoluzione, indipendentemente dallo schermo delle dimensioni, dal livello di zoom o dalla risoluzione del dispositivo dell'utente. Questo è qualcosa che fino a SVG, abbiamo visto solo con uno stile intelligente degli elementi tramite CSS e rendering del testo. Utilizzo di div e: dopo che gli elementi per creare forme semplici e altri effetti non sono necessari con SVG. Invece, puoi creare forme vettoriali di tutti i tipi.

API DOM basata su Nodo Super Accessibile

Quindi scrivi HTML? JavaScript? CSS? Buono. Allora sai già molto di ciò che devi sapere per scrivere SVG. In realtà, SVG utilizza un formato compatibile con XML per definire le sue forme di rendering. Oltre a questo, puoi effettivamente creare forme in CSS e renderle interattive con JavaScript. Esistono più librerie JS per assisterti in questo mondo, come D3.js e Raphael. Ecco un esempio di un gruppo di elementi SVG (la foglia Envato). Puoi anche vedere questo esempio su JSFiddle.

         

L'API basata su nodo DOM di SVG è già più accessibile rispetto all'API canvas solo lato client. Con questa costruzione puoi:

  • Creare immagini basate su documenti SVG sul lato server
  • Ispeziona elementi SVG come qualsiasi altro elemento HTML
  • Gestisci programmaticamente forme, stili e posizioni con la tecnologia con cui hai già familiarità (JavaScript e CSS)
  • Collegare i gestori di eventi ai nodi SVG

L'API DOM fornisce un'ulteriore serie di chiari vantaggi per l'utilizzo di SVG.

Nessuna richiesta HTTP non necessaria

Quando si usano le immagini in un documento html con tag, stai definendo un file che verrà visualizzato dal browser dell'utente richiesta. Questa richiesta occuperà la larghezza di banda e richiederà più tempo prezioso per il download. Se la tua immagine è invece un insieme di dom node, taglia quella richiesta HTTP extra, rendendo il tuo sito web più veloce e più user friendly.

Scripting interattivo facile

Nonostante le guerre del browser, l'API DOM, attraverso tutti i browser, offre una grande flessibilità in termini di interattività scripting, che si estende agli elementi SVG. Styling SVG avviene tramite CSS. Avere le API degli eventi del browser disponibili per gli elementi SVG rende il comportamento interattivo lo scripting un gioco da ragazzi. Collega semplicemente un gestore a un nodo specifico dell'elemento SVG e sei pronto.

Questo non è vero per gli elementi disegnati sulla tela. Poiché la tela è semplicemente un motore di rendering pixel, gli elementi disegnati non vengono mantenuti in memoria come oggetti. Lo script avrebbe il compito di mantenere raccolti questi elementi e di monitorare tutte le informazioni relative alla posizione e alle dimensioni per cercare e generare eventi in un ciclo di eventi. Oltre a ciò, lo z-indexing dovrebbe essere gestito anche dallo script.

Diamo un'occhiata a un esempio. Supponi di voler rilevare il passaggio del mouse su un cerchio nell'area di disegno. Nota: diremo che l'area di disegno è l'intera larghezza della finestra del browser e utilizzeremo jQuery solo per mantenere l'esempio conciso.

var circleCenter = [200, 300], raggio = 50; $ (finestra) .on ("mousemove", function (e) var mx = e.pageX, my = e.pageY; if (mx> circleCenter [0] - raggio && mx < circleCenter[0] + radius && my > circleCenter [1] - raggio && mio < circleCenter[1] + radius) // now we are hovering  );

Anche se questo non è necessariamente uno schema di codice difficile o insolito, se sei abituato all'API del browser, sembra un processo frustrante solo per controllare la presenza del passaggio del mouse. Questo è un modello molto comune in altri motori di programmazione di interfaccia di livello inferiore come Unity3D o Processing. Ma nel mondo del web, disponiamo di strumenti a nostra disposizione che gestiscono già molti obiettivi interattivi comuni che potremmo avere. Potresti scrivere una serie di funzioni di convenienza per svolgere compiti comuni, ma non preferiresti arrivare al punto? Al contrario, possiamo vedere la semplicità della stessa attività con SVG.

$ ("svg path # circle"). on ("hover", function (event) // Questo è tutto.);

Questo è chiaramente molto più efficiente nel tempo per gli sviluppatori che eseguono script di interattività semplice.

Applicazioni pratiche

Ci sono un sacco di librerie JavaScript là fuori per la tela (come KineticJS, che ti permetterà di fare cose davvero fantastiche. Ma se sei come me, non stai usando motori fisici completi nelle tue applicazioni web. Spesso ho bisogno di icone scalabili, grafici interattivi e modi dettagliati ed esteticamente stupendi per presentare informazioni ai miei utenti.Più della fisica di cui ho bisogno sono semplici equazioni di andamento.Questi elementi grafici sono facilmente creati con SVG e una moltitudine di semplici elementi fisici le equazioni gestiranno probabilmente il resto dei miei bisogni, quindi diamo un'occhiata ad alcune applicazioni pratiche per SVG.

  • Grafico Poiché il principale punto di forza di SVG sono le forme vettoriali di base, funziona naturalmente molto bene per grafici e infografica. Non solo è ottimo per creare grafici statici a partire da determinati numeri, ma è anche adatto per grafici "live", alimentati da richieste AJAX, input dell'utente o dati generati casualmente.
  • Carta stradale Le carte stradali sono costituite da linee dure e forme precise. Queste forme possono essere rappresentate bene con la grafica vettoriale e si prestano allo zoom sulla mappa per ulteriori dettagli.
  • Elementi dell'interfaccia utente complessi Supponiamo che tu volessi un elemento dell'interfaccia utente simile a una piramide di cerchi sovrapposti. Come lo faresti in HTML e CSS? Bene, per prima cosa dovresti creare un gruppo di div per ogni buca, dando a ciascuno un certo raggio di confine e stili di bordo. Quindi li posizioneresti all'interno di un div contenente. Ora, cosa succederebbe se volessi una singola sfumatura su tutta la faccenda? Probabilmente dovresti usare il mascheramento o qualche altra tecnica. Preferiresti non usare le immagini, poiché non sono scalabili e non possono essere ridisegnate o modificate a livello di codice. Invece, perché non disegnare l'elemento in Illustrator e salvarlo come file SVG? Ciò consentirebbe di avere un singolo elemento scalabile senza preoccuparsi di gestire più div.
  • Loghi La maggior parte dei loghi è basata su vettori. È possibile definire un documento SVG come logo e rilasciarlo ovunque, ridimensionandolo al volo in base alle dimensioni che deve essere senza compromettere la qualità o occupare troppa larghezza di banda.
  • Giochi semplici Non è un segreto che la tela sia adatta al rendering del gioco. Parte della ragione di ciò è che i giochi spesso non dipendono dalla grafica vettoriale; piuttosto, usano l'arte e l'animazione basate su pixel. Tuttavia, SVG è un'ottima alternativa per i giochi che richiedono meno animazione dei personaggi e maggiori informazioni visualizzate (pensa a Sudoku).

Perché probabilmente non lo stai usando

Ora che abbiamo esaminato alcuni dei vantaggi di SVG, esaminiamo perché molti sviluppatori scelgono ancora di non utilizzare SVG. Ci sono due ragioni principali per cui SVG non viene utilizzato da molti sviluppatori.

  1. Non ne hanno mai sentito parlare o non hanno mai pensato di averne bisogno, quindi l'hanno ignorato (questo non è più una scusa!)
  2. Un documento XML SVG di qualsiasi complessità sembra relativamente arcaico e complicato, e apparentemente non è così facile come usare semplicemente un'immagine.

Quindi, naturalmente, nessuno vuole davvero sedersi e modificare i punti nell'SVG XML. Fortunatamente, nessuno ha bisogno di! Questa è la parte che le persone spesso non realizzano; ci sono strumenti per modificare SVG, quindi non devi mai farlo a mano.

Strumenti SVG

Illustrator, Inkscape

Se possiedi un editor vettoriale, molto probabilmente puoi salvare il tuo file come un file SVG. Vai avanti e provalo. Apri Illustrator, disegna un cerchio o due, quindi salva il file come SVG. Quindi, apri quel file in Sublime Text o in un altro editor di testo. Vedrai immediatamente che, oltre ad alcuni metadati extra, l'XML di SVG è pronto per essere inserito nel tuo file HTML. Molto probabilmente lo vedrai (gruppo), (percorso) e, naturalmente (il genitore svg) elementi.

d3.js

Mentre sei totalmente in grado di rilasciare il tuo SVG XML direttamente in un file HTML, e se vuoi che lo SVG venga creato dinamicamente? D3.js è "una libreria JavaScript per manipolare documenti basati su dati". In altre parole, è ottimo per generare elementi SVG come grafici a barre e grafici a linee basati su un set di dati. Abbiamo scelto di mostrare D3 a causa del suo vocabolario corrispondente all'attuale implementazione SVG nel browser; sappi che ci sono altre grandi librerie SVG in circolazione (in particolare, Raphael.js).

Sebbene D3.js faccia più della manipolazione SVG, per brevità, è tutto ciò che useremo per oggi. (Assicurati di dare un'occhiata agli esempi sul sito ufficiale di D3.js, e controlla questo workshop che Mike ha pubblicato sul suo sito personale.)

Esempio 1: cerchio pulsante

In questo primo esempio, stiamo semplicemente creando un cerchio pulsante usando Math.sin e un iteratore con un setInterval. Cerchio pulsante

Esempio 2: aggiornamento del grafico a linee

In questo esempio, stiamo aggiornando un grafico a linee tracciato con alcuni valori casuali. Grafico a linee

Quando NON si deve usare SVG?

SVG gestirà molte delle tue esigenze per il rendering delle immagini nel browser. Mentre ci sono molti motivi per usare SVG, come per qualcosa di eccezionale, ci sono cose che non vanno bene.

  • Se il rendering richiede migliaia di nodi, è più performante eseguire il rendering su tela (poiché il browser non deve creare oggetti per ogni pezzo renderizzato, e inoltre non deve fare la matematica vettoriale richiesta per il rendering dell'oggetto. Invece, essenzialmente dipinge i pixel mappati).
  • Se la tua applicazione richiede il supporto per IE8, ricorda che devi fornire un altro vettore fallback (ad esempio il VML più complicato) o non utilizzare affatto il vettore, e invece affidarti a immagini di dimensioni reattive.

Collegamenti utili

Ecco alcuni link utili per farti trincerare ulteriormente in SVG!

  • Raphaël.js
  • Processing.js, basato sul potente Processing, uno strumento di imaging Java
  • jQuery SVG
  • Articolo di Sitepoint: Come scegliere tra Canvas e SVG
  • Canvas e prestazioni SVG
  • Nettuts + articolo su Raffaello

Quali altri usi hai trovato per SVG? Fateci sapere nella sezione commenti e grazie mille per la lettura.