La breve risposta:
SVG sarebbe più facile per te, dal momento che la selezione e lo spostamento è già incorporato. Gli oggetti SVG sono oggetti DOM, quindi hanno gestori "click", ecc.
I DIV sono ok ma goffi e hanno prestazioni terribili che si caricano su grandi numeri.
Canvas offre le migliori prestazioni a mani basse, ma è necessario implementare tutti i concetti di stato gestito (selezione degli oggetti, ecc.) O utilizzare una libreria.
La lunga risposta:
HTML5 Canvas è semplicemente una superficie di disegno per una bitmap. Ti prepari per disegnare (dì con uno spessore di colore e linea), disegna quella cosa, e quindi la tela non ha conoscenza di quella cosa: non sa dove sia o cosa abbia appena disegnato, è solo pixel. Se vuoi disegnare rettangoli e farli spostare o essere selezionabili, devi codificare tutto da zero, incluso il codice per ricordare che li hai disegnati.
SVG d'altra parte deve mantenere i riferimenti a ciascun oggetto che esso esegue il rendering. Ogni elemento SVG / VML che crei è un elemento reale nel DOM. Per impostazione predefinita, questo ti consente di tenere traccia molto migliore degli elementi che crei e semplifica la gestione di cose come gli eventi del mouse, ma rallenta in modo significativo quando ci sono molti oggetti
Quei riferimenti SVG DOM significano che parte del footwork della gestione delle cose che disegni è fatto per te. E SVG è più veloce nel rendering di oggetti molto grandi , ma più lento nel rendering di molti oggetti.
Un gioco sarebbe probabilmente più veloce in Canvas. Un enorme programma cartografico sarebbe probabilmente più veloce in SVG. Se vuoi usare Canvas, ho alcuni tutorial su come mettere in funzione oggetti mobili e farli funzionare qui .
Canvas sarebbe meglio per cose più veloci e manipolazione bitmap pesante (come l'animazione), ma richiederebbe più codice se si desidera molta interattività.
Ho eseguito un sacco di numeri sul disegno HTML DIV rispetto al disegno su tela. Potrei fare un enorme post sui vantaggi di ciascuno, ma fornirò alcuni dei risultati rilevanti dei miei test da considerare per la tua specifica applicazione:
Ho realizzato pagine di prova DIV Canvas e HTML, entrambe con "nodi" mobili. I nodi di tela erano oggetti che ho creato e tenuto traccia di in Javascript. I nodi HTML erano div mobili.
Ho aggiunto 100.000 nodi a ciascuno dei miei due test. Si sono esibiti in modo abbastanza diverso:
Il caricamento della scheda del test HTML ha richiesto un'eternità (a tempo leggermente inferiore a 5 minuti, Chrome ha chiesto di chiudere la pagina la prima volta). Il task manager di Chrome afferma che la scheda occupa 168 MB. Richiede il 12-13% di tempo CPU quando lo guardo, lo 0% quando non lo guardo.
La scheda Canvas viene caricata in un secondo e occupa 30 MB. Inoltre, occupa sempre il 13% del tempo della CPU, indipendentemente dal fatto che uno lo stia osservando o meno. (Modifica del 2013: l'hanno risolto principalmente)
Il trascinamento sulla pagina HTML è più fluido, come previsto dal progetto, poiché l'impostazione corrente prevede di ridisegnare TUTTO ogni 30 millisecondi nel test Canvas. Ci sono molte ottimizzazioni per Canvas per questo. (l'invalidazione della tela è la più semplice, anche le aree di ritaglio, il ridisegno selettivo, ecc. dipende solo da quanto hai voglia di implementare)
Non c'è dubbio che potresti rendere Canvas più veloce nella manipolazione degli oggetti come i div in quel semplice test, e ovviamente molto più veloce nel tempo di caricamento. Disegnare / caricare è più veloce in Canvas e ha anche molto più spazio per le ottimizzazioni (cioè escludere cose che sono fuori dallo schermo è molto semplice).
Conclusione:
- SVG è probabilmente migliore per applicazioni e app con pochi elementi (meno di 1000? Dipende davvero)
- La tela è migliore per migliaia di oggetti e un'attenta manipolazione, ma è necessario molto più codice (o una libreria) per farlo decollare.
- I div HTML sono ingombranti e non si ridimensionano, creare un cerchio è possibile solo con angoli arrotondati, creare forme complesse è possibile ma coinvolge centinaia di minuscoli div piccoli pixel. Ne consegue la follia.