SVGとCanvas
SVGとCanvasとは
ブラウザで図形やグラフを描く方法には、大きく SVG と Canvas の2つがあります。
- SVG(Scalable Vector Graphics)— 図形をタグで記述するベクター画像。拡大しても劣化しない
- Canvas —
<canvas>タグの領域に [[JavaScript]] でピクセルを直接描画する仕組み
<!-- SVG: 図形が要素として存在する -->
<svg width="100" height="100">
<circle cx="50" cy="50" r="40" fill="tomato" />
</svg>
// Canvas: JSで描画命令を実行する
const ctx = document.querySelector('canvas').getContext('2d');
ctx.fillStyle = 'tomato';
ctx.beginPath();
ctx.arc(50, 50, 40, 0, Math.PI * 2);
ctx.fill();
比較と使い分け
| SVG | Canvas | |
|---|---|---|
| 実体 | [[DOM]] 要素(タグ) | ただの描画領域(ピクセルの塊) |
| 拡大縮小 | 劣化しない(ベクター) | 拡大するとぼやける(ラスター) |
| 個別操作 | 図形ごとにクリックイベントやCSSを適用できる | 領域全体で1要素。個別操作は自前で計算 |
| 得意な規模 | 要素数が少〜中程度 | 大量の描画・毎フレーム更新 |
| 向いている用途 | アイコン、ロゴ、グラフ、地図 | ゲーム、パーティクル、画像加工 |
判断の軸は「図形を個別に操作したいか、大量に高速描画したいか」です。SVG は図形が DOM 要素なので扱いやすい反面、数千個を超えると [[ブラウザレンダリングの仕組み]] 上の負荷が重くなります。Canvas は描いた後はただのピクセルなので軽い代わりに、当たり判定などをすべて自前で計算します。
初学者向けポイント
- アイコンは SVG が定番です。CSS の
fill: currentColorで色をテキストに合わせるテクニックがよく使われます - SVG はテキストファイルなので、[[HTML]] に直接インラインで埋め込むことも、img タグで読み込むこともできます
- Canvas でのアニメーションは
requestAnimationFrameで毎フレーム描き直すのが基本形です - 3D描画には Canvas 上で動く WebGL / WebGPU という仕組みがあります
関連技術とのつながり
- [[DOM]] — SVG の図形は DOM の一部として操作できる
- [[HTML]] — どちらもHTMLに埋め込んで使う
- [[JavaScript]] — Canvas 描画と SVG の動的操作の両方を担う
- [[ブラウザレンダリングの仕組み]] — SVG要素数と描画負荷の関係を理解する鍵
Q: SVGの特徴として正しいのはどれ?
- [x] タグで記述するベクター画像で、拡大しても劣化しない
- [ ] ピクセルを直接描画するため拡大するとぼやける
- [ ] JavaScriptからは一切操作できない
解説: SVGは図形をタグで記述するベクター形式で、拡大縮小しても劣化しません。
Q: 大量の図形を毎フレーム高速に描画する用途に向いているのはどれ?
- [ ] SVG
- [x] Canvas
- [ ] HTMLのtableタグ
解説: Canvasは描いた後はただのピクセルで軽いため、ゲームやパーティクルなど大量・高頻度の描画に向きます。
Q: SVGの図形を個別にクリックイベントで扱えるのはなぜ?
- [ ] ブラウザが自動で座標計算APIを提供するから
- [ ] 画像ファイルにイベント情報が埋め込まれているから
- [x] 図形が1つ1つDOM要素として存在するから
解説: SVGの図形はDOM要素なので、通常のHTML要素と同じようにイベントやCSSを適用できます。