Canvas 2D con JavaScript: dibujar datos en un lienzo

Aprende a usar el elemento canvas y su contexto 2D para limpiar, dibujar y repintar formas desde datos controlados por JavaScript.

Canvas sirve cuando necesitas dibujar píxeles o gráficos controlados por JavaScript: visualizaciones, juegos simples, editores, trazos, partículas o fondos generativos.

A diferencia del DOM, no creas un nodo por cada forma. Trabajas sobre un lienzo y lo repintas cuando cambia el estado.

En esta lección vas a usar <code>getContext('2d')</code>, limpiar con <code>clearRect</code> y dibujar formas desde arrays de datos.

Antes de llegar aquí conviene dominar [render dinámico](/curso/javascript/leccion/javascript-render-dinamico-medio), porque la idea de estado -> dibujo es la misma.

  • En DOM modificas nodos; en canvas pintas sobre una superficie.
  • Si necesitas que cada elemento sea seleccionable, semántico o accesible por separado, DOM suele ser mejor. Si necesitas muchas formas, animación o dibujo libre, canvas encaja mejor.
  • El canvas no recuerda objetos como 'círculo' o 'cuadrado'. Si quieres cambiar algo, guardas los datos en JavaScript, limpias el lienzo y vuelves a dibujar.
  • Todo empieza con una referencia al canvas y su contexto 2D.
  • <code>getContext('2d')</code> devuelve el objeto que contiene los métodos de dibujo: líneas, rectángulos, texto, arcos, relleno y limpieza.

Canvas no es DOM: es dibujo inmediato

En DOM modificas nodos; en canvas pintas sobre una superficie.

Si necesitas que cada elemento sea seleccionable, semántico o accesible por separado, DOM suele ser mejor. Si necesitas muchas formas, animación o dibujo libre, canvas encaja mejor.

El canvas no recuerda objetos como 'círculo' o 'cuadrado'. Si quieres cambiar algo, guardas los datos en JavaScript, limpias el lienzo y vuelves a dibujar.

Obtener contexto y preparar el primer dibujo

Todo empieza con una referencia al canvas y su contexto 2D.

<code>getContext('2d')</code> devuelve el objeto que contiene los métodos de dibujo: líneas, rectángulos, texto, arcos, relleno y limpieza.

Antes de dibujar una forma compleja, usa <code>beginPath()</code> para iniciar un trazo limpio y evitar mezclar caminos anteriores.

Repintar desde datos

El patrón estable es limpiar, recorrer datos y dibujar.

Cuando cambian color, tamaño o posiciones, no intentes borrar una forma concreta a mano. Limpia el canvas completo con <code>clearRect</code> y dibuja el estado actual.

Este patrón evita residuos visuales y hace que cada render sea predecible.

JavaScript
30

Canvas 2D con JavaScript: dibujar datos en un lienzo

Aprende a usar el elemento canvas y su contexto 2D para limpiar, dibujar y repintar formas desde datos controlados por JavaScript.

Código del tema: canvas · getContext · draw

📘 Teoría

Canvas no es DOM: es dibujo inmediato

En DOM modificas nodos; en canvas pintas sobre una superficie.

Si necesitas que cada elemento sea seleccionable, semántico o accesible por separado, DOM suele ser mejor. Si necesitas muchas formas, animación o dibujo libre, canvas encaja mejor.

El canvas no recuerda objetos como 'círculo' o 'cuadrado'. Si quieres cambiar algo, guardas los datos en JavaScript, limpias el lienzo y vuelves a dibujar.

1

DOM

2

Canvas

3

Estado

Obtener contexto y preparar el primer dibujo

Todo empieza con una referencia al canvas y su contexto 2D.

1

getContext('2d') devuelve el objeto que contiene los métodos de dibujo: líneas, rectángulos, texto, arcos, relleno y limpieza.

2

Antes de dibujar una forma compleja, usa beginPath() para iniciar un trazo limpio y evitar mezclar caminos anteriores.

Primer círculo
const canvas = document.getElementById('lienzo');
const ctx = canvas.getContext('2d');

ctx.fillStyle = '#22d3ee';
ctx.beginPath();
ctx.arc(120, 80, 34, 0, Math.PI * 2);
ctx.fill();

Repintar desde datos

El patrón estable es limpiar, recorrer datos y dibujar.

1

Cuando cambian color, tamaño o posiciones, no intentes borrar una forma concreta a mano. Limpia el canvas completo con clearRect y dibuja el estado actual.

2

Este patrón evita residuos visuales y hace que cada render sea predecible.

Render de puntos
function dibujar(puntos) {
  ctx.clearRect(0, 0, canvas.width, canvas.height);

  puntos.forEach((punto) => {
    ctx.beginPath();
    ctx.arc(punto.x, punto.y, punto.r, 0, Math.PI * 2);
    ctx.fill();
  });
}

🧪 Aprende probando

Ejemplo Ejemplo guiado: dibujar una marca de estado Pinta un círculo y un texto breve en el canvas usando contexto 2D.
Ejemplo Demo interactiva: formas dinámicas en canvas Controla cantidad, tamaño, color y forma para repintar un lienzo 2D desde datos generados en JavaScript.

🏁 Retos

Reto Reto: dibujar barras desde un array Convierte una lista de valores en barras proporcionales dentro del canvas.

¿Qué es esto?

Soy Cristian Eslava y a veces hago webs para procrastinar yo y vosotros 😉.

Esta la hice en febrero de 2026 para facilitar el aprendizaje de mis alumnxs. Aprender desarrollo web practicando. La idea es que crezca semanalmente con nuevos temas, tests y retos.

Inspirado en MDN, en W3Schools, en Codepen, en el crack de Manz y en mil sitios de documentación sobre desarrollo web. Quería aportar además de bloques teóricos con ejemplos, la gamificación de los retos y el sistema de test que ya tenía en culTest .

Si te gustó, si no te gustó, si quieres saludarme, o invitarme a 🍻 no dudes en escribirme en cristianeslava@gmail.com .