Start · Sprachen · JavaScript · Referenz · MouseEvent.offsetX

MouseEvent.offsetX

Eigenschaft

Liefert die X-Koordinate des Mauszeigers relativ zur Padding-Kante des Zielelements (<code>event.target</code>) in CSS-Pixeln.

seit JavaScript Baseline: alle Browser (CSSOM View Module) Kategorie: webapi

Signatur

MouseEvent.offsetX

Beschreibung

Die schreibgeschützte Eigenschaft offsetX gibt an, wie weit der Mauszeiger zum Zeitpunkt des Ereignisses horizontal vom linken Rand der Padding-Box des Zielknotens entfernt ist. Der Rahmen (border) wird also nicht mitgezählt: Ein Klick direkt auf den linken Rahmen ergibt einen negativen Wert.

Gebraucht wird offsetX vor allem dann, wenn es um Koordinaten innerhalb eines Elements geht, zum Beispiel zum Zeichnen auf einem <canvas>, für eigene Schieberegler und Fortschrittsbalken, Bildausschnitte oder Heatmaps. Man muss dann nicht selbst clientX minus getBoundingClientRect().left rechnen.

Wichtig: Der Bezug ist immer event.target, also das innerste Element unter dem Zeiger, und nicht event.currentTarget, an dem der Listener hängt. Liegen Kindelemente im Element, beziehen sich die Werte plötzlich auf das Kind. Außerdem berücksichtigen die Browser CSS-Transformationen, sodass das Koordinatensystem bei gedrehten oder skalierten Elementen dem lokalen, nicht transformierten Element entspricht.

Rückgabewert

Typ
number
Beschreibung
Horizontaler Abstand in CSS-Pixeln zum linken Rand der Padding-Box von event.target. Der Wert ist ein double und kann Nachkommastellen haben. Laut Spezifikation ist er negativ, wenn der Zeiger links von der Padding-Kante liegt (z. B. auf dem Rahmen). Bei synthetischen Ereignissen, die mit new MouseEvent() erzeugt und nicht ausgelöst wurden, ist er 0.

Beispiele

Klickposition innerhalb eines Elements anzeigen

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

box.addEventListener('click', (event) => {
  console.log(`x: ${event.offsetX}, y: ${event.offsetY}`);
});
x: 42, y: 17

Freihand-Zeichnen auf einem Canvas

const canvas = document.querySelector('canvas');
const ctx = canvas.getContext('2d');
let drawing = false;

canvas.addEventListener('pointerdown', (e) => {
  drawing = true;
  ctx.beginPath();
  ctx.moveTo(e.offsetX, e.offsetY);
});

canvas.addEventListener('pointermove', (e) => {
  if (!drawing) return;
  ctx.lineTo(e.offsetX, e.offsetY);
  ctx.stroke();
});

canvas.addEventListener('pointerup', () => { drawing = false; });

Fortschrittsbalken zum Spulen im Video

const bar = document.querySelector('.progress');
const video = document.querySelector('video');

bar.addEventListener('click', (e) => {
  // Anteil der Breite berechnen; clientWidth = Breite der Padding-Box
  const ratio = e.offsetX / bar.clientWidth;
  video.currentTime = ratio * video.duration;
  console.log(`Springe zu ${(ratio * 100).toFixed(1)} %`);
});
Springe zu 37.5 %

Robuste Alternative bei Kindelementen

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

slider.addEventListener('click', (e) => {
  // offsetX bezieht sich auf e.target, das auch ein Kindelement sein kann.
  // Deshalb relativ zu currentTarget selbst rechnen:
  const rect = e.currentTarget.getBoundingClientRect();
  const x = e.clientX - rect.left - e.currentTarget.clientLeft;
  console.log('offsetX:', e.offsetX, 'berechnet:', Math.round(x));
});
offsetX: 8 berechnet: 128

// Wichtig · Fallstricke

  • Bezug auf target: Hat das Element mit dem Listener Kindelemente (Icons, <span> o. Ä.), bezieht sich offsetX auf das Kind. Abhilfe: Kindern pointer-events: none geben oder selbst über clientX und getBoundingClientRect() rechnen.
  • Padding-Kante statt Border-Kante: Der Rahmen zählt nicht mit. Auf dem linken Rahmen ist der Wert negativ.
  • Transformationen: offsetX berücksichtigt CSS-transform. Die Werte von getBoundingClientRect() tun das nicht in derselben Weise, deshalb können sich beide Wege bei gedrehten oder skalierten Elementen unterscheiden.
  • Canvas-Skalierung: Die Werte sind CSS-Pixel. Weicht die interne Auflösung des Canvas (canvas.width) von der dargestellten Größe ab, muss man umrechnen: x * canvas.width / canvas.clientWidth.
  • Performance: Beim Lesen von offsetX kann der Browser ein Layout erzwingen. Bei häufigen mousemove-Ereignissen deshalb nicht mit DOM-Schreibzugriffen abwechseln.
  • Kompatibilität: In allen modernen Browsern verfügbar, auch in PointerEvent. Firefox kennt die Eigenschaft erst seit Version 39. Ältere Versionen haben ganze Zahlen statt Nachkommastellen geliefert.