Para los <canvas>elementos, las reglas CSS widthy heightestablecen el tamaño real del elemento del lienzo que se dibujará en la página. Por otro lado, los atributos HTML de widthy heightestablecen el tamaño del sistema de coordenadas o 'cuadrícula' que utilizará la API de lienzo.
Por ejemplo, considere esto ( jsfiddle ):
var ctx = document.getElementById('canvas1').getContext('2d');
ctx.fillStyle = "red";
ctx.fillRect(10, 10, 30, 30);
var ctx2 = document.getElementById('canvas2').getContext('2d');
ctx2.fillStyle = "red";
ctx2.fillRect(10, 10, 30, 30);
canvas {
border: 1px solid black;
}
<canvas id="canvas1" style="width: 50px; height: 100px;" height="50" width="100"></canvas>
<canvas id="canvas2" style="width: 100px; height: 100px;" height="50" width="100"></canvas>
A ambos se les ha dibujado lo mismo en relación con las coordenadas internas del elemento de lienzo. Pero en el segundo lienzo, el rectángulo rojo tendrá el doble de ancho porque las reglas de CSS extienden el lienzo como un todo en un área más grande.
Nota: Si las reglas CSS para widthy / o heightno se especifican, el navegador usará los atributos HTML para dimensionar el elemento de manera que 1 unidad de estos valores sea igual a 1px en la página. Si no se especifican estos atributos, los valores predeterminados serán a widthde 300y a heightde 150.