El lienzo se estira cuando se usa CSS pero es normal con los atributos de "ancho" y "alto".
Tengo 2 lienzos, uno usa atributos HTML width
y height
para dimensionarlo, el otro usa CSS:
<canvas id="compteur1" width="300" height="300" onmousedown="compteurClick(this.id);"></canvas>
<canvas id="compteur2" style="width: 300px; height: 300px;" onmousedown="compteurClick(this.id);"></canvas>
Compteur1 se muestra como debería, pero no compteur2. El contenido se dibuja usando JavaScript en un lienzo de 300x300.
¿Por qué hay una diferencia de visualización?
Parece que los atributos width
y height
determinan el ancho o alto del sistema de coordenadas del lienzo, mientras que las propiedades CSS solo determinan el tamaño del cuadro en el que se mostrará.
Esto se explica en la especificación HTML :
El
canvas
elemento tiene dos atributos para controlar el tamaño del mapa de bits del elemento:width
yheight
. Estos atributos, cuando se especifican, deben tener valores que sean enteros no negativos válidos . Se deben utilizar las reglas para analizar números enteros no negativos para obtener sus valores numéricos. Si falta un atributo, o si el análisis de su valor devuelve un error, entonces se debe utilizar el valor predeterminado. Elwidth
atributo por defecto es 300 y elheight
atributo por defecto es 150.
Para configurar width
y height
en un lienzo, puede usar:
canvasObject.setAttribute('width', '150');
canvasObject.setAttribute('height', '300');
Para <canvas>
los elementos, las reglas CSS width
y height
establecen el tamaño real del elemento del lienzo que se dibujará en la página. Por otro lado, los atributos HTML de width
y height
establecen el tamaño del sistema de coordenadas o 'cuadrícula' que utilizará la API del 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>
Ambos tienen dibujado lo mismo en relación con las coordenadas internas del elemento del lienzo. Pero en el segundo lienzo, el rectángulo rojo será el doble de ancho porque las reglas CSS estiran el lienzo en su conjunto a lo largo de un área más grande.
Nota: Si las reglas CSS para width
y/o height
no se especifican, el navegador utilizará los atributos HTML para dimensionar el elemento de manera que 1 unidad de estos valores equivalga a 1 px en la página. Si estos atributos no se especifican, el valor predeterminado será a width
of 300
y a height
of 150
.
Corrección animal
var el = $('#mycanvas');
el.attr('width', parseInt(el.css('width')))
el.attr('height', parseInt(el.css('height')))