今回は、図形に色を付けたり、グラデーションにしたり、その他の様々なスタイルの設定方法について見ていきます。
図形に色をつける
すでに前回の例で見ていますが、図形に色を付けるには以下のプロパティを使用します。
fillStyle:図形を塗りつぶします
strokeStyle:輪郭線を塗りつぶします
カラーの指定は、CSSと同じカラー指定が利用出来ます。
fillStyle
<canvas id="sample11" width="400px" height="400px"></canvas>
const canvas11 = document.getElementById('sample11'); const cont11 = canvas11.getContext('2d'); for (let i = 0; i < 10; i++) { for (let r = 0; r < 10; r++) { cont11.fillStyle = 'rgb(' + (255 - 25.5 * i) + ',' + (255 - 25.5 * r) + ',0)'; cont11.fillRect(r * 30, i * 30, 30, 30); } }
strokeStyle
const canvas12 = document.getElementById('sample12'); const cont12 = canvas12.getContext('2d'); for (let i = 0; i < 10; i++) { for (let r = 0; r < 10; r++) { cont12.strokeStyle = 'rgb(' + (255 - 25.5 * i) + ',' + (255 - 25.5 * r) + ',0)'; cont12.beginPath(); cont12.arc(12.5 + r * 25, 12.5 + i * 25, 10, 0, Math.PI * 2, true); cont12.stroke(); } }
透明度
図形に透明度を設定する時は以下のプロパティを使用します。
globalAlpha = 0.0~1.0の間
const canvas13 = document.getElementById('sample13'); const cont13 = canvas13.getContext('2d'); cont13.fillStyle = '#ff0000'; cont13.fillRect(0, 0, 75, 75); cont13.fillStyle = '#ffff00'; cont13.fillRect(75, 0, 75, 75); cont13.fillStyle = '#008000'; cont13.fillRect(0, 75, 75, 75); cont13.fillStyle = '#0000ff'; cont13.fillRect(75, 75, 75, 75); cont13.fillStyle = '#FFF'; cont13.globalAlpha = 0.3; for (let i = 0; i < 7; i++) { cont13.beginPath(); cont13.arc(75, 75, 10 + 10 * i, 0, Math.PI * 2, true); cont13.fill(); }
rgbaを使用して透明度を設定することのほうが多いと思います。
線
線のスタイルを指定するプロパティは以下になります。
プロパティ | 意味 |
---|---|
lineWidth | 線の幅を指定 |
lineCap | 線の端のスタイルを指定します |
lineJoin | 線と線が交わる部分のスタイルを指定 |
miterLimit | 2本の線が鋭角に接合する際の太さを制御します |
getLineDash() | 破線のパターンを返します |
setLineDash() | 破線のパターンを指定します |
lineDashOffset | 破線の最初の位置を指定します |
lineWidth / lineCap
const canvas14 = document.getElementById('sample14'); const cont14 = canvas14.getContext('2d'); cont14.lineWidth = 10; cont14.beginPath(); cont14.moveTo(10, 10); cont14.lineTo(10, 100); cont14.stroke(); let lineCap = ['butt', 'round', 'square']; for (let i = 0; i < lineCap.length; i++) { cont14.lineCap = lineCap[i]; cont14.beginPath(); cont14.moveTo(50 + i * 30, 10); cont14.lineTo(50 + i * 30, 100); cont14.stroke(); }
lineWidth で指定したラインの幅は次の線に引き継がれます。
linCapは以下の3つの値があります。
- butt;両端は四角
- round:両端は丸
- square:両端は線の太さの半分の高さで四角
lineJoin
const canvas15 = document.getElementById('sample15'); const cont15 = canvas15.getContext('2d'); let lineJoin = ['round', 'bevel', 'miter']; cont15.lineWidth = 10; cont15.beginPath(); cont15.moveTo(-5, 5); cont15.lineTo(35, 45); cont15.lineTo(75, 5); cont15.lineTo(115, 45); cont15.lineTo(155, 5); cont15.stroke(); for (let i = 0; i < lineJoin.length; i++) { cont15.lineJoin = lineJoin[i]; cont15.beginPath(); cont15.moveTo(170, 5 + i * 40); cont15.lineTo(205, 45 + i * 40); cont15.lineTo(245, 5 + i * 40); cont15.lineTo(285, 45 + i * 40); cont15.lineTo(325, 5 + i * 40); cont15.stroke(); }
lineJoinには、3つの値があります。
- round:角を丸くします。
- bevel:角を平らにします。
- miter:角を尖らせます。
一番最初のラインはデフォルトの状態です。
setLineDash
const canvas16 = document.getElementById('sample16'); const cont16 = canvas16.getContext('2d'); cont16.lineWidth = 10; cont16.beginPath(); cont16.setLineDash([5, 15]); cont16.moveTo(5, 20); cont16.lineTo(200, 20); cont16.stroke();
「[]」の中の数値を変えると、破線の間隔が変わります。
グラデーション
- createLinearGradient():x1,y1からx2,y2までの位置でグラーデーションを作成します。
- createRadialGradient():x1,y1の半径をr1、x2,y2の半径をr2でグラーデーションを作成します。
- createConicGradient():扇形のグラーデーションを作成します。
これらのメソッドでオブジェクトを作成したら、addColorStop()メソッドで色を割り当てます。
addColorStop(offset, color);
offsetは0から1の間で設定します。
createLinearGradient()
const canvas17 = document.getElementById('sample17'); const cont17 = canvas17.getContext('2d'); let gradient = cont17.createLinearGradient(20, 20, 220, 20); gradient.addColorStop(0, 'red'); gradient.addColorStop(0.5, 'blue'); gradient.addColorStop(1, 'green'); cont17.fillStyle = gradient; cont17.fillRect(20, 20, 220, 150);
createRadialGradient()
const canvas18 = document.getElementById('sample18'); const cont18 = canvas18.getContext('2d'); let gradient1 = cont18.createRadialGradient(110, 110, 30, 100, 100, 70); gradient1.addColorStop(0, 'red'); gradient1.addColorStop(0.5, 'white'); gradient1.addColorStop(1, 'blue'); cont18.fillStyle = gradient1; cont18.fillRect(20, 20, 160, 160);
createConicGradient()
const canvas19 = document.getElementById('sample19'); const cont19 = canvas19.getContext('2d'); let gradient2 = cont19.createConicGradient(0, 100, 100); gradient2.addColorStop(0, 'red'); gradient2.addColorStop(0.25, 'green'); gradient2.addColorStop(0.5, 'white'); gradient2.addColorStop(0.75, 'yellow'); gradient2.addColorStop(1, 'blue'); cont19.fillStyle = gradient2; cont19.fillRect(20, 20, 200, 200);
パターン
createPattern(image, repetition)
createPatternは画像を繰り返します。
repetitionの値は以下になります。
- repeat:両方向
- repeat-x:水平のみ
- repeat-y:垂直のみ
- no-repeat:1度だけ(どちらの方向でもない)
元の画像です。
const canvas20 = document.getElementById('sample20'); const cont20 = canvas20.getContext('2d'); let img = new Image(); img.src = 'https://hitoridemanabou.net/wp-content/uploads/2022/06/clickicon-1.png'; img.onload = function () { const patt = cont20.createPattern(img, 'repeat'); cont20.fillStyle = patt; cont20.fillRect(10, 10, 300, 300); };
「onload」を使って、事前に画像を読み込ませます。
影
影を付けるには4つのプロパティが使用できます。
- shadowOffsetX:水平距離
- shadowOffsetY:垂直距離
- shadowBlur:ぼかし
- shadowColor:カラー
shadowOffsetX
const canvas21 = document.getElementById('sample21'); const cont21 = canvas21.getContext('2d'); cont21.shadowColor = 'red'; cont21.shadowOffsetX = 20; cont21.shadowBlur = 10; cont21.fillStyle = 'green'; cont21.fillRect(10, 10, 200, 150);
shadowOffsetY
const canvas22 = document.getElementById('sample22'); const cont22 = canvas22.getContext('2d'); cont22.shadowColor = 'red'; cont22.shadowOffsetY = 20; cont22.shadowBlur = 10; cont22.fillStyle = 'green'; cont22.fillRect(10, 10, 200, 150);
あとがき
様々なスタイルの基本的な操作について見てきました。
ぜひ値を色々と変更してみて、実際にどのように動くのか確認してみてください。
今回も最後までお読み頂きありがとうございました。