pointerdown
、pointerup
、pointermove
は、ポインタデバイス(マウス、タッチスクリーン、スタイラスなど)による操作を検知するためのイベントです。これらのイベントを利用することで、ドラッグ操作や描画、ジェスチャーの実装が可能になります。今回は、それぞれのイベントの特徴や使い方をまとめていきたいと思います。
目次 非表示
ポインターイベントは、複数の入力デバイス(マウス、タッチ、ペンなど)を統一的に扱うために導入されました。これにより、従来のmousedown
、touchstart
などのイベントを個別に処理する必要がなくなり、コードがシンプルになります。
pointerdown
: ポインターデバイスがターゲットを押したときに発生します。pointerup
: ポインターデバイスがターゲットから離されたときに発生します。pointermove
: ポインターが動いたときに発生します。
ポインターイベントは、addEventListener
などメソッドを使用します。
const element = document.getElementById('target');
element.addEventListener('pointerdown', (event) => {
console.log('Pointer down detected', event);
});
element.addEventListener('pointerup', (event) => {
console.log('Pointer up detected', event);
});
element.addEventListener('pointermove', (event) => {
console.log('Pointer moved', event);
});
以下の例では、pointerdown
、pointermove
、pointerup
を使用してキャンバス上に線を描画します。
See the Pen pointerdown / pointerup / pointermove by tones (@tonescodedesign) on CodePen.
const canvas = document.getElementById('drawingCanvas');
const ctx = canvas.getContext('2d');
let isDrawing = false;
canvas.addEventListener('pointerdown', (event) => {
isDrawing = true;
ctx.beginPath();
ctx.moveTo(event.offsetX, event.offsetY);
});
canvas.addEventListener('pointermove', (event) => {
if (!isDrawing) return;
ctx.lineTo(event.offsetX, event.offsetY);
ctx.stroke();
});
canvas.addEventListener('pointerup', () => {
isDrawing = false;
});
canvas.addEventListener('pointerleave', () => {
isDrawing = false; // キャンバス外にポインタが移動した場合も描画を停止
});
<canvas id="drawingCanvas" width="500" height="400"></canvas>
canvas {
border: 1px solid #ccc;
cursor: crosshair;
}
このコードを使うと、マウスやタッチ操作でキャンバス上に線を描くことができます。pointerdown
で描画を開始し、pointermove
で線を描き、pointerup
で描画を終了します。
次の例では、ポインターイベントを利用して簡単なドラッグアンドドロップを実装します。
See the Pen pointerdown / pointerup / pointermove by tones (@tonescodedesign) on CodePen.
const box = document.getElementById('draggableBox');
let isDragging = false;
box.addEventListener('pointerdown', (event) => {
isDragging = true;
box.setPointerCapture(event.pointerId);
box.style.cursor = 'grabbing';
});
box.addEventListener('pointermove', (event) => {
if (!isDragging) return;
box.style.left = `${event.clientX - box.offsetWidth / 2}px`;
box.style.top = `${event.clientY - box.offsetHeight / 2}px`;
});
box.addEventListener('pointerup', () => {
isDragging = false;
box.style.cursor = 'grab';
});
<div class="draggable" id="draggableBox"></div>
.draggable {
width: 100px;
height: 100px;
background-color: lightblue;
border: 1px solid #000;
position: absolute;
cursor: grab;
}
このコードでは、pointerdown
でドラッグを開始し、pointermove
で要素を移動し、pointerup
でドラッグを終了します。
setPointerCapture
を使用することで、pointermove
イベントをその要素に限定できます。これにより、ドラッグ操作中にポインタが要素外に移動しても正しく動作します。
ポインターイベントは多くのブラウザでサポートされていますが、古いブラウザや特殊な環境ではサポートされていない場合があります。pointerdown
の代わりにmousedown
やtouchstart
をフォールバックとして実装することを検討してください。
pointermove
イベントは非常に頻繁に発生するため、不要な処理を避けるよう心掛けてください。必要であれば、デバウンスやスロットリングを利用しましょう。