Cómo dibujar en el navegador con JavaScript | |
HTML5 introdujo el objeto canvas que permite dibujar en el navegador con JavaScript. Canvas se utiliza básicamente para mostrar gráficos, pero incluso es posible crear juegos en 3D. | |
En este artículo, veremos cómo dibujar líneas, formas simples, cómo rellenarlas y orientarse en el área de dibujo. | |
El objeto lienzo HTML | |
La palabra canvas significa canevas. Está por tanto muy orientada a la creación gráfica y artística. Simplemente se declara mediante la etiqueta canvas y se comporta en pantalla como un div. | |
Definamos un estilo para todos los lienzos de nuestro artículo: | |
canvas { border:2px solid #999; background-color:#fff; } |
Vamos a crear nuestro primer lienzo: | |
<canvas id="canvas1" width="800" height="300">Your browser is too old</canvas> |
The location in the canvas is done by Cartesian coordinates (x, y) with the origin (0, 0) at the top left | |
![]() | |
También es necesario dominar el manejo de los ángulos y la trigonometría para dibujar círculos. | |
![]() | |
Líneas de dibujo | |
<html> <head> <style> canvas { border:2px solid #999; background-color:#000; } </style> </head> <body> <canvas id="canvas1" width="700" height="200">Your browser is too old</canvas> <script> var myCanvas=document.getElementById("canvas1"); var ctx = myCanvas.getContext("2d"); ctx.lineWidth="8"; ctx.strokeStyle="#fff"; ctx.beginPath(); // draw 1 ctx.moveTo(30, 30); ctx.lineTo(40, 10); ctx.lineTo(40, 60); ctx.stroke(); ctx.beginPath(); // draw 2 ctx.moveTo(80, 80); ctx.lineTo(60, 80); ctx.lineTo(60, 60); ctx.lineTo(80, 60); ctx.lineTo(80, 40); ctx.lineTo(60, 40); ctx.stroke(); </script> </body> </html> |
y 2 se muestran en tiempo de ejecución. | |
![]() | |
Algunas explicaciones simples para comprender los principios fundamentales del dibujo sobre lienzo son esenciales: | |
Clásicamente, buscamos el lienzo con getElementById() que informa la variable myCanvas. | |
La variable ctx es alimentada por la llamada al método específico de objeto getContext() HTMLCanvasElement. | |
Luego, todas las acciones de dibujo en el lienzo pasan por llamadas a métodos y asignaciones de propiedades en este contexto. | |
La propiedad lineWidth contiene el ancho del lápiz. | |
La propiedad strokeStyle contiene el color del lápiz. | |
El método beginPath() inicializa un gráfico. | |
El método moveTo(x, y) mueve el puntero a la posición (x, y). | |
El método lineTo(x, y) dibuja una línea desde la posición del cursor hasta la posición (x, y). | |
El método stroke() muestra el dibujo vacío inicializado en el lienzo. Mientras no se llame a stroke(), no se muestra el dibujo de una ruta. | |
Dibujar formas | |
La gestión de formularios es bastante extensa |
<canvas id="canvas2" width="650" height="300">Your browser is too old</canvas> |
Some examples of drawing shapes: | |
<html> <head> <style> canvas { border:2px solid #999; background-color:#000; } </style> </head> <body> <canvas id="canvas2" width="700" height="200">Your browser is too old</canvas> <script> var myCanvas=document.getElementById("canvas2"); var ctx = myCanvas.getContext("2d"); /* A circle and an arc of a circle */ ctx.lineWidth="4"; ctx.strokeStyle="#fff"; ctx.beginPath(); ctx.arc(300, 105, 65, 0, 2*Math.PI); ctx.stroke(); /* A closed path (a triangle) */ ctx.lineWidth="4"; ctx.strokeStyle="#D8FF69"; ctx.beginPath(); ctx.moveTo(60,60); ctx.lineTo(190,35); ctx.lineTo(50,160); ctx.closePath(); ctx.stroke(); ctx.beginPath(); ctx.arc(500, 105, 25, Math.PI/2, 2*Math.PI); ctx.stroke(); /* A rectangle */ ctx.lineWidth="8"; ctx.strokeStyle="#69FFE7"; ctx.rect(20,20,660,160) ctx.stroke(); </script> </body> </html> |
Estas son las formas que aparecen: | |
![]() | |
El método rect(x, y, ancho, alto) dibuja un rectángulo cuya esquina superior izquierda está en (x,y) con ancho y alto como dimensiones. | |
El método closePath() cierra una ruta abierta con beginPath(). | |
Modos de llenado | |
Aquí están los 3 formularios para llenar |
<html> <head> <style> canvas { border:1px solid #999; background-color:#000; } </style> </head> <body> <canvas id="canvas3" width="700" height="200">Your browser is too old</canvas> <script> var myCanvas=document.getElementById("canvas3"); var ctx = myCanvas.getContext("2d"); /* A solid color rectangle */ ctx.lineWidth="2"; ctx.fillStyle="#316AC5"; ctx.fillRect(20,20,660,160) /* Two circles with color gradients */ var myGradient = ctx.createLinearGradient(215, 0, 270, 0); myGradient.addColorStop(0, '#1B606B'); myGradient.addColorStop(1, '#ffffff'); ctx.fillStyle = myGradient; ctx.beginPath(); ctx.arc(250, 105, 55, 2*Math.PI, 0); ctx.fill(); myGradient = ctx.createRadialGradient(450, 80, 50, 450, 85, 2*Math.PI); myGradient.addColorStop(0, '#ffa500'); myGradient.addColorStop(1, '#ffffff'); ctx.fillStyle = myGradient; ctx.beginPath(); ctx.arc(450, 105, 55, 0, 2*Math.PI); ctx.fill(); /* A shape defined by a path filled with an image */ var img = new Image(); img.src = 'pattern.png?1'; img.onload = function() { var pattern = ctx.createPattern(img, 'repeat'); ctx.fillStyle = pattern; ctx.beginPath(); ctx.moveTo(500,60); ctx.lineTo(590,35); ctx.lineTo(600,160); ctx.lineTo(490,90); ctx.fill(); } /* A dark square with transparency */ ctx.fillStyle = 'rgba(15, 15, 15, 0.3)'; ctx.fillRect(250, 5, 100, 100); </script> </body> </html> |
La propiedad fillStyle contiene el estilo de relleno. Este ejemplo muestra el caso de un color sólido, un degradado de color o un patrón resultante de una repetición de imagen. | |
El método fillRect dibuja un rectángulo relleno con el estilo definido en fillStyle. | |
![]() | |
El método fill() llena un camino con el estilo previamente definido. Debe estar relacionado con stroke() que traza los contornos de la ruta. | |
Los degradados de color son objetos CanvasGradient que representan degradados definidos con precisión a partir de una forma y colores. Canvas acepta 2 tipos de degradados. | |
El degradado lineal creado por createLinearGradient(x1, y1, x2, y2) define un vector entre los puntos (x1, y1) y (x2, y2). Este vector está coloreado por un degradado de colores agregado por addColorStop(number, colorCode). | |
El degradado circular creado por createRadialGradient(x1, y1, r1, x2, y2, r2) define 2 círculos con su posición y radio. | |
Los degradados requieren un poco de prueba y error para obtener el efecto deseado... | |
Finalmente, existe la posibilidad de llenar una forma con una imagen repetida, cuyo efecto es comparable a la propiedad background-url de CSS. La sutileza es que tienes que esperar a que cargue la imagen para poder crear el patrón con createPattern(). Esto fuerza la detección del evento onload en la imagen del objeto de JavaScript. | |
Escribir texto | |
Por supuesto, el lienzo permite mostrar texto de forma sencilla. | |
<canvas id="canvas1" width="700" height="200">Tu navegador es demasiado antiguo</canvas> | |
Aquí hay un ejemplo para escribir texto: |
<html> <head> <style> canvas { border:1px solid #999; background-color:#fff; } </style> </head> <body> <canvas id="canvas3" width="700" height="200">Your browser is too old</canvas> <script> var myCanvas=document.getElementById("canvas3"); var ctx = myCanvas.getContext("2d"); ctx.font="50px arial"; ctx.strokeText("How to draw with JavaScript",10,50); ctx.fillText("How to draw with JavaScript",10,110); ctx.fillStyle="#79EEFF"; ctx.fillText("How to draw with JavaScript",10,170); ctx.stroke(); </script> </body> </html> |
¡Y aquí hay algunos ejemplos de estilos de texto! | |
![]() | |
font contiene propiedades de estilo de texto. | |
strokeText() muestra los contornos de las letras. | |
fillText() muestra el texto completo. | |
Posición del texto | |
measureText() devuelve el ancho en píxeles del texto ocupado en el lienzo. Estos datos le permiten posicionar el texto con mayor precisión. | |
De forma predeterminada, la posición del texto es la esquina inferior izquierda del cuadro de texto. | |
La propiedad textBaseline contiene el tipo de línea de soporte de texto. De forma predeterminada, el valor es alfabético con un texto que se basa en la línea principal de escritura. | |
Transformaciones y rotaciones | |
Hay una forma de realizar transformaciones antes de dibujar en el lienzo con setTransform() y rotate(). | |
Aquí hay un ejemplo para rotar un texto verticalmente. Rápidamente se da cuenta de que el código necesario para realizar esta operación relativamente simple es largo y complejo. Crear una función parece realmente útil. |
<html> <head> <style> canvas { border:1px solid #999; background-color:#fff; } </style> </head> <body> <canvas id="canvas4" width="700" height="200">Your browser is too old</canvas> <script> var myCanvas=document.getElementById("canvas4"); var ctx = myCanvas.getContext("2d"); ctx.font="30px arial"; /* Text without transformation */ ctx.fillText("How to draw with JavaScript",10,50); /* Rotate an eighth of a turn */ ctx.rotate(Math.PI/4); ctx.fillText("How to draw with JavaScript",10,50); /* Display text vertically in position (280, 200) */ ctx.setTransform(1, 0, 0, 1, 280, 220); ctx.rotate(3*Math.PI/2); ctx.fillText("How to draw with JavaScript",0,0); </script> </body> </html> |
¡Y aquí hay algunos ejemplos de rotación de texto! | |
![]() | |
Por defecto la rotación se realiza en el punto (0, 0) del lienzo. Por lo tanto, es necesario utilizar los últimos 2 parámetros de setTransform() para traducir el punto de rotación. |
![]() |