Signatur
Beschreibung
Das change-Ereignis der Schnittstelle ScreenOrientation wird ausgelöst, sobald sich die Ausrichtung des Bildschirms geändert hat. Das passiert zum Beispiel, wenn ein Nutzer sein Mobilgerät vom Hoch- ins Querformat dreht, oder wenn per screen.orientation.lock() eine andere Ausrichtung erzwungen wurde. Der Handler bekommt ein einfaches Event-Objekt ohne zusätzliche Eigenschaften. Die neue Ausrichtung liest man direkt aus screen.orientation.type (z. B. "portrait-primary", "landscape-secondary") und screen.orientation.angle (0, 90, 180 oder 270 Grad).
Registrieren kann man den Handler auf zwei Wegen:
screen.orientation.addEventListener("change", handler): Mehrere Handler sind möglich, und mitremoveEventListenerentfernt man sie wieder.screen.orientation.onchange = handler: Hier gibt es nur einen einzigen Handler. Eine neue Zuweisung überschreibt den alten, undnullentfernt ihn.
Typische Einsatzzwecke sind das Anpassen von Spiel- oder Canvas-Layouts, das Pausieren von Videos im Hochformat, Hinweise wie „Bitte Gerät drehen“ und das Neuberechnen von Maßen, die sich mit reinem CSS nicht ausdrücken lassen. Für reine Layout-Änderungen reicht oft die CSS-Media-Query @media (orientation: landscape) oder matchMedia().
Das Ereignis ersetzt das veraltete window.onorientationchange und die Eigenschaft window.orientation. Neuer Code sollte nur noch die ScreenOrientation-API verwenden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Name des Ereignisses, hier immer "change". |
|
| $handler Pflicht | (event: Event) => void | Callback-Funktion, die bei jeder Änderung der Ausrichtung aufgerufen wird. event.target ist das ScreenOrientation-Objekt. |
|
| $options | boolean | AddEventListenerOptions | false | Optionale Listener-Optionen wie once oder signal (zum Entfernen über einen AbortController). |
Rückgabewert
addEventListener gibt nichts zurück. Der Handler erhält ein generisches Event-Objekt.Beispiele
Ausrichtung mit addEventListener überwachen
const logOrientation = () => {
const { type, angle } = screen.orientation;
console.log(`Ausrichtung: ${type}, Winkel: ${angle}°`);
};
// Beim Start einmal ausgeben, danach bei jeder Änderung
logOrientation();
screen.orientation.addEventListener("change", logOrientation);
Hinweis „Bitte Gerät drehen“ für ein Querformat-Spiel
const hint = document.querySelector("#rotate-hint");
const updateHint = () => {
const isPortrait = screen.orientation.type.startsWith("portrait");
hint.hidden = !isPortrait;
};
updateHint();
screen.orientation.onchange = updateHint;
// Handler später wieder entfernen
// screen.orientation.onchange = null;
Listener mit AbortController aufräumen
const controller = new AbortController();
const canvas = document.querySelector("canvas");
const resizeCanvas = () => {
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
console.log(`Canvas neu: ${canvas.width}×${canvas.height}`);
};
screen.orientation.addEventListener("change", resizeCanvas, {
signal: controller.signal,
});
// z. B. beim Verlassen der Spielansicht:
const stopGame = () => controller.abort(); // entfernt den Listener
removeEventListener mit benannter Funktion
const onChange = (event) => {
console.log("Neue Ausrichtung:", event.target.type);
if (event.target.type.startsWith("landscape")) {
// nur auf die erste Drehung ins Querformat reagieren
screen.orientation.removeEventListener("change", onChange);
}
};
screen.orientation.addEventListener("change", onChange);
// Wichtig · Fallstricke
- Browser-Unterstützung: Chrome, Edge und Firefox unterstützen das Ereignis seit Langem, Safari erst ab Version 16.4 (macOS und iOS). Für ältere iOS-Versionen braucht man als Ersatz
window.addEventListener("orientationchange", …)odermatchMedia("(orientation: portrait)"). Vorher prüfen:if ("orientation" in screen) { … }. - Maße zum Zeitpunkt des Ereignisses: Je nach Browser sind
window.innerWidthundinnerHeightbeim Auslösen noch nicht aktualisiert. Für Layout-Berechnungen ist dasresize-Ereignis aufwindowoder einResizeObserveroft zuverlässiger, alternativ wartet man mitrequestAnimationFrameeinen Frame ab. - Keine Ereignisdaten: Das Event-Objekt enthält keine Ausrichtungsinformationen. Die Werte liest man immer aus
screen.orientation.typeundangle. - Desktop: Auf Desktop-Rechnern wird das Ereignis meist nie ausgelöst. Ausnahmen sind drehbare Monitore und die Geräte-Emulation in den Entwicklerwerkzeugen.
- Veraltete API:
window.orientationund das Ereignisorientationchangeaufwindowsind veraltet und sollten in neuem Code nicht mehr verwendet werden. lock(): Auch eine programmatische Änderung perscreen.orientation.lock()löstchangeaus. Viele Browser erlaubenlock()allerdings nur im Vollbildmodus.