Largeur et hauteur du canevas en HTML5

190

Est-il possible de fixer la largeur et la hauteur d'un canvasélément HTML5 ?

La manière habituelle est la suivante:

<canvas id="canvas" width="300" height="300"></canvas>
Dustin
la source

Réponses:

394

L' canvasélément DOM a des propriétés .heightet .widthqui correspondent aux attributs height="…"et width="…". Définissez-les sur des valeurs numériques dans le code JavaScript pour redimensionner votre canevas. Par exemple:

var canvas = document.getElementsByTagName('canvas')[0];
canvas.width  = 800;
canvas.height = 600;

Notez que cela efface le canevas, bien que vous devriez suivre avec ctx.clearRect( 0, 0, ctx.canvas.width, ctx.canvas.height);pour gérer les navigateurs qui ne nettoient pas complètement le canevas. Vous devrez redessiner tout contenu que vous vouliez afficher après le changement de taille.

Notez en outre que la hauteur et la largeur sont les dimensions logiques du canevas utilisées pour le dessin et sont différentes des attributs style.heightet style.widthCSS. Si vous ne définissez pas les attributs CSS, la taille intrinsèque du canevas sera utilisée comme taille d'affichage; si vous définissez les attributs CSS et qu'ils diffèrent des dimensions du canevas, votre contenu sera mis à l'échelle dans le navigateur. Par exemple:

// Make a canvas that has a blurry pixelated zoom-in
// with each canvas pixel drawn showing as roughly 2x2 on screen
canvas.width  = 400;
canvas.height = 300; 
canvas.style.width  = '800px';
canvas.style.height = '600px';

Voir cet exemple en direct d'un canevas zoomé 4x.

Phrogz
la source
1
@Hazaart Si vous voulez les définir différemment: $('#mycanvas').attr({width:400,height:300}).css({width:'800px',height:'600px'});Si vous voulez que la taille visuelle soit la même que la taille des pixels, ne définissez jamais les styles, uniquement les attributs.
Phrogz
1
"Si vous voulez que la taille visuelle soit la même que la taille des pixels, ne définissez jamais les styles, uniquement les attributs", y a-t-il une raison à cette préférence? Si j'ai beaucoup d'objets dans le canevas et que je veux zoomer / zoomer, il serait beaucoup plus rapide de simplement réinitialiser le css, non? (Plutôt que de parcourir tous les objets) ...
AnglaisAdam
3
@Gamemorize: le zoom via CSS le rend flou. Cependant, vous pouvez zoomer via la mise à l'échelle du contexte et la traduction entre les redessiner au lieu de changer la «taille» de chaque objet.
Phrogz le
1
Merci beaucoup. Je vois maintenant ce que fait CSS ... il traite le canevas "comme" une image, la mise à l'échelle d'une image n'est évidemment pas aussi bonne que la "redessiner"!
AnglaisAdam
3
De plus, vous pouvez désormais effectuer un "zoom avant pixelisé clair" au lieu d'un "zoom avant pixelisé flou", du moins sur Chrome, en utilisant le style "rendu d'image: pixelisé" sur le canevas. J'ai tripoté votre violon pour montrer la différence: jsfiddle.net/donhatch/9bheb/1663
Don Hatch
71

Un canevas a 2 tailles, la dimension des pixels dans le canevas (c'est le backingstore ou drawingBuffer) et la taille d'affichage. Le nombre de pixels est défini à l'aide des attributs du canevas. En HTML

<canvas width="400" height="300"></canvas>

Ou en JavaScript

someCanvasElement.width = 400;
someCanvasElement.height = 300;

La largeur et la hauteur du style CSS du canevas sont séparées de cela

En CSS

canvas {  /* or some other selector */
   width: 500px;
   height: 400px;
}

Ou en JavaScript

canvas.style.width = "500px";
canvas.style.height = "400px";

La meilleure façon de créer un canevas 1x1 pixels est de TOUJOURS UTILISER CSS pour choisir la taille, puis d'écrire un tout petit peu de JavaScript pour que le nombre de pixels corresponde à cette taille.

function resizeCanvasToDisplaySize(canvas) {
   // look up the size the canvas is being displayed
   const width = canvas.clientWidth;
   const height = canvas.clientHeight;

   // If it's resolution does not match change it
   if (canvas.width !== width || canvas.height !== height) {
     canvas.width = width;
     canvas.height = height;
     return true;
   }

   return false;
}

Pourquoi est-ce le meilleur moyen? Parce que cela fonctionne dans la plupart des cas sans avoir à changer de code.

Voici une toile de fenêtre complète:

Et voici une toile en tant que flotteur dans un paragraphe

Voici une toile dans un panneau de contrôle de grande taille

voici une toile en arrière-plan

Parce que je n'ai pas défini les attributs, la seule chose qui a changé dans chaque échantillon est le CSS (en ce qui concerne le canevas)

Remarques:

  • Ne placez pas de bordures ou de remplissage sur un élément de canevas. Le calcul de la taille à soustraire du nombre de dimensions de l'élément est gênant
gman
la source
1
Meilleure réponse, cet extrait de code devrait être une méthode de canevas DOM standard.
rustypaper le
23

Merci beaucoup! Enfin, j'ai résolu le problème des pixels flous avec ce code:

<canvas id="graph" width=326 height=240 style='width:326px;height:240px'></canvas>

Avec l'ajout du `` demi-pixel '', il suffit de supprimer les lignes.

user1463699
la source
26
@UpTheCreek Si vous tracez une ligne dans le canevas, cela semble plus net, alors il devrait, comme si elle était floue. En plaçant les lignes sur des demi-pixels (disons 50,5 au lieu de 50), vous obtenez une belle ligne nette. Cela se fait souvent en utilisant ctx.translate (0.5, 0.5) au tout début de votre code afin que vous puissiez l'oublier par la suite
Johan
-2

La meilleure façon de le faire:

<canvas id="myChart" style="height: 400px; width: 100px;"></canvas>
rohan parab
la source