Start · Sprachen · JavaScript · Referenz · MouseEvent.clientY

MouseEvent.clientY

Eigenschaft

Liefert die vertikale Position des Mauszeigers zum Zeitpunkt des Ereignisses in CSS-Pixeln, gemessen von der Oberkante des sichtbaren Viewports.

seit JavaScript Baseline: alle Browser (DOM Level 2 Events, CSSOM Kategorie: webapi

Signatur

MouseEvent.clientY

Beschreibung

Die schreibgeschützte Eigenschaft clientY des MouseEvent-Interfaces gibt die vertikale Koordinate an, an der das Ereignis ausgelöst wurde, und zwar relativ zum Viewport, also zum sichtbaren Bereich des Browserfensters. Der Wert 0 entspricht der Oberkante des Viewports, egal wie weit die Seite gescrollt ist.

Damit unterscheidet sich clientY von pageY (relativ zum gesamten Dokument, also inklusive Scroll-Versatz), von screenY (relativ zum Bildschirm) und von offsetY (relativ zur Padding-Kante des Zielelements). clientY passt immer dann, wenn du mit viewportbezogenen Werten arbeitest, zum Beispiel mit Element.getBoundingClientRect(), position: fixed oder document.elementFromPoint(). Diese APIs nutzen dasselbe Koordinatensystem.

Da PointerEvent und DragEvent von MouseEvent erben, steht clientY auch bei pointermove, pointerdown, dragover usw. zur Verfügung. Touch-Ereignisse (TouchEvent) haben keine eigene clientY-Eigenschaft. Dort liest du den Wert pro Berührungspunkt über event.touches[i].clientY aus.

Rückgabewert

Typ
number
Beschreibung
Vertikale Koordinate in CSS-Pixeln relativ zur Oberkante des Viewports. Der Wert ist ein double und kann in modernen Browsern Nachkommastellen haben. Wurde das Ereignis synthetisch ohne Koordinaten erzeugt, ist er 0.

Beispiele

Mausposition im Viewport anzeigen

const anzeige = document.querySelector('#position');

const beiBewegung = (event) => {
  anzeige.textContent = `X: ${event.clientX}, Y: ${event.clientY}`;
};

document.addEventListener('mousemove', beiBewegung);

// Später wieder abmelden:
// document.removeEventListener('mousemove', beiBewegung);
X: 312, Y: 145

Klickposition relativ zu einem Element berechnen

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

canvas.addEventListener('click', (event) => {
  const rect = canvas.getBoundingClientRect();
  // clientY und rect.top liegen beide im Viewport-Koordinatensystem
  const y = event.clientY - rect.top;
  const x = event.clientX - rect.left;
  console.log(`Klick im Canvas bei ${Math.round(x)} / ${Math.round(y)}`);
});
Klick im Canvas bei 120 / 48

Kontextmenü an der Mausposition öffnen (position: fixed)

const menue = document.querySelector('#kontextmenue');

document.addEventListener('contextmenu', (event) => {
  event.preventDefault();
  const maxY = window.innerHeight - menue.offsetHeight;
  // Nicht über den unteren Viewport-Rand hinausragen lassen
  menue.style.top = `${Math.min(event.clientY, maxY)}px`;
  menue.style.left = `${event.clientX}px`;
  menue.hidden = false;
});

clientY mit pageY vergleichen

document.addEventListener('click', (event) => {
  console.log('clientY:', event.clientY);
  console.log('pageY:  ', event.pageY);
  console.log('Scroll: ', window.scrollY);
  // pageY === clientY + scrollY
});
clientY: 200 pageY: 1400 Scroll: 1200

// Wichtig · Fallstricke

  • Scrollen wird nicht berücksichtigt: Brauchst du dokumentbezogene Koordinaten, zum Beispiel für absolut positionierte Elemente in einer gescrollten Seite, nimm pageY oder rechne clientY + window.scrollY.
  • Schreibgeschützt: Eine Zuweisung wie event.clientY = 10 bleibt wirkungslos. Für synthetische Ereignisse gibst du den Wert im Konstruktor an: new MouseEvent('click', { clientY: 10 }).
  • Nachkommastellen: Laut CSSOM View ist der Typ double. Bei Zoom oder auf hochauflösenden Displays können deshalb Werte wie 145.5 vorkommen. Runde bei Bedarf mit Math.round().
  • Touch: Bei touchstart/touchmove ist event.clientY undefined. Verwende stattdessen event.touches[0].clientY oder gleich Pointer-Events.
  • iframes und CSS-Transformationen: Der Wert bezieht sich auf den Viewport des Dokuments, in dem das Ereignis auftritt. Transformationen (transform: scale()) des Zielelements fließen nicht ein, diese musst du selbst herausrechnen.
  • Performance: mousemove feuert sehr häufig. Aufwendige DOM-Änderungen solltest du per requestAnimationFrame() bündeln.
  • Kompatibilität: Wird von allen Browsern unterstützt, auch von sehr alten.