Signatur
Beschreibung
Die Eigenschaft devicePixelRatio eines ScreenDetailed-Objekts gibt an, wie viele physische Gerätepixel auf ein CSS-Pixel des jeweiligen Bildschirms kommen. Ein Wert von 1 steht für ein klassisches Display, 2 für ein typisches HiDPI- bzw. „Retina“-Display. Auch Zwischenwerte wie 1.25 oder 1.5 kommen oft vor, zum Beispiel bei skalierten Windows-Displays.
Anders als window.devicePixelRatio bezieht sich der Wert nicht auf den Bildschirm, auf dem das aktuelle Fenster gerade liegt. Er gilt für genau den Bildschirm, den das ScreenDetailed-Objekt beschreibt. Das braucht man in Mehrschirm-Umgebungen: Bevor eine Anwendung ein Fenster auf einem zweiten Monitor öffnet, kann sie prüfen, ob dieser Monitor hochauflösende Inhalte braucht. Das ist z. B. wichtig bei Präsentationen, Handelsplattformen oder Bildbearbeitung.
An ein ScreenDetailed-Objekt kommt man über window.getScreenDetails(). Die Methode liefert ein ScreenDetails-Objekt mit der Liste screens und dem aktuellen Bildschirm currentScreen. Dafür braucht es die Berechtigung window-management, früher window-placement genannt.
Der Wert ist nicht in jedem Fall fest. Er ändert sich, wenn Nutzer die Skalierung im Betriebssystem ändern. Auf das Ereignis change des jeweiligen ScreenDetailed-Objekts kann man reagieren und so aktuell bleiben.
Rückgabewert
1, 1.5 oder 2: das Verhältnis von physischen Pixeln zu CSS-Pixeln auf diesem Bildschirm. Die Eigenschaft ist schreibgeschützt.Beispiele
Pixel-Verhältnis aller angeschlossenen Bildschirme auflisten
const listScreens = async () => {
if (!('getScreenDetails' in window)) {
console.log('Window Management API wird nicht unterstützt.');
return;
}
// Fragt beim ersten Aufruf nach der Berechtigung "window-management"
const details = await window.getScreenDetails();
for (const screen of details.screens) {
console.log(`${screen.label || 'Unbenannt'}: ${screen.devicePixelRatio}x`);
}
};
listScreens();
HiDPI-Bildschirm für ein Präsentationsfenster wählen
const openOnSharpestScreen = async (url) => {
const { screens } = await window.getScreenDetails();
// Bildschirm mit dem höchsten Pixel-Verhältnis suchen
const target = screens.reduce((best, s) =>
s.devicePixelRatio > best.devicePixelRatio ? s : best
);
const features = [
`left=${target.availLeft}`,
`top=${target.availTop}`,
`width=${target.availWidth}`,
`height=${target.availHeight}`
].join(',');
window.open(url, '_blank', features);
return target.devicePixelRatio;
};
// Muss durch eine Nutzeraktion ausgelöst werden (Pop-up-Blocker)
document.querySelector('#present').addEventListener('click', async () => {
const dpr = await openOnSharpestScreen('/slides.html');
console.log(`Geöffnet auf Bildschirm mit DPR ${dpr}`);
});
Canvas-Auflösung an den aktuellen Bildschirm anpassen und Änderungen verfolgen
const canvas = document.querySelector('canvas');
const ctx = canvas.getContext('2d');
const resizeCanvas = (dpr) => {
const { width, height } = canvas.getBoundingClientRect();
canvas.width = Math.round(width * dpr);
canvas.height = Math.round(height * dpr);
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
console.log(`Canvas auf DPR ${dpr} skaliert`);
};
const init = async () => {
const details = await window.getScreenDetails();
const apply = () => resizeCanvas(details.currentScreen.devicePixelRatio);
apply();
// Fenster wurde auf einen anderen Bildschirm verschoben
details.addEventListener('currentscreenchange', () => {
apply();
// Skalierung des neuen Bildschirms wurde geändert
details.currentScreen.onchange = apply;
});
details.currentScreen.onchange = apply;
};
init();
// Wichtig · Fallstricke
- Browser-Unterstützung: Die Eigenschaft gehört zur Window Management API. Sie ist nur in Chromium-Browsern verfügbar (Chrome/Edge ab Version 100), nicht in Firefox und Safari. Prüfe vor der Nutzung mit
'getScreenDetails' in window, ob die API vorhanden ist. - Berechtigung und sicherer Kontext:
getScreenDetails()läuft nur über HTTPS und verlangt die Berechtigungwindow-management. Lehnt der Nutzer ab, wird das Promise mit einemNotAllowedErrorabgelehnt. In iframes muss die Permissions Policywindow-managementerlaubt sein. - Nicht mit
window.devicePixelRatioverwechseln:window.devicePixelRatioberücksichtigt auch den Browser-Zoom. Der Wert vonScreenDetailed.devicePixelRatiobeschreibt dagegen die Skalierung des Bildschirms selbst. Für das Rendern im aktuellen Fenster ist deshalb oftwindow.devicePixelRatiodie passendere Größe. - Kein fester Wert: Der Wert kann gebrochen sein, z. B.
1.25, und sich zur Laufzeit ändern. Bei Canvas-Größen daher runden und auf das Ereignischangehören. - Datenschutz: Bildschirm-Details eignen sich zum Fingerprinting. Frage die Berechtigung deshalb erst an, wenn sie wirklich gebraucht wird, und idealerweise nach einer Nutzeraktion.