Larghezza e altezza della tela in HTML5


181

È possibile correggere la larghezza e l'altezza di un canvaselemento HTML5 ?

Il solito modo è il seguente:

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

Risposte:


380

L' canvaselemento DOM ha .heighte .widthproprietà che corrispondono agli attributi height="…"e width="…". Impostali su valori numerici nel codice JavaScript per ridimensionare la tela. Per esempio:

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

Si noti che questo cancella la tela, anche se è necessario seguire ctx.clearRect( 0, 0, ctx.canvas.width, ctx.canvas.height);per gestire quei browser che non cancellano completamente la tela. Dovrai ridisegnare tutti i contenuti che volevi visualizzare dopo la modifica delle dimensioni.

Si noti inoltre che l'altezza e la larghezza sono le dimensioni logiche dell'area di disegno utilizzate per il disegno e sono diverse dagli attributi CSS style.heighte style.width. Se non imposti gli attributi CSS, la dimensione intrinseca dell'area di disegno verrà utilizzata come dimensione di visualizzazione; se imposti gli attributi CSS e differiscono dalle dimensioni della tela, i tuoi contenuti verranno ridimensionati nel browser. Per esempio:

// 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';

Guarda questo esempio dal vivo di una tela ingrandita di 4x.


1
@Hazaart Se si desidera impostarli in modo diverso: $('#mycanvas').attr({width:400,height:300}).css({width:'800px',height:'600px'});se si desidera che la dimensione visiva sia uguale alla dimensione in pixel, non impostare mai gli stili, ma solo gli attributi.
Phrogz,

1
"Se vuoi che la dimensione visiva sia uguale alla dimensione dei pixel, non impostare mai gli stili, ma solo gli attributi", c'è un motivo per questa preferenza? Se Ho molti oggetti nella tela e voglio Zoomin / ZoomOut, sarebbe molto più veloce per appena ripristinare il css, no (invece di scorrere tutti gli oggetti) ...?
EnglishAdam

3
@Gamemorize: lo zoom tramite CSS lo rende sfocato. Tuttavia, è possibile eseguire lo zoom tramite ridimensionamento del contesto e traduzione tra ridisegno invece di modificare le "dimensioni" di ciascun oggetto.
Phrogz,

1
Grazie molto apprezzato. Vedo ora cosa sta facendo CSS ... tratta la tela "come" un'immagine, ridimensionare un'immagine non è ovviamente buono come "ridisegnarla"!
EnglishAdam

3
Inoltre, ora puoi fare "cancella ingrandimento pixelato" invece di "ingrandimento pixel sfocato", almeno su Chrome, usando lo stile "rendering immagine: pixelato" sulla tela. Ho suonato il violino per mostrare la differenza: jsfiddle.net/donhatch/9bheb/1663
Don Hatch

62

Una tela ha 2 dimensioni, la dimensione dei pixel nella tela (è backingstore o drawingBuffer) e la dimensione di visualizzazione. Il numero di pixel viene impostato utilizzando gli attributi canvas. In HTML

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

O in JavaScript

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

A parte ciò ci sono la larghezza e l'altezza dello stile CSS della tela

Nel CSS

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

O in JavaScript

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

Il modo migliore per creare una tela 1x1 pixel è UTILIZZARE SEMPRE i CSS per scegliere la dimensione, quindi scrivere un po 'di JavaScript per far corrispondere il numero di pixel a quella dimensione.

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;
}

Perché è questo il modo migliore? Perché funziona nella maggior parte dei casi senza dover modificare alcun codice.

Ecco una tela a finestra intera:

Ed ecco una tela come galleggiante in un paragrafo

Ecco una tela in un pannello di controllo considerevole

ecco una tela come sfondo

Perché non ho impostato gli attributi, l'unica cosa che è cambiata in ogni campione è il CSS (per quanto riguarda la tela)

Appunti:

  • Non mettere bordi o imbottiture su un elemento di tela. Calcolare la dimensione da sottrarre dal numero di dimensioni dell'elemento è problematico

La migliore risposta, questo frammento dovrebbe essere un metodo di tela DOM standard.
Rustypaper,

23

Grazie mille! Alla fine ho risolto il problema dei pixel sfocati con questo codice:

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

Con l'aggiunta del "mezzo pixel" si risolvono le linee.


26
@UpTheCreek Se si disegna una linea su tela, sembra ticker quindi dovrebbe, come se fosse sfocata. Mettendo le linee su mezzo pixel (diciamo 50.5 anziché 50) si ottiene una linea pulita e piacevole. Questo è spesso fatto usando ctx.translate (0,5, 0,5) all'inizio del codice, in modo da poterlo dimenticare in seguito
Johan,

-2

Il modo migliore per farlo:

<canvas id="myChart" style="height: 400px; width: 100px;"></canvas>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.