Signatur
Beschreibung
Das Interface ScreenOrientation gehört zur Screen Orientation API und beschreibt die aktuelle Ausrichtung des Bildschirms bzw. Dokuments. Eine eigene Instanz erzeugt man nicht, man greift immer über screen.orientation darauf zu. Da das Interface von EventTarget erbt, kann man auf Änderungen der Ausrichtung mit dem Ereignis change reagieren.
Wichtige Bestandteile:
type(nur lesbar):"portrait-primary","portrait-secondary","landscape-primary"oder"landscape-secondary".angle(nur lesbar): Drehwinkel in Grad (0,90,180,270).lock(orientation): sperrt die Ausrichtung und gibt einPromise<void>zurück.unlock(): hebt eine Sperre wieder auf.onchange/ Ereignischange: wird bei einer Änderung der Ausrichtung ausgelöst.
Gebraucht wird das Interface vor allem für Spiele, Videoplayer, Kamera-Apps und responsive Layouts, die mehr als CSS-Media-Queries (@media (orientation: landscape)) brauchen, also zum Beispiel Logik in JavaScript, die an die Drehung des Geräts gekoppelt ist. Für reine Layout-Anpassungen reichen die Media-Queries meistens aus.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $orientation Pflicht | "any"|"natural"|"landscape"|"portrait"|"portrait-primary"|"portrait-secondary"|"landscape-primary"|"landscape-secondary" | Parameter von lock(): gewünschte Ausrichtung, auf die gesperrt werden soll. |
Beispiele
Aktuelle Ausrichtung auslesen
const { type, angle } = screen.orientation;
console.log(`Ausrichtung: ${type}, Winkel: ${angle}°`);
const istQuerformat = type.startsWith('landscape');
console.log('Querformat?', istQuerformat);
Auf Änderungen reagieren (addEventListener und onchange)
const handleChange = () => {
const { type, angle } = screen.orientation;
document.body.dataset.orientation = type;
console.log(`Neu: ${type} (${angle}°)`);
};
screen.orientation.addEventListener('change', handleChange);
// Später wieder entfernen
// screen.orientation.removeEventListener('change', handleChange);
// Alternativ über die on-Property:
// screen.orientation.onchange = handleChange;
Spiel im Vollbild auf Querformat sperren
const startButton = document.querySelector('#start');
startButton.addEventListener('click', async () => {
try {
// lock() funktioniert meist nur im Vollbildmodus
await document.documentElement.requestFullscreen();
await screen.orientation.lock('landscape');
console.log('Ausrichtung gesperrt:', screen.orientation.type);
} catch (err) {
console.warn('Sperren nicht möglich:', err.name, err.message);
}
});
document.addEventListener('fullscreenchange', () => {
if (!document.fullscreenElement) {
screen.orientation.unlock();
}
});
Feature-Erkennung mit Fallback
const getOrientation = () => {
if (screen.orientation?.type) {
return screen.orientation.type;
}
// Fallback über Media Query
return matchMedia('(orientation: portrait)').matches
? 'portrait-primary'
: 'landscape-primary';
};
console.log(getOrientation());
// Wichtig · Fallstricke
- Kompatibilität:
type,angleund das Ereignischangegibt es in allen modernen Browsern, in Safari erst ab 16.4. Ältere iOS-Versionen kennen nur das veraltetewindow.orientationund das Ereignisorientationchange. lock()ist stark eingeschränkt: Auf Desktop-Browsern und in Safari wird das Promise meist mitNotSupportedErrorabgelehnt. Auf Android klappt das Sperren in der Regel nur im Vollbildmodus oder in installierten PWAs. Deshalblock()immer mittry/catchaufrufen.- Wer
lock()nicht aus einer Nutzeraktion heraus oder außerhalb des Vollbilds aufruft, bekommt oft einenSecurityErroroderNotSupportedError. In sandboxed iframes ist dafürallow-orientation-locknötig. "primary"und"secondary"hängen von der natürlichen Ausrichtung des Geräts ab. Bei Tablets istangle === 0deshalb manchmal Querformat. Verlass dich also nicht darauf, dass ein Winkel immer dieselbe Ausrichtung bedeutet.- Für reine Layout-Anpassungen ist die CSS-Media-Query
orientationsparsamer und robuster.