Краткий ответ:
SVG будет для вас проще , поскольку выделение и перемещение его уже встроены. Объекты SVG являются объектами DOM, поэтому они имеют обработчики "щелчка" и т. Д.
DIVs в порядке, но неуклюжи и имеют ужасную производительность, загружаемую при больших количествах.
У Canvas лучшая производительность, но вы должны сами реализовать все концепции управляемого состояния (выбор объекта и т. Д.) Или использовать библиотеку.
Длинный ответ:
HTML5 Canvas - это просто поверхность для рисования битовой карты. Вы настраиваете рисовать (скажем, цветом и толщиной линии), рисуете эту вещь, и тогда Canvas не знает об этой вещи: он не знает, где она или что вы только что нарисовали, это только пиксели. Если вы хотите нарисовать прямоугольники и сделать так, чтобы они перемещались или были доступны для выбора, вам придется кодировать все это с нуля, включая код, чтобы помнить, что вы их нарисовали.
С другой стороны, SVG должен поддерживать ссылки на каждый объект, который он отображает. Каждый создаваемый вами элемент SVG / VML является реальным элементом в DOM. По умолчанию это позволяет вам намного лучше отслеживать созданные вами элементы и упрощает работу с такими событиями, как события мыши, по умолчанию, но значительно замедляется при большом количестве объектов
Эти ссылки на SVG DOM означают, что некоторая часть работы с тем, что вы рисуете, сделана для вас. И SVG быстрее при рендеринге действительно больших объектов, но медленнее при рендеринге многих объектов.
Возможно, игра в Canvas будет быстрее. Огромная картографическая программа, вероятно, будет быстрее в SVG. Если вы хотите использовать Canvas, у меня есть несколько уроков по установке и запуску подвижных объектов здесь .
Canvas был бы лучше для более быстрых вещей и тяжелых растровых манипуляций (например, анимации), но потребует больше кода, если вы хотите много интерактивности.
Я выполнил набор чисел для чертежа, созданного в формате HTML DIV, и рисунка, созданного в Canvas. Я мог бы сделать огромный пост о преимуществах каждого из них, но я дам некоторые соответствующие результаты моих тестов для рассмотрения для вашего конкретного приложения:
Я сделал тестовые страницы Canvas и HTML DIV, у обоих были подвижные «узлы». Узлы холста были объектами, которые я создал и отслеживал в Javascript. Узлы HTML были подвижными Div.
Я добавил 100 000 узлов в каждый из двух моих тестов. Они выступили совсем по-другому:
Загрузка тестовой вкладки HTML заняла целую вечность (по времени чуть меньше 5 минут, Chrome попросил убить страницу в первый раз). Менеджер задач Chrome говорит, что вкладка занимает 168 МБ. Когда я на него смотрю, это занимает 12-13% процессорного времени, когда я не смотрю, 0%.
Вкладка Canvas загружается за одну секунду и занимает 30 МБ. Это также занимает 13% процессорного времени все время, независимо от того, смотрит на него или нет. (редактирование 2013 года: в основном это исправлено)
Перетаскивание на HTML-странице более плавное, что и ожидается дизайном, поскольку текущая настройка должна перерисовывать ВСЁ каждые 30 миллисекунд в тесте Canvas. Для этого есть много оптимизаций для Canvas. (аннулирование холста является самым простым, также отсечение областей, выборочное перерисовывание и т. д. зависит только от того, насколько вы хотите реализовать)
Нет сомнений в том, что Canvas может быть быстрее при манипулировании объектами, чем div в этом простом тесте, и, конечно, намного быстрее во время загрузки. Рисование / загрузка выполняется быстрее в Canvas и имеет гораздо больше возможностей для оптимизации (т. Е. Исключить вещи, находящиеся за кадром, очень легко).
Вывод:
- SVG, вероятно, лучше для приложений и приложений с небольшим количеством элементов (меньше 1000? Действительно зависит)
- Canvas лучше подходит для тысяч объектов и осторожных манипуляций, но для его запуска требуется намного больше кода (или библиотеки).
- HTML-элементы Div неуклюжи и не масштабируются, создание круга возможно только с закругленными углами, создание сложных форм возможно, но включает в себя сотни крошечных крошечных элементов Div шириной в пиксель. Безумие наступает.