Signatur
Beschreibung
Touch.pageY liefert die vertikale Position eines Berührungspunkts in CSS-Pixeln. Gemessen wird ab dem oberen Rand des gesamten Dokuments. Hat der Nutzer die Seite gescrollt, ist der Bildlaufversatz also schon eingerechnet. Im Kern gilt: pageY === clientY + window.scrollY.
Die Eigenschaft passt immer dann, wenn eine Position unabhängig vom aktuellen Bildlauf gebraucht wird. Das gilt etwa für absolut positionierte Elemente im Dokument (Tooltips, Markierungen, Ziehgriffe) oder für Wischgesten, bei denen auch gescrollt wird. Brauchst du dagegen Koordinaten relativ zum sichtbaren Fensterausschnitt, z. B. für position: fixed oder document.elementFromPoint(), nimm besser Touch.clientY.
An Touch-Objekte kommst du über die Listen touches, targetTouches und changedTouches eines TouchEvent. Bei touchend ist touches für den abgehobenen Finger schon leer. Die letzte Position steht dann nur noch in changedTouches.
Rückgabewert
double).Beispiele
Position eines Berührungspunkts ausgeben
document.addEventListener('touchstart', (event) => {
const touch = event.touches[0];
console.log(`pageY: ${touch.pageY}, clientY: ${touch.clientY}, scrollY: ${window.scrollY}`);
}, { passive: true });
Marker an der Berührungsstelle im Dokument platzieren
const marker = document.createElement('div');
Object.assign(marker.style, {
position: 'absolute',
width: '20px',
height: '20px',
borderRadius: '50%',
background: 'crimson',
pointerEvents: 'none'
});
document.body.append(marker);
document.addEventListener('touchmove', (event) => {
const { pageX, pageY } = event.touches[0];
// absolute Positionierung bezieht sich auf das Dokument → pageX/pageY passen
marker.style.left = `${pageX - 10}px`;
marker.style.top = `${pageY - 10}px`;
}, { passive: true });
Vertikale Wischgeste erkennen
let startY = 0;
document.addEventListener('touchstart', (event) => {
startY = event.changedTouches[0].pageY;
}, { passive: true });
document.addEventListener('touchend', (event) => {
// bei touchend steht die letzte Position nur in changedTouches
const deltaY = event.changedTouches[0].pageY - startY;
if (Math.abs(deltaY) > 50) {
console.log(deltaY < 0 ? 'Wisch nach oben' : 'Wisch nach unten');
}
});
Position relativ zu einem Element berechnen
const canvas = document.querySelector('#zeichenflaeche');
canvas.addEventListener('touchstart', (event) => {
event.preventDefault(); // Scrollen während des Zeichnens unterbinden
const touch = event.targetTouches[0];
const rect = canvas.getBoundingClientRect();
// rect ist viewport-relativ → Bildlaufversatz addieren
const y = touch.pageY - (rect.top + window.scrollY);
console.log(`Y im Canvas: ${Math.round(y)}px`);
}, { passive: false });
// Wichtig · Fallstricke
- Nicht mit
clientYverwechseln: GegenüberclientYistpageYumwindow.scrollYverschoben.getBoundingClientRect()undelementFromPoint()rechnen viewport-relativ, dafür brauchst duclientY. - Bei
touchend/touchcancelenthältevent.touchesden abgehobenen Finger nicht mehr. Lies die Position daher ausevent.changedTouches, sonst gibt es einenTypeError. - Pinch-Zoom: Die Werte sind CSS-Pixel des Layout-Viewports. Hat der Nutzer hineingezoomt, weichen sie von den physischen Bildschirmpixeln ab (siehe
visualViewport). - Passive Listener: Chrome und Safari behandeln
touchstart/touchmoveaufdocumentstandardmäßig als passiv.preventDefault()funktioniert dort nur mit{ passive: false }. - Kompatibilität: Touch Events werden von allen mobilen Browsern und von Chromium auf Touch-Geräten unterstützt. Desktop-Firefox und Desktop-Safari (macOS) lösen ohne Touchscreen keine Touch Events aus. Für Maus, Stift und Touch gemeinsam sind Pointer Events (
PointerEvent.pageY) die robustere Wahl.