Signatur
Beschreibung
Die schreibgeschützte Eigenschaft pageX gibt an, an welcher horizontalen Position (in CSS-Pixeln) sich der Mauszeiger beim Auslösen des Events befand, und zwar gemessen von der linken Kante des gesamten Dokuments. Anders als bei clientX wird ein horizontaler Scroll-Versatz mitgezählt: pageX entspricht damit clientX + window.scrollX (Stand der Spezifikation: clientX plus Scroll-Offset des Viewports).
Die Eigenschaft eignet sich immer dann, wenn Elemente absolut im Dokument positioniert werden sollen, etwa Tooltips, Kontextmenüs oder Markierungen, die mit der Seite mitscrollen. Möchtest du dagegen etwas mit position: fixed am Viewport ausrichten, nimm clientX. Für Koordinaten innerhalb eines bestimmten Elements eignet sich offsetX oder die Berechnung über getBoundingClientRect().
Seit CSSOM View ist pageX als double definiert. Bei Zoom oder hochauflösenden Bildschirmen können deshalb Nachkommastellen auftauchen. Da PointerEvent und DragEvent von MouseEvent erben, steht pageX auch dort zur Verfügung. Bei TouchEvent findest du den Wert dagegen am einzelnen Touch-Objekt.
Rückgabewert
0.Beispiele
Klickposition im Dokument protokollieren
document.addEventListener('click', (event) => {
console.log(`pageX: ${event.pageX}, clientX: ${event.clientX}, scrollX: ${window.scrollX}`);
});
Tooltip absolut am Mauszeiger positionieren
const tooltip = document.createElement('div');
tooltip.textContent = 'Info';
Object.assign(tooltip.style, { position: 'absolute', pointerEvents: 'none', display: 'none' });
document.body.append(tooltip);
const ziel = document.querySelector('#hilfe');
ziel.addEventListener('mousemove', (event) => {
// position:absolute bezieht sich hier auf das Dokument, daher pageX/pageY
tooltip.style.left = `${event.pageX + 12}px`;
tooltip.style.top = `${event.pageY + 12}px`;
tooltip.style.display = 'block';
});
ziel.addEventListener('mouseleave', () => {
tooltip.style.display = 'none';
});
Position relativ zu einem Element berechnen
const box = document.querySelector('.canvas-wrapper');
box.addEventListener('pointerdown', (event) => {
const rect = box.getBoundingClientRect();
// Linke Kante des Elements in Dokumentkoordinaten
const elementLeft = rect.left + window.scrollX;
const x = event.pageX - elementLeft;
console.log(`Klick bei x = ${Math.round(x)} px innerhalb der Box`);
});
Synthetisches Event mit Koordinaten
const evt = new MouseEvent('click', { clientX: 100, bubbles: true });
document.body.addEventListener('click', (e) => console.log(e.pageX), { once: true });
document.body.dispatchEvent(evt);
// Wichtig · Fallstricke
- Verwechslungsgefahr:
pageXbezieht sich auf das Dokument,clientXauf den Viewport,screenXauf den Bildschirm undoffsetXauf den Padding-Rand des Zielelements. Wenn Werte beim Scrollen „springen“, ist meist die falsche Eigenschaft im Einsatz. - Schreibgeschützt: Eine Zuweisung wie
event.pageX = 10wird stillschweigend ignoriert. Im Strict Mode wird einTypeErrorgeworfen. Bei synthetischen Events legst du die Werte überclientXim Konstruktor fest,pageXwird daraus abgeleitet. - Nachkommastellen: Moderne Browser geben einen
doublezurück. Runde bei Bedarf mitMath.round(), bevor du Werte vergleichst. - CSS-Transformationen und iframes:
pageXberücksichtigt keinetransform-Angaben am Zielelement und bezieht sich immer auf das Dokument, in dem das Event ausgelöst wird, nicht auf das übergeordnete Fenster. - Kompatibilität: Wird von allen aktuellen Browsern unterstützt. Nur sehr alte IE-Versionen (≤ 8) kannten
pageXnicht, dort musste man mitclientX + document.documentElement.scrollLeftrechnen. - Performance:
mousemovefeuert sehr häufig. Bündle DOM-Updates, die aufpageXberuhen, am besten mitrequestAnimationFrame.