Signatur
Beschreibung
Die Eigenschaft z eines DeviceMotionEventAcceleration-Objekts gibt an, wie stark das Gerät entlang der Z-Achse beschleunigt wird. Die Einheit ist Meter pro Sekunde zum Quadrat (m/s²). Die Z-Achse steht senkrecht auf dem Bildschirm und zeigt vom Display weg zum Betrachter: Positive Werte bedeuten eine Beschleunigung nach „oben“ aus dem Bildschirm heraus.
Du bekommst das Objekt über das Event devicemotion, und zwar in zwei Varianten:
event.acceleration: Beschleunigung ohne Erdanziehung. Liegt ein Gerät ruhig auf dem Tisch, istzhier ungefähr0.event.accelerationIncludingGravity: Beschleunigung mit Erdanziehung. Liegt das Gerät mit dem Display nach oben flach auf dem Tisch, istzhier ungefähr9.81.
Typische Einsatzzwecke sind: erkennen, ob das Gerät mit dem Display nach oben oder nach unten liegt, Schüttel- und Stoßgesten, Schrittzähler sowie Steuerungen für Spiele oder AR. Weil Sensordaten verrauscht sind, solltest du die Werte in der Praxis glätten (z. B. mit einem Tiefpassfilter) oder mit Schwellenwerten arbeiten.
Rückgabewert
null, wenn die Hardware bzw. der Browser keinen Wert liefern kann.Beispiele
Z-Beschleunigung mit addEventListener auslesen
const handleMotion = (event) => {
const z = event.accelerationIncludingGravity?.z;
if (z == null) {
console.log('Kein Z-Wert verfügbar');
return;
}
console.log(`Z (inkl. Schwerkraft): ${z.toFixed(2)} m/s²`);
};
window.addEventListener('devicemotion', handleMotion);
// Später wieder abmelden, z. B. beim Verlassen der Ansicht:
// window.removeEventListener('devicemotion', handleMotion);
Erkennen, ob das Display nach oben oder unten zeigt
const statusEl = document.querySelector('#status');
window.ondevicemotion = ({ accelerationIncludingGravity: g }) => {
if (!g || g.z === null) return;
if (g.z > 8) {
statusEl.textContent = 'Display zeigt nach oben';
} else if (g.z < -8) {
statusEl.textContent = 'Display zeigt nach unten';
} else {
statusEl.textContent = 'Gerät ist geneigt oder steht aufrecht';
}
};
Berechtigung unter iOS anfordern und Stöße entlang Z erkennen
const THRESHOLD = 12; // m/s², ohne Schwerkraft
const onMotion = (event) => {
const z = event.acceleration?.z ?? 0;
if (Math.abs(z) > THRESHOLD) {
console.log(`Stoß erkannt: ${z.toFixed(1)} m/s²`);
}
};
document.querySelector('#start').addEventListener('click', async () => {
// iOS 13+ verlangt eine ausdrückliche Zustimmung nach einer Nutzeraktion
if (typeof DeviceMotionEvent?.requestPermission === 'function') {
const state = await DeviceMotionEvent.requestPermission();
if (state !== 'granted') {
console.log('Zugriff auf Bewegungssensoren verweigert');
return;
}
}
window.addEventListener('devicemotion', onMotion);
});
Werte mit einem Tiefpassfilter glätten
let smoothedZ = 0;
const ALPHA = 0.1; // kleiner = glatter, aber träger
window.addEventListener('devicemotion', (event) => {
const z = event.accelerationIncludingGravity?.z;
if (z == null) return;
smoothedZ = ALPHA * z + (1 - ALPHA) * smoothedZ;
console.log(`Geglättet: ${smoothedZ.toFixed(2)}`);
});
// Wichtig · Fallstricke
- Kann
nullsein: Auf Desktop-Rechnern ohne Beschleunigungssensor oder wenn der Browser keine schwerkraftbereinigten Werte berechnen kann, istevent.acceleration.z(oder das ganze Objekt)null. Prüfe das immer, bevor du rechnest. - Mit oder ohne Schwerkraft: Verwechsle
accelerationundaccelerationIncludingGravitynicht. Ruhig liegend ergibt das eine ≈ 0, das andere ≈ 9,81 m/s². - Vorzeichen unterscheiden sich: Ältere Android-Browser und alte iOS-Versionen haben bei
accelerationIncludingGravityteilweise umgekehrte Vorzeichen geliefert. Teste deshalb auf echten Zielgeräten. - Berechtigungen: Die API funktioniert nur in sicheren Kontexten (HTTPS). Safari ab iOS 13 verlangt
DeviceMotionEvent.requestPermission(), und dieser Aufruf muss durch eine Nutzeraktion ausgelöst werden. Mit einer Permissions Policy (accelerometer) lässt sich der Zugriff in iframes sperren. - Datenschutz: Bewegungsdaten eignen sich für Fingerprinting. Manche Browser verringern deshalb die Genauigkeit oder die Abtastrate.
- Leistung: Das Event wird sehr oft ausgelöst (typisch alle 16–60 ms, siehe
event.interval). Halte den Handler schlank, führe DOM-Aktualisierungen gebündelt überrequestAnimationFrameaus und melde den Listener ab, wenn du ihn nicht mehr brauchst. Das spart Akku. - Für neue Projekte ist die moderne Generic Sensor API (
Accelerometer,LinearAccelerationSensor) eine Alternative. Sie wird aber bisher nur von Chromium-Browsern unterstützt.