今回から「canvas」の使い方について見ていきましょう。
「canvas」はHTMLのタグですが、実装するには、JavaScriptが必要になります。
まずは基本的な描画の仕方について見ていきましょう。
canvas
<canvas>
<canvas id = “sample” width = “300” height = “150” ></canvas>
widthとheight属性は省略出来ますが、その場合デフォルトでは幅300px、高さ150pxになります。
getContext()
このままHTMLに記述してもキャンパスは空のままなので、JavaScriptで「getContext()」メソッドを使用する必要があります。
const canvas = document.getElementById('sample'); const cont = canvas.getContext('2d');
getContext()メソッドは、引数として以下のパラメーターを持つことが出来ます。
- 2d:2次元グラフィックスを描画するための「CanvasRenderingContext2D」を取得します。
- webgl:3次元グラフィックスを描画するための「WebGLRenderingContext」を取得します。
- webgl2:3次元グラフィックスを描画するための「WebGL2RenderingContext」を取得します。bitmaprenderer:キャンパスのコンテンツを「ImageBitmapRenderingContext」を取得することにより、画像を置き換えることが出来ます。
詳しくは以下、MDNのサイトをご参照ください。
以下のプロパティを指定することで、描画することが出来ます。
プロパティ | 意味 | |
---|---|---|
矩形 | clearRect(x,y,width,height) | 透明色で塗りつぶします |
fillRec(x,y,width,height) | 塗りつぶします | |
strokeRect(x,y,width,height) | 輪郭を描画します | |
文字列 | fillText() | テキストの内部を塗りつぶします |
strokeText() | テキストの輪郭を塗りつぶします | |
measureText() | テキストの情報を返します | |
線 | lineWidth | 線の太さを指定します |
lineCap | 線の端のスタイルを設定します | |
lineJoin | 2つの線が交わる場所の形状を指定します | |
getLineDash() | 破線のパターンを取得します | |
setLineDash() | 破線のパターンを指定します | |
lineDashOffset | 破線の開始点を指定します | |
文字列 | font | フォントを設定します |
textAlign | テキストの揃え方を指定します | |
textBaseline | ベースラインの揃え方を指定します | |
direction | テキストの方向を指定します | |
塗りつぶし | fillStyle | 図形の内側を塗りつぶす色やパターンを指定します |
ストロークスタイル | strokeStyle | 図形の輪郭に使用する色やパターンを指定します |
グラデーション | createLinerGradient() | 座標から線形グラデーションを作成します |
createRadialGradient() | 座標から放射状のグラデーションを作成します | |
パスの作成 | beginPath() | 新しいパスを作成します |
closePath() | 現在地点からサブパスの開始点まで 直線を追加します | |
stroke() | 輪郭をなぞります | |
fill() | パスの内部領域を塗りつぶします | |
moveTo() | 新しいパスの開始地点を指定します | |
lineTo() | 新しいパスの終了地点を指定します |
詳しい情報、その他のプロパティは上記のMDNのサイトでご確認ください。
矩形
<canvas id="sample"></canvas>
const canvas = document.getElementById('sample'); const cont = canvas.getContext('2d'); cont.fillStyle = 'rgb(200, 0, 0)'; cont.fillRect(10, 10, 100, 100); cont.fillStyle = 'rgba(65, 105, 225, 0.7)'; cont.fillRect(30, 30, 100, 100);
const canvas1 = document.getElementById('sample1'); const cont1 = canvas1.getContext('2d'); cont1.fillStyle = 'rgb(200, 0, 0)'; cont1.fillRect(25, 25, 100, 100); cont1.clearRect(45, 45, 60, 60); cont1.strokeRect(55, 55, 40, 40);
パス
const canvas2 = document.getElementById('sample2'); const cont2 = canvas2.getContext('2d'); cont2.beginPath(); cont2.moveTo(20, 140); cont2.lineTo(120, 10); cont2.lineTo(220, 140); cont2.closePath(); cont2.stroke();
「moveTo()」で最初の地点を指定して、「lineTo()」で次の地点を指定していきます。
ここでは、「lineTo(120,20)」で上の点、「lineTo(220,140)」で右下の点を指定しています。
「closePath()」で最初の点と最後の点を結んでいます。
「stroke()」で線の輪郭をなぞっています。
- moveTo():ペンを移動する
- lineTo():直線を描く
const canvas3 = document.getElementById('sample3'); const cont3 = canvas3.getContext('2d'); cont3.beginPath(); cont3.moveTo(100, 50); cont3.lineTo(75, 25); cont3.lineTo(75, 75); cont3.closePath(); cont3.stroke(); cont3.fillStyle = 'green'; cont3.fill();
「fillStyle」と「fill()」を使って描画を塗りつぶしています。
const canvas4 = document.getElementById('sample4'); const cont4 = canvas4.getContext('2d'); cont4.beginPath(); cont4.moveTo(25, 25); cont4.lineTo(75, 25); cont4.lineTo(25, 75); cont4.closePath(); cont4.fillStyle = 'green'; cont4.fill(); cont4.beginPath(); cont4.moveTo(80, 80); cont4.lineTo(80, 30); cont4.lineTo(30, 80); cont4.closePath(); cont4.stroke();
2つの三角形を描いています。
一つは塗りつぶし、もう一つは輪郭線のみ描いています。
円
円弧や円を描くには以下のメソッドを使用します。
- arc()
- arcTo()
arc(x, y, radius, startAngle, endAngle, counterclockwise)
「x、y」で円弧の中心位置、「radius」で半径、「startAngle」で円弧の開始角度、「endAngle」で円弧の終わりの角度、「counterclockwise」で方向を記述します。
arcTo(x1, y1, x2, y2, radius)
const canvas6 = document.getElementById('sample6'); const cont6 = canvas6.getContext('2d'); for (let i = 0; i <= 3; i++) { for (let r = 0; r <= 2; r++) { cont6.beginPath(); let x = 30 + r * 50; let y = 30 + i * 50; let radius = 20; let startAngle = 0; let endAngle = Math.PI + (Math.PI * r) / 2; //90度ずつ増加 let counterclockwise = i % 2 === 1; //trueの場合は反時計回り cont6.arc(x, y, radius, startAngle, endAngle, counterclockwise); if (i > 1) { cont6.fillStyle = 'green'; cont6.fill(); } else { cont6.stroke(); } } }
ベジェ曲線
quadraticCurveTo(cpx, cpy, x, y)
cpx :コントロールポイントの座標
x,y:終点の座標
const canvas7 = document.getElementById('sample7'); const cont7 = canvas7.getContext('2d'); cont7.beginPath(); cont7.moveTo(50, 20); //開始点 cont7.quadraticCurveTo(230, 30, 50, 100); //コントロールポイントと終点の座標 cont7.stroke();// 輪郭 cont7.beginPath(); cont7.arc(50, 20, 5, 0, 2 * Math.PI); // 開始点に丸 cont7.arc(50, 100, 5, 0, 2 * Math.PI); // 終点に丸 cont7.fillStyle = 'green'; cont7.fill(); cont7.beginPath(); cont7.arc(230, 30, 5, 0, 2 * Math.PI); //コントロールポイント cont7.fillStyle = 'red'; cont7.fill();
const canvas8 = document.getElementById('sample8'); const cont8 = canvas8.getContext('2d'); cont8.beginPath(); cont8.moveTo(20, 150); // 開始点 cont8.quadraticCurveTo(150, 150, 250, 20); //コントロールポイントと終点 cont8.stroke(); //輪郭
ベジェ曲線はやや難解です。
慣れるまでに時間を要する場合があります。
上の2つは2時曲線になりますが、3次曲線を描くことも出来ます。
bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)
コントロールポイントを2箇所指定します。
const canvas9 = document.getElementById('sample9'); const cont9 = canvas9.getContext('2d'); cont9.beginPath(); cont9.moveTo(20, 20); cont9.bezierCurveTo(230, 30, 150, 80, 250, 100); cont9.stroke(); cont9.beginPath(); cont9.arc(230, 30, 5, 0, 2 * Math.PI); //コントロールポイント cont9.arc(150, 80, 5, 0, 2 * Math.PI); //コントロールポイント cont9.fillStyle = 'red'; cont9.fill();
Path2D
const canvas10 = document.getElementById('sample10'); const cont10 = canvas10.getContext('2d'); let path1 = new Path2D(); path1.rect(10, 10, 150, 150); let path2 = new Path2D(); path2.arc(250, 80, 70, 0, 2 * Math.PI); cont10.stroke(path1); cont10.fill(path2);
Path2Dオブジェクトを使用すると、コードをシンプルに記述することが出来ます。
あとがき
図形は慣れるまでに時間を要しますので、焦らず時間をかけて学習していくようにしましょう。
なお、ここでご紹介させて頂いている内容は、MDNのサイトを参考にしています。
詳しい解説はMDNのサイトをご参照ください。
MDN:図形の描画
今回も最後までお読み頂きありがとうございました。