canvasタグのサイズ設定方法と動作の違い(JavaScript)

この記事は約4分で読めます。
スポンサーリンク

やりたいこと

canvasタグは2つの方法でサイズを指定でき見た目は同じが、JavaScriptで扱う際に動作が異なるので確認します。

スポンサーリンク

環境

Chrome: 113.0.5672.127

スポンサーリンク

Canvasのサイズ設定方法

CanvasのサイズはattributeとStyleで設定できます。

下のように表示の結果は同様です。

attribute(canvasタグ内)での設定

<canvas width=200 height=200></canvas>

上記のhtmlで200×200のCanvasが下のように描画できます。

(領域がわかりやすいように背景を灰色にしています。)

Styleでの設定

<canvas style="width:200px; height:200px;"></canvas>

上記のhtmlで200×200のCanvasが下のように描画できます。

(領域がわかりやすいように背景を灰色にしています)

スポンサーリンク

JavaScriptで操作

座標系

試験

attributeとStyleでサイズを設定したcanvasに以下のScriptを実行してみます。

(0,0)から(100,100)に青の線を描きます。

Canvasのサイズは200×200なので左上から真ん中に青い線が引かれるはずです。

/*canvas からContext(let ctx)を取得 */

ctx.beginPath() ;
ctx.moveTo( 0, 0 ) ;
ctx.lineTo( 100, 100 )
ctx.strokeStyle = "blue" ;
ctx.lineWidth = 5 ;
ctx.stroke() ;

attribute

style

結果

上のようにattributeで設定した場合、想定した通りの動作になります。

しかしstyleで指定した場合、想定した通りの動作になりません。

それぞれのWidth/Heightの意味

ここではなぜ二つのWidth/Heightの設定方法で差が出たのかを説明します。

結論から言ってしまうとattributeとStyleで設定するWidth/Heightが異なります。

attributeとStyleのWidth/Heightの意味は以下の通りです。

attribute : 座標空間の幅/高さ

Style : 表示の幅/高さ

つまりstyleでWidth/Heightを設定してもCanvas内の座標は変わりません。

attributeでWidth/Heightをしない場合、座標空間は300×150になります。

つまり以下の例では300×150のCanvasを200x200に変形して表示します。

<canvas style="width:200px; height:200px;"></canvas>

そのため想定していた結果にはなっていませんでした。

結論

Canvasの中の座標のサイズを設定する場合はattributeで指定します。

ただしStyleでの設定が不要というわけではありません。

例えばattributeでサイズを変更してしまうと、JavaScriptでの描画処理を修正する必要があります。

しかしStlyeではサイズを変更するだけで拡大/縮小することができます。

attributeでcanvas座標のサイズを指定した後にWindowサイズに合わせてStyleで表示サイズを変更するという実装も可能です。

スポンサーリンク

参考にさせていただいたサイト

: グラフィックキャンバス要素 - HTML: ハイパーテキストマークアップ言語 | MDN
HTML の 要素 と キャンバススクリプティング API や WebGL API を使用して、グラフィックやアニメーションを描画することができます。

コメント

タイトルとURLをコピーしました