Esta especificación permite crear y manipular gráficos en una superficie. Canvas es compatible con – IE9+.
Para utilizar canvas tenemos que crear la etiqueta en el documento html. Para que se pueda visualizar de manera correcta, es necesario especificar el tamaño del canvas directamente en la etiqueta.
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<title>canvas</title>
<style>
#contenedor {width: 940px; height: 500px; margin: 0 auto; border: 1px solid #000; text-align: center;}
canvas {margin: 2em auto; background:#c5c5c5;}
</style>
</head>
<body>
<div id='contenedor'>
<canvas id='canvas' width="500" height='250'>
<p>
El texto se va a visualizar en los navegadores que no soporten la etiqueta canvas
</p>
</canvas>
</div>
</body>
</html>
Una vez que tenemos el canvas hay que especificar el contexto en el cual lo queremos utilizar. En este caso es 2d (es importante que la d sea minúscula).
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<title>canvas</title>
<style>
#contenedor {width: 940px; height: 500px; margin: 0 auto; border: 1px solid #000; text-align: center;}
canvas {margin: 2em auto; background:#c5c5c5;}
</style>
</head>
<body>
<div id='contenedor'>
<canvas id='canvas' width="500" height='250'>
<p>
El texto se va a visualizar en los navegadores que no soporten la etiqueta canvas
</p>
</canvas>
</div>
<script>
var canvas = document.getElementById('canvas');
var contexto = canvas.getContext('2d');
</script>
</body>
</html>
Una vez definido el canvas y el contexto podemos comenzar a dibujar.
Propiedades generales
Hay diferentes propiedades que podemos utilizar en los elementos.
Relleno, contorno, ancho de línea.
Propiedad |
Descripción |
fillStyle |
Permite obtener o asignar un valor para rellenar formas. |
stokeStyle |
Permite obtener o asignar un valor para el contorno de las formas. |
lineWidth |
Permite obtener o asignar el ancho de la línea. |
Degradado
Existen dos maneras para crear un degradado: linear y radial.
En este caso únicamente vamos a definir el degradado lineal.
Para crear un degradado lineal es necesario utilizar un contexto.
En el contexto se define el tamaño del degradado indicando la posición de inicio (x1, y1) y la posición final (x2, y2).
Una vez que se definió el degradado podemos definir puntos en los cuales queremos utilizar un color. Para esto vamos a utilizar addColorStop(posición, color).
El primer valor es un número decimal que va del 0 al 1 y representa el porcentaje (0% al 100%) en el que se comienza a utilizar el color.
El segundo valor es el color que se quiere utilizar (acepta los valores permitidos en CSS).
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<title>canvas</title>
<style>
#contenedor {width: 940px; height: 500px; margin: 0 auto; border: 1px solid #000; text-align: center;}
canvas {margin: 2em auto; background:#c5c5c5;}
</style>
</head>
<body>
<div id='contenedor'>
<canvas id='canvas' width="800" height='450'>
<p>
El texto se va a visualizar en los navegadores que no soporten la etiqueta canvas
</p>
</canvas>
</div>
<script>
var canvas = document.getElementById('canvas');
var contexto = canvas.getContext('2d');
var horizontal = canvas.width;
var degradado = contexto.createLinearGradient(0,0, horizontal,0);
degradado.addColorStop(0.00, 'red');
degradado.addColorStop(0.25, 'green');
degradado.addColorStop(0.50, 'blue');
degradado.addColorStop(0.75, 'white');
degradado.addColorStop(1.00, 'black');
</script>
</body>
</html>
Patrón
Para crear un patrón se puede utilizar una imagen o video. El patrón se puede repetir horizontal y / o verticalmente.
Para asegurar que el elemento (imagen / video) está disponible es recomendable crear el patrón una vez que el navegador carga el elemento.
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<title>canvas</title>
<style>
#contenedor {width: 940px; height: 500px; margin: 0 auto; border: 1px solid #000; text-align: center;}
canvas {margin: 2em auto; background:#c5c5c5;}
</style>
</head>
<body>
<div id='contenedor'>
<canvas id='canvas' width="800" height='450'>
<p>
El texto se va a visualizar en los navegadores que no soporten la etiqueta canvas
</p>
</canvas>
</div>
<script>
var jirafa = new Image();
jirafa.src = 'jirafa.png';
var canvas = document.getElementById('canvas');
var contexto = canvas.getContext('2d');
jirafa.onload = function() {
patron = contexto.createPattern(jirafa, 'repeat');
};
</script>
</body>
</html>
Nota:
Un degradado o patrón únicamente van a ser visibles cuando se asocian a un elemento del canvas.
Imágenes
Dentro del canvas es posible visualizar imágenes utilizando drawImage
Podemos utilizar diferentes argumentos para definir cómo se va a mostrar la imagen.
Métodos |
Descripción |
drawImage(img, x , y); |
Define la imagen y la posición que va a tener dentro del canvas. |
drawImage(img, x , y, w, h); |
Define la imagen, la posición que va a tener dentro del canvas y el tamaño que va a tener la imagen en el canvas. |
drawImage(img, ox1, oy1, ox2, oy2, x , y, w, h); |
Define la imagen. Los primeros cuatro parámetros (origen) permiten definir la sección de la imagen original que se quiere mostrar. Esto sirve si se quiere visualizar una sección de la imagen. Los siguientes cuatro parámetros funcionan como el destino. Una vez que se delimitó la sección de la imagen a mostrar, se posiciona horizontal / verticalmente y se le asigna un tamaño. |
Al igual que con los patrones, es recomendable esperar a que la imagen se cargue en el navegador para mostrarla en el DOM.
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<title>canvas</title>
<style>
#contenedor {width: 940px; height: 500px; margin: 0 auto; border: 1px solid #000; text-align: center;}
canvas {margin: 2em auto; background:#c5c5c5;}
</style>
</head>
<body>
<div id='contenedor'>
<canvas id='canvas' width="800" height='450'>
<p>
El texto se va a visualizar en los navegadores que no soporten la etiqueta canvas
</p>
</canvas>
</div>
<script>
var jirafa = new Image();
jirafa.src = 'jirafa.png';
var canvas = document.getElementById('canvas');
var contexto = canvas.getContext('2d');
// Obtener las medidas del canvas
var horizontal = canvas.width;
var vertical = canvas.height;
// Una vez que el navegador cargó la imagen
// la podemos visualizar
jirafa.onload = function () {
var posicion_horizontal = canvas.width / 2 - jirafa.width / 2;
var posicion_vertical = canvas.height / 2 - jirafa.height / 2;
var tam_horizontal = jirafa.width / 2;
var tam_vertical = jirafa.height / 2;
// Centrar la imagen original
contexto.drawImage(jirafa, posicion_horizontal , posicion_vertical);
// Centrar la imagen original, visualizar a la mitad
// contexto.drawImage(jirafa, posicion_horizontal , posicion_vertical, tam_horizontal, tam_vertical);
// x1, y1, x2, y2, -> De la imagen para mostrar únicamente la parte definida en la posición / tamaño definidos en la segunda parte.
// contexto.drawImage(jirafa, 0, 0, 200, 200, posicion_horizontal , posicion_vertical, tam_horizontal, tam_vertical);
};
</script>
</body>
</html>
Texto
Para dibujar texto podemos utilizar dos funciones.
Atributo / Función |
Descripción |
fillText(mensaje, x, y, maxWidth) |
Crea el mensaje. Visualiza el relleno del texto, en la posición indicada. |
strokeText(mensaje, x, y, maxWidth) |
Crea el mensaje. Visualiza el contorno del texto, en la posición indicada. |
font |
Permite definir la fuente con la cual se va a visualizar el texto. |
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<title>canvas</title>
<style>
#contenedor {width: 940px; height: 500px; margin: 0 auto; border: 1px solid #000; text-align: center;}
canvas {margin: 2em auto; background:#c5c5c5;}
</style>
</head>
<body>
<div id='contenedor'>
<canvas id='canvas' width="800" height='450'>
<p>
El texto se va a visualizar en los navegadores que no soporten la etiqueta canvas
</p>
</canvas>
</div>
<script>
var canvas = document.getElementById('canvas');
var contexto = canvas.getContext('2d');
var mensaje = "¡Hola Canvas!";
contexto.font = "140px helvetica";
// Dibujar el relleno del texto en color rojo transparente
contexto.fillStyle = "rgba(255,0,0,0.45)";
contexto.fillText(mensaje , 4, 180 , 790);
// Dibujar el relleno del texto en color azul transparente
contexto.fillStyle = "rgba(0,0,255,0.45)";
contexto.fillText(mensaje , 10, 180 , 790);
// Dibujar el contorno del texto en color negro
contexto.strokeStyle = "#151515";
contexto.strokeText(mensaje , 7, 180 , 790);
</script>
</body>
</html>
Rectángulos
Canvas también permite dibujar rectángulos de manera sencilla.
Método |
Descripción |
fillRect(x,y,w,h) |
Se encarga de dibujar el relleno de un área rectangular que tiene origen en x, y, y que tiene un |
strokeRect(x,y,w,h) |
Se encarga de dibujar el contorno de un área rectangular que tiene origen en x, y, y que tiene un |
clearRect(x,y,w,h) |
Se encarga de borrar un área rectangular que tiene origen en x, y, y que tiene un |
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<title>canvas</title>
<style>
#contenedor {width: 940px; height: 500px; margin: 0 auto; border: 1px solid #000; text-align: center;}
canvas {margin: 2em auto; background:#c5c5c5;}
</style>
</head>
<body>
<div id='contenedor'>
<canvas id='canvas' width="500" height='250'>
<p>
El texto se va a visualizar en los navegadores que no soporten la etiqueta canvas
</p>
</canvas>
</div>
<script>
var canvas = document.getElementById('canvas');
// Case does matter in the context is 2d
var contexto = canvas.getContext('2d');
// Dibujar el relleno del rectángulo en color rojo transparente
contexto.fillStyle = "rgba(255,0,0,0.45)";
contexto.fillRect(10, 10, 380 , 180);
// Dibujar el relleno del rectángulo en color azul transparente
contexto.fillStyle = "rgba(0,0,255,0.45)";
contexto.fillRect(20 , 20, 380 , 180);
// Limpiar el relleno del rectángulo en color azul transparente
contexto.clearRect(20 , 20, 370 , 170);
// Dibujar el contorno del rectángulo en color negro
contexto.strokeStyle = "#151515";
contexto.strokeRect(15 , 15, 380 , 180);
</script>
</body>
</html>
Trazos
Método |
Descripción |
beginPath() |
Comienza o reestablece un trazo. |
moveTo(x,y) |
Se posiciona en las coordenadas x,y. |
lineTo(x,y) |
Crea una línea desde la posición en la que se encuentra a la posición definida. |
.arc(x,y,radio,anguloInicial,anguloFinal[, contrareloj]) |
Crea un arco en la posición indicada. Para crear el arco se utiliza el radio, los ángulos de inicio / fin. Se puede indicar si quiere que el sentido vaya en contra de las manecillas del reloj. |
fill() |
Rellena el trazo actual o parte del trazo con el estilo de relleno definido. |
stroke() |
Dibuja el contorno del trazo con el estilo de contorno definido. |
clip() |
Restringe la sección de recorte de la ruta actual. |
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<title>canvas</title>
<style>
#contenedor {width: 940px; height: 500px; margin: 0 auto; border: 1px solid #000; text-align: center;}
canvas {margin: 2em auto; background:#c5c5c5; }
</style>
</head>
<body>
<div id='contenedor'>
<canvas id='canvas' width="800" height='450'>
<p>
El texto se va a visualizar en los navegadores que no soporten la etiqueta canvas
</p>
</canvas>
</div>
<script>
var canvas = document.getElementById('canvas');
var contexto = canvas.getContext('2d');
contexto.lineWidth = 1;
contexto.strokeStyle = "#151515";
contexto.fillStyle = "#f0f0f0";
// Líneas
contexto.beginPath();
contexto.moveTo(0,0);
contexto.lineTo(canvas.width,canvas.height);
contexto.moveTo(0,0);
contexto.lineTo(canvas.width / 2,canvas.height);
contexto.stroke();
// Círculo
contexto.beginPath();
contexto.arc(500,80,50, 0, 360);
contexto.stroke();
</script>
</body>
</html>
Esto es solo una parte de lo que se puede hacer con el contexto 2d en canvas. Descarga los ejemplos de referencia.