Die kurze Antwort:
SVG wäre für Sie einfacher , da die Auswahl und das Verschieben bereits integriert sind. SVG-Objekte sind DOM-Objekte, daher verfügen sie über "Klick" -Handler usw.
DIVs sind in Ordnung, aber klobig und haben eine schreckliche Leistungsbelastung bei großen Zahlen.
Canvas bietet zweifellos die beste Leistung, Sie müssen jedoch alle Konzepte des verwalteten Status (Objektauswahl usw.) selbst implementieren oder eine Bibliothek verwenden.
Die lange Antwort:
HTML5 Canvas ist einfach eine Zeichenfläche für eine Bitmap. Sie haben sich eingerichtet, um zu zeichnen (z. B. mit Farbe und Linienstärke), das Ding zu zeichnen, und dann hat die Leinwand keine Kenntnis von diesem Ding: Es weiß nicht, wo es ist oder was es ist, das Sie gerade gezeichnet haben, es ist nur Pixel. Wenn Sie Rechtecke zeichnen und sie verschieben oder auswählbar sein möchten, müssen Sie all dies von Grund auf neu codieren, einschließlich des Codes, um sich daran zu erinnern, dass Sie sie gezeichnet haben.
SVG hingegen muss Verweise auf jedes Objekt enthalten, das es rendert. Jedes von Ihnen erstellte SVG / VML-Element ist ein echtes Element im DOM. Standardmäßig können Sie die von Ihnen erstellten Elemente viel besser verfolgen und den Umgang mit Mausereignissen standardmäßig vereinfachen. Bei einer großen Anzahl von Objekten wird dies jedoch erheblich verlangsamt
Diese SVG-DOM-Referenzen bedeuten, dass ein Teil der Arbeit im Umgang mit den von Ihnen gezeichneten Dingen für Sie erledigt wird. Und SVG ist schneller beim Rendern wirklich großer Objekte, aber langsamer beim Rendern vieler Objekte.
Ein Spiel wäre in Canvas wahrscheinlich schneller. Ein riesiges Kartenprogramm wäre in SVG wahrscheinlich schneller. Wenn Sie Canvas verwenden möchten, habe ich einige Tutorials, um bewegliche Objekte hier zum Laufen zu bringen .
Canvas ist besser für schnellere Dinge und umfangreiche Bitmap-Manipulationen (wie Animationen) geeignet, benötigt jedoch mehr Code, wenn Sie viel Interaktivität wünschen.
Ich habe eine Reihe von Zahlen für von HTML DIV erstellte Zeichnungen im Vergleich zu von Canvas erstellten Zeichnungen ausgeführt. Ich könnte einen großen Beitrag über die Vorteile der einzelnen Tests verfassen, aber ich werde einige der relevanten Ergebnisse meiner Tests angeben, die für Ihre spezifische Anwendung zu berücksichtigen sind:
Ich habe Canvas- und HTML-DIV-Testseiten erstellt, beide hatten bewegliche "Knoten". Canvas-Knoten waren Objekte, die ich in Javascript erstellt und verfolgt habe. HTML-Knoten waren bewegliche Divs.
Ich habe jedem meiner beiden Tests 100.000 Knoten hinzugefügt. Sie haben ganz anders gespielt:
Das Laden der Registerkarte "HTML-Test" hat ewig gedauert (etwas weniger als 5 Minuten, Chrome hat darum gebeten, die Seite beim ersten Mal zu beenden). Der Task-Manager von Chrome gibt an, dass die Registerkarte 168 MB belegt. Es nimmt 12-13% CPU-Zeit in Anspruch, wenn ich es betrachte, 0%, wenn ich es nicht betrachte.
Die Registerkarte Canvas wird in einer Sekunde geladen und nimmt 30 MB ein. Außerdem nimmt es die ganze Zeit 13% der CPU-Zeit in Anspruch, unabhängig davon, ob man es sich ansieht oder nicht. (2013 bearbeiten: Sie haben das größtenteils behoben)
Das Ziehen auf der HTML-Seite ist reibungsloser, was vom Design erwartet wird, da das aktuelle Setup im Canvas-Test ALLES alle 30 Millisekunden neu zeichnet. Dafür gibt es für Canvas zahlreiche Optimierungen. (Die Ungültigmachung der Zeichenfläche ist am einfachsten, auch das Ausschneiden von Regionen, das selektive Neuzeichnen usw. hängt nur davon ab, wie sehr Sie sich für die Implementierung interessieren.)
Es besteht kein Zweifel, dass Canvas bei der Objektmanipulation schneller sein kann als die Divs in diesem einfachen Test und natürlich viel schneller in der Ladezeit. Das Zeichnen / Laden ist in Canvas schneller und bietet auch viel mehr Raum für Optimierungen (dh das Ausschließen von Dingen außerhalb des Bildschirms ist sehr einfach).
Fazit:
- SVG ist wahrscheinlich besser für Anwendungen und Apps mit wenigen Elementen (weniger als 1000? Kommt wirklich darauf an)
- Canvas ist besser für Tausende von Objekten und sorgfältige Manipulationen geeignet, aber es wird viel mehr Code (oder eine Bibliothek) benötigt, um es in Betrieb zu nehmen.
- HTML-Divs sind klobig und nicht skalierbar. Das Erstellen eines Kreises ist nur mit abgerundeten Ecken möglich. Das Erstellen komplexer Formen ist möglich, umfasst jedoch Hunderte winziger, pixelweiter Divs. Wahnsinn folgt.