2 min read

Pointer Events

Pointer Events provide a unified interface for handling input from various pointing devices, such as a mouse, a pen/stylus, or a touchscreen.

1. The Problem: Mouse vs. Touch

Historically, web developers had to write separate event listeners for Mouse Events (mousedown, mousemove) and Touch Events (touchstart, touchmove). This led to duplicated code and complexity.

Pointer Events abstract these differences. A "pointer" is any hardware agnostic contact point on the screen.

2. Event Types

Pointer events inherit from Mouse Events, so they share many properties (clientX, clientY, button, etc.).

  • pointerdown: A pointer becomes active (button pressed, screen touched).
  • pointerup: A pointer is no longer active.
  • pointermove: A pointer changes coordinates.
  • pointerover / pointerenter: A pointer enters an element's boundaries.
  • pointerout / pointerleave: A pointer leaves an element's boundaries.
  • pointercancel: The browser cancels the pointer interaction (e.g., palm rejection, or a native gesture like scrolling takes over).

3. Basic Usage

const box = document.querySelector('.box');

box.addEventListener('pointerdown', (e) => {
  console.log('Pointer down!');
  console.log('Pointer ID:', e.pointerId);
  console.log('Pointer Type:', e.pointerType); // 'mouse', 'pen', or 'touch'
});

4. Pointer Capture

Pointer capture allows you to retarget all future pointer events to a specific element, even if the pointer moves outside the boundaries of that element. This is essential for implementing drag-and-drop or sliders.

const slider = document.getElementById('slider');

slider.addEventListener('pointerdown', (e) => {
  // Capture the pointer to the slider element
  slider.setPointerCapture(e.pointerId);
});

slider.addEventListener('pointermove', (e) => {
  if (slider.hasPointerCapture(e.pointerId)) {
    // Handle dragging logic here
    console.log('Dragging...', e.clientX);
  }
});

slider.addEventListener('pointerup', (e) => {
  // Release the capture
  slider.releasePointerCapture(e.pointerId);
});

5. CSS touch-action

To use Pointer Events effectively on touch devices, you often need to disable the browser's default handling of gestures (like scrolling or zooming) on the target element.

.canvas {
  /* Disable browser handling of all gestures */
  touch-action: none; 
}

programming/javascript/vanilla/javascript programming/javascript/vanilla/events programming/javascript/vanilla/drag-and-drop-api