HTML5でのキャンバスの幅と高さ


181

HTML5 canvas要素の幅と高さを修正することは可能ですか?

通常の方法は次のとおりです。

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

回答:


380

canvasDOM要素を持っている.height.widthプロパティに対応するheight="…"width="…"属性。JavaScriptコードでそれらを数値に設定して、キャンバスのサイズを変更します。例えば:

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

これによりキャンバスがクリアされることに注意してください。ただしctx.clearRect( 0, 0, ctx.canvas.width, ctx.canvas.height);、キャンバスを完全にクリアしないブラウザを処理するために、この手順に従う必要があります。サイズ変更後に表示したいコンテンツを再描画する必要があります。

さらに、高さと幅は描画に使用されるキャンバスの論理的な寸法であり、およびCSS属性とは異なります。CSS属性を設定しない場合、キャンバスの固有のサイズが表示サイズとして使用されます。CSS属性を設定し、それらがキャンバスの寸法と異なる場合、コンテンツはブラウザーで拡大縮小されます。例えば:style.heightstyle.width

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

4xに拡大されたキャンバスの実例をご覧ください。


1
@Hazaart別に設定したい場合:$('#mycanvas').attr({width:400,height:300}).css({width:'800px',height:'600px'});視覚的なサイズをピクセルサイズと同じにしたい場合は、スタイルのみを設定し、属性のみを設定します。
Phrogz 2013年

1
「視覚的なサイズをピクセルサイズと同じにしたいが、スタイルは設定せず、属性のみを設定したい場合」、この設定に理由はありますか?キャンバスに多くのオブジェクトがあり、ズームイン/ズームアウトしたい場合、CSSをリセットするだけの方がはるかに高速です(いいえ、すべてのオブジェクトをループするよりも)...
EnglishAdam

3
@Gamemorize:CSSでズームするとぼやけて見えます。ただし、各オブジェクトの「サイズ」を変更する代わりに、コンテキストのスケーリングと再描画間の変換を介してズームできます。
Phrogz、2014

1
ありがとうございます。CSSが何をしているのかがわかります...それはキャンバスを画像のように扱います。画像のスケーリングは明らかに '再描画'ほど良くありません!
英語Adam

3
また、少なくともChromeでは、キャンバスで「image-rendering:pixelated」スタイルを使用して、「ぼやけたピクセル化ズームイン」の代わりに「クリアピクセル化ズームイン」を実行できるようになりました。私は違いを示すためにあなたのフィドルをいじっ:jsfiddle.net/donhatch/9bheb/1663
ドンハッチ

62

キャンバスには2つのサイズがあります。キャンバス内のピクセルの寸法(backingstoreまたはdrawingBuffer)と表示サイズです。ピクセル数は、キャンバス属性を使用して設定されます。HTMLで

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

またはJavaScriptで

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

それとは別に、キャンバスのCSSスタイルの幅と高さ

CSSで

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

またはJavaScriptで

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

間違いなくキャンバスを1x1ピクセルにする最良の方法は、常にCSS使用してサイズを選択し、小さなJavaScriptを記述してピクセル数をそのサイズに一致させることです。

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

なぜこれが最善の方法ですか?ほとんどの場合、コードを変更する必要なく機能するためです。

これがフルウィンドウのキャンバスです:

そして、これは段落のフロートとしてのキャンバスです

これはかなり大きなコントロールパネルのキャンバスです

これが背景のキャンバスです

属性を設定しなかったため、各サンプルで変更されたのはCSSのみです(キャンバスに関する限り)。

ノート:

  • キャンバス要素にボーダーやパディングを配置しないでください。要素の次元数から差し引くサイズを計算するのは面倒です

最良の回答です。このスニペットは、標準のDOMキャンバスメソッドである必要があります。
rustypaper

23

どうもありがとうございました!最後に、このコードでぼやけたピクセルの問題を解決しました:

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

「ハーフピクセル」を追加することで、線をぼかすことができます。


26
@UpTheCreekキャンバスに線を描くと、ぼやけているように、ティッカーのように見えます。半分のピクセル(たとえば、50ではなく50.5)にラインを配置すると、きれいできれいなラインが得られます。これは多くの場合、コードの最初でctx.translate(0.5、0.5)を使用して行われるため、後で忘れることができます
Johan

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.