Introduzione a SVG
Scopri cos'è SVG, come funziona il suo sistema di coordinate, quando usarlo al posto di Canvas o immagini raster, e i tre modi per incorporarlo in HTML.
SVG (Scalable Vector Graphics) descrive grafica bidimensionale in XML. Invece di memorizzare una griglia di pixel colorati (come fanno JPEG, PNG o GIF), un file SVG memorizza le istruzioni per disegnare forme — linee, curve, cerchi, rettangoli e testo. Il browser legge quelle istruzioni e renderizza l'immagine aggiornata a qualsiasi dimensione in cui viene visualizzata, quindi il risultato rimane nitido a qualsiasi livello di zoom o risoluzione dello schermo.
SVG è una raccomandazione W3C e si integra con altri standard come il DOM, CSS e JavaScript. Poiché ogni forma è un elemento reale nel documento, puoi applicarle stili con CSS, animarla e rispondere ai clic e agli hover proprio come qualsiasi altro elemento HTML.
Questa pagina spiega come funziona SVG all'interno di una pagina HTML, come è strutturato il suo sistema di coordinate, quando preferire SVG rispetto a Canvas o a un'immagine raster, e i tre modi standard per incorporare un documento SVG.
Come funziona SVG in una pagina HTML
Un'immagine SVG è essa stessa un piccolo documento XML. L'elemento radice <svg> contiene gli elementi forma figli, e il browser li disegna nell'ordine in cui appaiono nel sorgente — gli elementi successivi vengono disegnati sopra quelli precedenti, nello stesso modo in cui i livelli si sovrappongono in un programma di disegno.
<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
<circle cx="50" cy="50" r="40" stroke="green" stroke-width="4" fill="yellow" />
</svg>Il sistema di coordinate
SVG utilizza una griglia di coordinate il cui origine (0, 0) è nell'angolo in alto a sinistra. L'asse x cresce verso destra e l'asse y cresce verso il basso — nota che questo differisce dalla convenzione y verso l'alto che potresti conoscere dalla matematica.
- Gli attributi
widtheheightsu<svg>impostano la dimensione dell'area di disegno in pixel. - Un attributo
viewBox(ad esempioviewBox="0 0 100 100") definisce lo spazio di coordinate interno, permettendo allo stesso disegno di scalare per adattarsi a qualsiasi dimensione di rendering.
Nell'esempio sopra, il centro del cerchio si trova a (50, 50) — il centro di una tela 100×100 — e il suo raggio si estende di 40 unità in ogni direzione.
Leggere gli attributi di <circle>
Ogni attributo sull'elemento <circle> controlla un aspetto di come viene disegnato:
| Attributo | Significato |
|---|---|
cx | coordinata x del centro del cerchio (50) |
cy | coordinata y del centro del cerchio (50) |
r | raggio del cerchio in unità utente (40) |
stroke | colore del contorno (green) |
stroke-width | spessore del contorno in unità utente (4) |
fill | colore che riempie l'interno della forma (yellow) |
Scopri di più sulla colorazione dei contorni in SVG stroking, e consulta ogni forma e attributo nel riferimento SVG.
SVG vs. Canvas vs. immagini raster
La scelta della tecnologia giusta dipende da cosa stai disegnando e da come cambierà.
- SVG è la scelta migliore per grafiche che devono rimanere nitide a qualsiasi dimensione e che vuoi stilizzare, animare o rendere interattive: icone, loghi, grafici, diagrammi e mappe. Ogni forma è un nodo del DOM, quindi è accessibile e facile da manipolare con script. Può diventare lento quando una scena contiene decine di migliaia di elementi individuali.
- Canvas disegna pixel su una bitmap con JavaScript. Non ha un DOM per forma, il che lo rende efficiente per scene in rapido cambiamento con molti oggetti — giochi, effetti particellari e visualizzazioni di dati in tempo reale — ma il risultato non scala senza ridisegnare ed è più difficile da rendere accessibile.
- Le immagini raster (JPEG, PNG, GIF, WebP) memorizzano pixel fissi. Sono la scelta giusta per fotografie e texture complesse, ma si sfocano o si pixelano quando vengono ingrandite e pesano di più ad alte risoluzioni.
Una semplice regola pratica: usa SVG per arte vettoriale indipendente dalla risoluzione e manipolabile tramite script; usa Canvas per il rendering di pixel ad alta frequenza; usa i formati raster per le fotografie.
Incorporare SVG in HTML
I file SVG usano l'estensione .svg e sono supportati da tutti i browser moderni. Ci sono tre modi comuni per inserire SVG in una pagina, ognuno con i propri compromessi.
<svg> inline
Scrivi il markup SVG direttamente all'interno del tuo HTML. Questo ti dà accesso completo a ogni forma, quindi puoi applicare stili con CSS e animare o manipolare tramite script i singoli elementi dalla stessa pagina.
<body>
<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
<circle cx="50" cy="50" r="40" stroke="green" stroke-width="4" fill="yellow" />
</svg>
</body><img> con sorgente SVG
Punta un elemento <img> a un file .svg esterno. Questo è semplice e memorizzabile nella cache, ma l'SVG viene trattato come un'immagine piatta: i suoi elementi interni non possono essere stilizzati o manipolati tramite script dalla pagina ospitante.
<img src="circle.svg" width="100" height="100" alt="A yellow circle outlined in green" />L'elemento <object>
L'elemento <object> carica l'SVG come documento separato esponendo comunque il suo DOM agli script, e ti permette di fornire contenuto di fallback per i browser che non riescono a caricarlo.
<object data="circle.svg" type="image/svg+xml" width="100" height="100">
Your browser does not support SVG.
</object>Per ulteriori informazioni sull'elemento inline stesso, consulta il tag HTML <svg> e SVG in HTML5.
Creare immagini SVG
Puoi scrivere SVG a mano in qualsiasi editor di testo, il che è pratico per icone e forme semplici. Per opere d'arte con molte curve e tracciati, un programma di disegno come Inkscape è generalmente più comodo — esporta file .svg puliti che puoi poi raffinare a mano. Per disegnare forme curve tramite codice, inizia con l'elemento SVG path, e per segmenti retti consulta l'elemento SVG line.
Rendere SVG accessibile
Quando un SVG trasmette un significato, fornisci alle tecnologie assistive qualcosa da leggere. L'approccio dipende da come viene incorporato l'SVG:
- Per
<svg>inline, aggiungi un<title>(e un<desc>più lungo opzionale) come primi figli, e contrassegna la radice conrole="img". Fare riferimento al titolo conaria-labelledbycollega il nome accessibile all'elemento.
<svg role="img" aria-labelledby="circleTitle"
xmlns="http://www.w3.org/2000/svg" width="100" height="100">
<title id="circleTitle">A yellow circle outlined in green</title>
<desc>A solid yellow disk with a four-pixel green border, used as a status indicator.</desc>
<circle cx="50" cy="50" r="40" stroke="green" stroke-width="4" fill="yellow" />
</svg>- Per un SVG caricato tramite
<img>, usa un attributoaltdescrittivo, esattamente come faresti per qualsiasi immagine. - Se la grafica è puramente decorativa, nascondila alle tecnologie assistive con
aria-hidden="true"(inline) o unalt=""vuoto (su<img>) in modo che i lettori di schermo la saltino.
Puoi anche aggiungere testo accessibile all'interno di un disegno con l'elemento SVG text.
Vantaggi dell'utilizzo di SVG
Rispetto ai formati raster come JPEG e GIF, SVG offre diversi vantaggi:
- Le immagini SVG possono essere generate e modificate con qualsiasi editor di testo.
- Le immagini SVG possono essere manipolate tramite script, indicizzate, ricercate e compresse.
- Puoi stampare immagini SVG con alta qualità a qualsiasi risoluzione.
- Le immagini SVG possono essere scalate e ingrandite senza perdere qualità.
- Ogni forma fa parte del DOM, quindi può essere stilizzata con CSS e animata.
- SVG è uno standard W3C aperto.