Die kurze Antwort:
SVG wäre einfacher für Sie, da die Auswahl und das Verschieben bereits eingebaut sind. SVG-Objekte sind DOM-Objekte, also haben sie "Klick"-Handler, etc.
DIVs sind okay, aber klobig und haben furchtbar Leistungsbelastung bei großen Zahlen.
Canvas hat mit Abstand die beste Leistung, aber Sie müssen alle Konzepte des verwalteten Zustands (Objektauswahl usw.) selbst implementieren oder eine Bibliothek verwenden.
Die lange Antwort:
HTML5 Canvas ist einfach eine Zeichenfläche für eine Bitmap. Man richtet sich zum Zeichnen ein (z. B. mit einer Farbe und Linienstärke), zeichnet das Ding, und dann hat der Canvas keine Kenntnis von diesem Ding: Er weiß nicht, wo es ist oder was es ist, das man gerade gezeichnet hat, es sind nur Pixel. Wenn Sie Rechtecke zeichnen wollen und diese sich bewegen oder auswählbar sein sollen, müssen Sie all das von Grund auf neu programmieren, einschließlich den Code, um sich daran zu erinnern, dass Sie sie gezeichnet haben.
SVG hingegen muss Verweise auf jedes Objekt, das es wiedergibt, beibehalten. Jedes SVG/VML-Element, das Sie erstellen, ist ein echtes Element im DOM. Standardmäßig können Sie so die von Ihnen erstellten Elemente viel besser verfolgen und Dinge wie Mausereignisse einfacher handhaben, aber es verlangsamt sich erheblich, wenn es eine große Anzahl von Objekten gibt
Diese SVG-DOM-Referenzen bedeuten, dass ein Teil der Arbeit mit den von Ihnen gezeichneten Objekten für Sie erledigt ist. Und SVG ist schneller beim Rendern sehr groß Objekte, aber langsamer beim Rendern viele Objekte.
Ein Spiel würde in Canvas wahrscheinlich schneller sein. Ein großes Kartenprogramm wäre in SVG wahrscheinlich schneller. Wenn Sie Canvas verwenden möchten, finden Sie hier einige Anleitungen, wie Sie bewegliche Objekte zum Laufen bringen können aquí .
Canvas wäre besser für schnellere Dinge und schwere Bitmap-Manipulation (wie Animation), aber wird mehr Code nehmen, wenn Sie viel Interaktivität wollen.
Ich habe eine Reihe von Zahlen zu HTML DIV-gefertigten Zeichnungen gegenüber Canvas-gefertigten Zeichnungen durchgeführt. Ich könnte einen riesigen Beitrag über die Vorteile der beiden machen, aber ich werde einige der relevanten Ergebnisse meiner Tests geben, um für Ihre spezifische Anwendung zu berücksichtigen:
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 zu meinen beiden Tests jeweils 100.000 Knoten hinzugefügt. Sie haben ganz unterschiedlich abgeschnitten:
Die HTML-Test-Registerkarte brauchte ewig, um zu laden (knapp 5 Minuten, Chrome bat beim ersten Mal darum, die Seite zu beenden). Der Task-Manager von Chrome zeigt an, dass die Registerkarte 168 MB beansprucht. Sie beansprucht 12-13% der CPU-Zeit, wenn ich sie betrachte, 0%, wenn ich sie nicht betrachte.
Die Registerkarte Canvas wird in einer Sekunde geladen und nimmt 30 MB ein. Außerdem beansprucht sie ständig 13 % der CPU-Zeit, unabhängig davon, ob man sie anschaut oder nicht. (2013 edit: Sie haben das größtenteils behoben)
Das Ziehen auf der HTML-Seite ist flüssiger, was vom Design her erwartet wird, da die aktuelle Einstellung im Canvas-Test alle 30 Millisekunden ALLES neu zeichnet. Es gibt viele Optimierungen für Canvas, die dies ermöglichen. (Canvas-Invalidierung ist die einfachste, auch Clipping-Regionen, selektives Redrawing, usw.. hängt nur davon ab, wie viel Sie implementieren möchten)
Es besteht kein Zweifel daran, dass Canvas bei der Objektmanipulation schneller sein könnte als die Divs in diesem einfachen Test, und natürlich viel schneller in der Ladezeit. Zeichnen/Laden ist schneller in Canvas und hat viel mehr Raum für Optimierungen, auch (dh, ausschließen Dinge, die außerhalb des Bildschirms sind, ist sehr einfach).
Schlussfolgerung:
- SVG ist wahrscheinlich besser für Anwendungen und Anwendungen mit wenigen Elementen (weniger als 1000? Kommt wirklich darauf an)
- Canvas eignet sich besser für Tausende von Objekten und sorgfältige Manipulationen, aber es ist viel mehr Code (oder eine Bibliothek) erforderlich, um es in Gang zu bringen.
- HTML-Divs sind klobig und lassen sich nicht skalieren, ein Kreis lässt sich nur mit abgerundeten Ecken erstellen, komplexe Formen sind möglich, erfordern aber Hunderte winziger, pixelgroßer Divs. Der Wahnsinn nimmt seinen Lauf.