HTML5のCanvas要素にクリックイベントハンドラーを追加する方法を解説
Canvas要素内に描画された図形は、DOM上に個別の要素として存在しません。Canvasに描かれたものは、ピクセルとその色情報だけで構成されており、描画は即時モード(イミディエートモード)でビットマップとして行われます。そのため、Canvas上の特定の図形に対してクリックイベントを取得したい場合は、CanvasというHTML要素自体のクリックイベントを捕捉し、その座標から「どの図形がクリックされたのか」を自分で判定する必要があります。この判定を行うには、各図形の幅(width)と高さ(height)の情報をあらかじめ保持しておくことがポイントです。
Canvasにクリックイベントを追加する基本のコード
Canvas要素にクリックイベントを追加するには、以下のようにaddEventListener()を使用します。
canvas.addEventListener('click', function() { }, false);クリックされた図形を判定する実装例
次のコード例では、クリックされた座標を計算し、保持している図形の情報と照合することで、どの図形がクリックされたかを判定しています。
var e = document.getElementById('myCanvas'),
elemLeft = e.offsetLeft,
elemTop = e.offsetTop,
context = e.getContext('2d'),
elements = [];
// クリックイベントのリスナーを登録
e.addEventListener('click', function(event) {
var xVal = event.pageX - elemLeft,
yVal = event.pageY - elemTop;
console.log(xVal, yVal);
elements.forEach(function(ele) {
if (yVal > ele.top && yVal < ele.top + ele.height && xVal > ele.left && xVal < ele.left + ele.width) {
alert('要素がクリックされました');
}
});
}, false);
elements.push({
colour: '#1C2128',
width: 250,
height: 200,
top: 30,
left: 20
});
elements.forEach(function(ele) {
context.fillStyle = ele.colour;
context.fillRect(ele.left, ele.top, ele.width, ele.height);
});コードの解説
このコードの処理の流れは以下のとおりです。
1. Canvasの位置情報を取得offsetLeftとoffsetTopで、ページ上におけるCanvasの左上の座標を取得します。
2. クリック座標の算出event.pageXとevent.pageYからCanvasの位置を差し引くことで、Canvas内の相対的なクリック座標(xVal、yVal)を求めます。
3. 図形情報との照合elements配列に格納された各図形のtop、left、width、heightと照合し、クリック座標が図形の範囲内に含まれるかどうかを判定します。範囲内であれば、クリックされたと判断してアラートを表示します。
4. 図形の描画fillRect()を使って、登録した図形情報に基づいてCanvas上に矩形を描画します。
このように、Canvas内の図形へのクリック判定は「座標の計算」と「図形情報の保持」を組み合わせることで実現できます。図形の数が多い場合や複雑な形状を扱う場合は、当たり判定用のライブラリを活用するのも有効な手段です。
-
HTML5のCanvasで画像を描画する方法【drawImage()の使い方を解説】
HTML5の<canvas>タグは、JavaScriptなどのスクリプトを使ってグラフィックスやアニメーションを描画するための要素です。HTML5で新たに導入されたタグであり、ブラウザ上で動的なビジュアル表現を実現できます。 HTML5キャンバスで画像を扱うには、drawImage()メソッドを使用します。このメソッドは、指定した画像をキャンバス上にそのまま描画します。 drawImage()メソッドの基本構文と引数 drawImage()メソッドの基本的な呼び出し形式は次の通りです。 ctx.drawImage(img, x, y); 各引数の意味は以下の通りです。 img:
-
HTMLで要素に値を追加するには?value属性の使い方を解説
HTMLで要素に値を設定するには、value属性を使用します。value属性は、フォーム送信時にサーバーへ送られる初期値や、要素が持つ現在の値を指定するために使われます。 value属性が使用できる要素 value属性は、以下のHTML要素で利用できます。 <button> … ボタンのラベルとして送信される値 <input> … 入力フィールドの初期値 <li> … 順序付きリスト(<ol>)内での項目の開始番号 <option> … 選択肢としてサーバーへ送信される値 <meter> … 計測範囲内における現在の値