Signatur
Beschreibung
Die schreibgeschützte Eigenschaft offsetY eines MouseEvent gibt an, wie weit der Mauszeiger vertikal von der oberen Padding-Kante des Zielknotens (event.target) entfernt ist. Der Wert wird in CSS-Pixeln angegeben und ist ein double, kann also Nachkommastellen haben.
Typische Einsatzgebiete sind Zeichenflächen (<canvas>), eigene Schieberegler, Bildausschnitte, Heatmaps oder Tooltips, die direkt an der Mausposition innerhalb eines Elements erscheinen sollen. Weil sich der Wert auf das Element selbst bezieht, muss man Scroll-Positionen oder die Lage des Elements im Dokument nicht selbst herausrechnen.
Wichtig: Bezugspunkt ist immer event.target – also das innerste Element unter dem Mauszeiger, nicht unbedingt das Element, an dem der Listener hängt (event.currentTarget). Hat ein Container Kindelemente, springt offsetY beim Überfahren eines Kindes auf dessen Koordinatensystem um. Für stabile Werte relativ zum Container berechnet man die Position besser über clientY - currentTarget.getBoundingClientRect().top.
Auch PointerEvent und WheelEvent erben die Eigenschaft, da sie von MouseEvent abgeleitet sind.
Rückgabewert
event.target in CSS-Pixeln (double). Kann negativ sein, wenn der Zeiger über dem Rahmen (Border) liegt.Beispiele
Mausposition in einem Canvas anzeigen
const canvas = document.querySelector('#zeichenflaeche');
const ctx = canvas.getContext('2d');
canvas.addEventListener('click', (event) => {
const x = event.offsetX;
const y = event.offsetY;
console.log(`Klick bei x=${x}, y=${y}`);
// Kleinen Punkt an der Klickposition zeichnen
ctx.beginPath();
ctx.arc(x, y, 4, 0, Math.PI * 2);
ctx.fill();
});
Vertikaler Schieberegler (Lautstärke) per Klick setzen
const regler = document.querySelector('.lautstaerke'); // enthält keine Kindelemente
regler.addEventListener('pointerdown', (event) => {
const hoehe = regler.clientHeight;
// Oben = 100 %, unten = 0 %
const anteil = 1 - event.offsetY / hoehe;
const prozent = Math.round(Math.min(Math.max(anteil, 0), 1) * 100);
console.log(`Lautstärke: ${prozent} %`);
});
Robuste Alternative bei Containern mit Kindelementen
const karte = document.querySelector('.karte');
karte.addEventListener('mousemove', (event) => {
// offsetY bezieht sich auf event.target – evtl. ein Kind-Element!
const rect = event.currentTarget.getBoundingClientRect();
const yRelativ = event.clientY - rect.top - event.currentTarget.clientTop;
console.log('offsetY:', event.offsetY, '| relativ zum Container:', yRelativ);
});
// Wichtig · Fallstricke
- Bezug auf
target: Bei verschachtelten Elementen ändert sich das Koordinatensystem, sobald der Zeiger ein Kindelement überfährt. Abhilfe:pointer-events: nonefür Kinder oder Berechnung übergetBoundingClientRect(). - CSS-Transformationen: Bei
transform(z. B.scale,rotate) liefern BrowseroffsetYim untransformierten lokalen Koordinatensystem – beigetBoundingClientRect()dagegen im transformierten Viewport-Raum. Nicht mischen. - Canvas-Skalierung: Ist die CSS-Größe eines Canvas ungleich seiner Pixelauflösung (
canvas.height), muss man umrechnen:y * canvas.height / canvas.clientHeight. - Nachkommastellen: Laut Spezifikation ein
double; ältere Browser lieferten Ganzzahlen. Bei Bedarf mitMath.round()runden. - Border: Bezugspunkt ist die Padding-Kante, nicht die Border-Kante – über dem oberen Rahmen sind negative Werte möglich.
- Kompatibilität: In allen modernen Browsern verfügbar; Firefox unterstützt die Eigenschaft seit Version 39. Bei synthetisch erzeugten Ereignissen (
new MouseEvent()) wird der Wert ausclientYund dem Ziel berechnet, nicht direkt übergeben.