Canvasの紹介と基本的な使い方
1. キャンバスの概要
Canvas は HTML5 の新しいタグで、JavaScript を使用してさまざまなパターンを描画できます。
2. CanvasとSVGの違い
- svg は本質的に、XML を使用して 2D グラフィックスを記述するための言語です。
1. svg で作成された各要素は独立した DOM 要素であり、css および JS で操作できます。
2. svg 内の DOM 要素を変更すると、システムが自動的に DOM を再描画します。
- Canvas は JavaScript を通じて 2D グラフィックを描画します
1. Canvas は単なる HTML 要素であり、その中のグラフィックスは個別に DOM 要素を作成しないため、Canvas 内の個々のグラフィックスを JS を通じて操作することはできません。
2. グラフを一度描画すると、データが変更された場合は再描画する必要があります。
- 使用するシーン
表示するデータの量が比較的多い場合 (データの一部が要素ノードである場合など)、ユーザーの操作が多く、明瞭さが要求される場合 (ベクトル図)、キャンバスの使用がより適切です。の場合は、svg を使用する方が適切です。
3. Canvasの基本的な使い方
3.1 キャンバスの作成
<!DOCTYPE html>
<html lang="en">
<head>
<title>canvas 基本使用</title>
</head>
<body>
<canvas width="200" height="200">
当前浏览器不支持canvas元素,请升级或更换浏览器!
</canvas>
</body>
</html>
- 効果
- キャンバスサイズ
キャンバス デフォルトのキャンバス サイズは 300 * 150 です。
キャンバスのサイズを変更するには 2 つのオプションがあります。
最初の方法: CSS によるスタイル設定 (推奨されません)
<html>
<head>
<style>
canvas {
width: 400px;
height: 400px;
}
</style>
</head>
<body>
<canvas></canvas>
</body>
</html>
CSS を使用してサイズを定義すると、描画時に画像が引き伸ばされます。CSS サイズが初期キャンバスの比率と一致しない場合、画像は歪んで表示されます。
たとえば、この例が 400px * 400px になると、幅は 300px から 400px に拡張され、高さは 150px から 400px に拡張されます。
2 番目の方法: タグ属性経由 (推奨)
<html>
<head>
...
</head>
<body>
<canvas width="400" height="400"></canvas>
</body>
</html>
したがって、canvas 要素によって提供される width 属性と height 属性を使用して、キャンバスの幅と高さを設定します。
3.2 レンダリングコンテキスト
Canvas キャンバスを作成した後の次のステップは、Canvas のコンテキスト環境を取得し、getContext() を通じてレンダリング コンテキストとペイント関数を取得することです。
<body>
<canvas id="canvas"></canvas>
<script>
// 获取canvas元素
var canvas = document.getElementById('canvas');
// 获取二维渲染上下文
var ctx = canvas.getContext('2d');
</script>
</body>
コンテキストタイプ:
- 2d: 2 次元のレンダリング コンテキストを作成します。
- webgl: WebGLRenderingContext 3D レンダリング コンテキスト オブジェクトを作成します。
- webgl2: WebGL2RenderingContext 3D レンダリング コンテキスト オブジェクトを作成します。WebGL バージョン 2 (OpenGL ES 3.0) を実装するブラウザでのみ使用できます。
3.3 キャンバス座標
Canvas は W3C 座標系を使用します。つまり、画面や新聞を上から下、左から右に読む習慣に従い、左上隅が原点となります。
3.4 直線を引く
一番簡単なのは直線を引くことです。
次の 3 つの方法を使用する必要があります。
- moveTo(x, y): 初期位置を設定します。
- lineTo(x, y): 次の点の座標 (x, y)。
- ストローク(): グラフィックの輪郭を線で描きます。
<canvas id="canvas" width="400" height="400"></canvas>
<script>
// 获取 canvas 元素
var canvas = document.getElementById('canvas');
// 获取绘图上下文
var ctx = canvas.getContext('2d');
// 绘制直线
ctx.moveTo(50, 50);
ctx.lineTo(200, 200);
ctx.stroke();
</script>
3.5 三角形の描画
2 つの三角形を描き、1 つは塗りつぶし、もう 1 つはストロークで描きます。
使用する必要がある方法:
- beginPath(): 新しいパスを作成します。
- closePath(): パスを閉じます。
- ストローク(): グラフィックの輪郭を線で描きます。
- fill(): パスのコンテンツ領域を塗りつぶして立体形状を生成します。
<canvas id="canvas" width="400" height="400"></canvas>
<script>
// 获取 canvas 元素
var canvas = document.getElementById('canvas');
// 获取绘图上下文
var ctx = canvas.getContext('2d');
// 填充三角形
ctx.beginPath();
ctx.moveTo(25, 25);
ctx.lineTo(105, 25);
ctx.lineTo(25, 105);
ctx.fill();
// 描边三角形
ctx.beginPath();// 重新开启一个路径
ctx.moveTo(125, 125);
ctx.lineTo(125, 45);
ctx.lineTo(45, 125);
ctx.closePath();
ctx.stroke();
</script>
beginPath() はパスを再度開きます。後続の線分は前の線分に影響を与えません。
フィル(fill)を使用するとパスは自動的に閉じられますが、ストローク(ストローク)を使用してもパスは閉じられません。閉じたパス closePath() がストローク三角形関数に追加されていない場合、完全な三角形ではなく 2 つの線分のみが描画されます。
3.6 長方形を描く
線分を使用して四角形を描画できますが、canvas には四角形を直接生成するrect()などのメソッドも用意されています。
- 長方形をストロークするにはストロークRect()を使用します
<canvas id="canvas" width="300" height="300" style="border: 1px solid #ccc;"></canvas>
<script>
const canvas = document.getElementById('canvas')
const ctx = canvas.getContext('2d')
ctx.strokeStyle = 'pink'
ctx.strokeRect(50, 50, 200, 100) // strokeRect(x, y, width, height)
</script>
- fillRect() を使用して四角形を塗りつぶします
<canvas id="canvas" width="300" height="300" style="border: 1px solid #ccc;"></canvas>
<script>
const canvas = document.getElementById('canvas')
const ctx = canvas.getContext('2d')
ctx.fillStyle = 'pink'
ctx.fillRect(50, 50, 200, 100) // fillRect(x, y, width, height)
</script>
- 長方形を生成するには、rect() を使用します。
注:rect() メソッドが呼び出された後、レンダリングを支援するために stroke() または fill() を呼び出す必要があります。
<canvas id="canvas" width="300" height="300" style="border: 1px solid #ccc;"></canvas>
<script>
const canvas = document.getElementById('canvas')
const ctx = canvas.getContext('2d')
ctx.strokeStyle = 'red'
ctx.fillStyle = 'pink'
ctx.rect(50, 50, 200, 100) // rect(x, y, width, height)
ctx.stroke()
ctx.fill()
</script>
- 四角形をクリアするには、clearRect() を使用します。
<canvas id="canvas" width="300" height="300" style="border: 1px solid #ccc;"></canvas>
<script>
const canvas = document.getElementById('canvas')
const ctx = canvas.getContext('2d')
ctx.fillStyle = 'pink' // 设置填充颜色
ctx.fillRect(50, 50, 200, 200) // 填充矩形
ctx.clearRect(60, 60, 180, 90) // 清空矩形
</script>
3.7 テキストの描画
文法:
ctx.font = 'font-style font-variant font-weight font-size/line-height font-family'
- ストロークテキスト()メソッドはストロークされたテキストを描画します
<canvas id="canvas" width="300" height="300" style="border: 1px solid #ccc;"></canvas>
<script>
const canvas = document.getElementById('canvas')
const ctx = canvas.getContext('2d')
ctx.font = '60px Arial'
cxt.strokeStyle = 'pink' // 设置文本描边颜色
ctx.strokeText('好运', 30, 90) //strokeText(text, x, y, maxWidth)
</script>
- fillText() は塗りつぶされたテキストを描画します
<canvas id="canvas" width="300" height="300" style="border: 1px solid #ccc;"></canvas>
<script>
const canvas = document.getElementById('canvas')
const ctx = canvas.getContext('2d')
ctx.font = '60px Arial'
ctx.font = '60px Arial'
ctx.fillStyle = 'pink'
ctx.fillText('好运', 30, 90)
</script>
- textAlign はテキストの水平方向の配置を設定します。
1. 開始: デフォルト。指定された位置の横座標から開始します。
2.end: 指定された座標の横軸で終了します。
3.left: 左揃え。
4.right: 右揃え。
5.center: 中央揃え。
<canvas id="canvas" width="300" height="300" style="border: 1px solid #ccc;"></canvas>
<script>
const canvas = document.getElementById('canvas')
const ctx = canvas.getContext('2d')
// 参考线
ctx.moveTo(200, 0)
ctx.lineTo(200, 400)
ctx.strokeStyle = 'red'
ctx.stroke()
ctx.font = '30px Arial'
// 横坐标开始位对齐
ctx.textAlign = 'start' // 默认值,
ctx.fillText('好运start', 200, 40)
// 横坐标结束位对齐
ctx.textAlign = 'end' // 结束对齐
ctx.fillText('好运end', 200, 100)
// 横坐标开始位对齐
ctx.textAlign = 'left' // 默认值,
ctx.fillText('好运start', 200, 160)
// 横坐标结束位对齐
ctx.textAlign = 'right' // 结束对齐
ctx.fillText('好运end', 200, 220)
// 居中对齐
ctx.textAlign = 'center' // 右对齐
ctx.fillText('好运center', 200, 280)
</script>
- textBaseline はテキストの垂直方向の配置を設定します
1. アルファベット: デフォルト。テキスト ベースラインは通常の文字ベースラインです。
2.top: テキストのベースラインは em ボックスの上部です。
3.bottom: テキストのベースラインは、em ボックスの下部です。
4.middle: テキストのベースラインは em ボックスの中央です。
5.hanging: テキスト ベースラインはぶら下がりベースラインです。
<canvas id="canvas" width="800" height="300" style="border: 1px solid #ccc;"></canvas>
<script>
const canvas = document.getElementById('canvas')
const ctx = canvas.getContext('2d')
// 参考线
ctx.moveTo(0, 150)
ctx.lineTo(800, 150)
ctx.strokeStyle = 'red'
ctx.stroke()
ctx.font = '20px Arial'
// 默认 alphabetic
ctx.textBaseline = 'alphabetic'
ctx.fillText('好运alphabetic', 10, 150)
// 默认 top
ctx.textBaseline = 'top'
ctx.fillText('好运top', 200, 150)
// 默认 bottom
ctx.textBaseline = 'bottom'
ctx.fillText('好运bottom', 320, 150)
// 默认 middle
ctx.textBaseline = 'middle'
ctx.fillText('好运middle', 480, 150)
// 默认 hanging
ctx.textBaseline = 'hanging'
ctx.fillText('好运hanging', 640, 150)
</script>
3.8 絵を描く
画像を描画するには、drawImage() メソッドを使用します。構文は次のとおりです。
drawImage(image, dx, dy)
- image: レンダリングする画像オブジェクト。
- dx: 画像の左上隅の横座標位置。
- dy: 画像の左上隅の座標位置。
<canvas id="canvas" width="300" height="300" style="border: 1px solid #ccc;"></canvas>
<script>
const canvas = document.getElementById('canvas')
const ctx = canvas.getContext('2d')
// 1 创建 Image 对象
const image = new Image()
// 2 引入图片
image.src = './images/hz.png'
// 3 等待图片加载完成
image.onload = () => {
// 4 使用 drawImage() 方法渲染图片
ctx.drawImage(image, 30, 30)
}
</script>