2012-04-25 12 views
7

Quiero comenzar un proyecto en el que necesito dibujar diagramas que consisten en rectángulos redondeados conectados con líneas y una acción de JavaScript cuando hago clic en algunos elementos. Esto debe funcionar en todos los navegadores modernos.Diagramas en SVG frente a HTML5 Canvas

Tanto SVG como HTML5 Canvas parecen ser capaces de hacer esto, así que me pregunto qué sería lo mejor.

Además, no quiero reinventar la rueda, así que si hay bibliotecas que hacen tales cosas, me gustaría saber; Eché un vistazo a Raphaël y algunas otras librerías de dibujo de JavaScript, pero no ofrecen todas las funcionalidades que necesito. En la API de Google existe una herramienta de este tipo, pero es muy limitada.

+0

¿Qué tipo de diagramas? ¿Qué tan grande exactamente? ¿Qué tipo de funcionalidad estás buscando que las bibliotecas no tienen en este momento? –

+0

el tamaño debe ser ajustable, el diagrama es para un programa de genealogía – peter

+0

Si yo fuera tú iría con svg, y lo construiría con algo así como backbone.js, de esta manera solo puedes crear plantillas para tus objetos y tener interacción aún. – RGB

Respuesta

15

Uso SVG porque — como retenido en modo dibujo API — puede adjuntar detectores de eventos directamente a elementos específicos, y cambiar las propiedades de los elementos específicos y tienen la página mágicamente actualizar. Además, como un formato basado en vectores, es independiente de la resolución.

HTML5 Canvas, en comparación, es una API de dibujo non-retained-mode (también conocida como modo inmediato); cada píxel que dibuja se mezcla con todos los demás píxeles en el lienzo, sin ningún concepto de la forma original. Además, como un formato basado en ráster, necesitaría hacer un trabajo adicional para que los comandos de dibujo se ajusten para diferentes tamaños de visualización.

En general, se debe utilizar la lona si y sólo si es necesario:

  1. entorno directo de píxeles (por ejemplo, faltas de definición, efectos brillantes), o
  2. directa conseguir de píxeles (por ejemplo, la lectura de un dibujo del usuario para guardar como PNG, sampling portions of the image to detect visual overlaps) o
  3. masivo número de 'objetos' que no se moverán mucho o rastrear eventos individuales (SVG puede demorarse en volver a dibujar con miles de objetos).

Tenga en cuenta también que no tiene que elegir solo una u otra. Puedes dibujar SVG en el lienzo. Puede incluir mapas de bits (imágenes) en SVG. Incluso puede incluir HTML5 Canvas en SVG a través del <foreignElement>. Puede tener una sola página HTML con varios lienzos superpuestos y elementos SVG con fondos transparentes, mezclando la salida de cada uno.

+0

gracias Phrogz, pero no estoy seguro si la interacción me permitirá, por ejemplo, agregar un nodo con conectores y ver el resultado sin actualizar o hacer un viaje redondo al servidor para regenerar mi SVG completo ... – peter

+1

@peter JavaScript puede modificar el SVG DOM sobre la marcha, agregando manipulación y eliminación de nodos (como en HTML). El navegador web vuelve a dibujar automáticamente la vista según corresponda (al igual que en HTML). En el lienzo, por el contrario, "mover" un elemento requiere borrar y volver a emitir todos los comandos de dibujo. Esto no es "difícil" con una biblioteca que mantiene objetos virtuales para usted. Ver mi edición – Phrogz

+0

@peter, phrogz está en lo cierto, puedes manipular svg del mismo modo que puedes manipular html con javascript ... ¡también por qué puedes usar backbone.js! :) – RGB