A small drawing area in the page where JavaScript can draw shapes, text, and images right on the spot.
ページの中に小さな“お絵かきボード”を作って、JavaScriptで図形や文字、画像をその場で描ける仕組み。
Canvas は、HTML5 で新たに導入された canvas 要素に図を描画します。そのため、まず、事前に canvas 要素を用意する必要があります。
HTML
<canvas width="300" height="150">
このブラウザは canvas に対応していません。
</canvas>
ここでは、中身を何も用意していないため、何も表示されていません。
canvas 要素には、Canvas 領域に幅を表す width 属性と、高さを表す height 属性が規定されます。これらに指定する値は数値でなければいけません。そして、その長さの単位はピクセルです。
これらの属性は必須ではありません。もし指定しなければ、デフォルト値が適用され、width は 300、height は 150 となります。
ブラウザは、canvas 要素の準備ができると、透明な黒で全体を塗りつぶした状態でレンダリングします。そのため、canvas に何も描かなければ、ページの背景が透けた状態になります。
次に、用意した canvas 要素に図形を描画するために、JavaScript を使用するので、JavaScript の指示がどの要素に対するものか明確にするための名前を付けます。
HTML
<canvas id="myCanvas"></canvas>
ここでは、「 myCanvas 」と名前を付けました。
次からは、canvas 要素に描画するための JavaScript を準備していきます。
まず、関数(function)を準備し、ここでは「 draw() 」と名前を付けました。
HTML
<script>
function draw() {
};
</script>
用意した関数を、body 要素で load イベントを使って呼び出します。
HTML
<html>
<head>
<script>
function draw() {
};
</script>
</head>
<body onload="draw();">
<canvas id="myCanvas"></canvas>
</body>
</html>
次に、変数 canvas を用意し、getElementById メソッドを使って、上で名前を付けた canvas 要素の ID(myCanvas)を取得します。
HTML
<script>
function draw() {
const canvas = document.getElementById('myCanvas');
};
</script>
さらに、変数 context を用意し、canvas 要素で描画方法を指定するための getContext() メソッドを呼び出します。他の描画方法もありますが、ここでは 2D での描画方法を指定します。
HTML
<script>
function draw() {
const canvas = document.getElementById('myCanvas');
const context = canvas.getContext('2d');
};
</script>
これで、canvas 要素に図形を描画するための準備ができましたので、矩形を描画するための fillRect メソッドを使ってみます。
HTML
<script>
function draw() {
const canvas = document.getElementById('myCanvas');
const context = canvas.getContext('2d');
context.fillRect(25, 25, 100, 100);
}
</script>
canvas 要素の描画サンプル
ここまでで、黒い正方形が描画されたと思います。色が黒いのは、キャンバスに塗りつぶし色の初期値(context.fillStyle)が黒のため、そのままだと黒い四角になります。背景は透明のままです。
ちなみに fillRect メソッドを書き直すと次のようになります。
fillRect(x, y, width, height);
それぞれ、
xx 座標のスタート地点。yy 座標のスタート地点。widthheightを、意味し、ピクセル単位で指定します。
width/height はCSSで指定してもいい?canvas の初期ピクセルは「透明な黒」です。何も描かない部分は透過します。fillStyle の初期値が黒(#000)だからです。色を変えるには先に context.fillStyle = '色'; を設定します。getContext('2d') が null になることはある?if (!context) return; のようにガードしましょう。requestAnimationFrame を使うと滑らかに更新できます。id の打ち間違い/要素より先にスクリプトが実行。idを確認、load/deferを使う。width/heightを適切に設定、HiDPI対応(devicePixelRatio)。fillStyle を設定していない。context.fillStyle を指定。getContext('2d') が失敗/描画コードが実行されていない。