Start · Sprachen · JavaScript · Referenz · Navigator.preferences

Navigator.preferences

Eigenschaft

Schreibgeschützte Eigenschaft, die ein <code>PreferenceManager</code>-Objekt liefert, mit dem sich Nutzereinstellungen wie Farbschema oder reduzierte Bewegung lesen und pro Website überschreiben lassen.

seit JavaScript Experimentell: nur Chromium hinter Flag, keine Bas Kategorie: webapi

Signatur

Navigator.preferences

Beschreibung

navigator.preferences ist der Einstiegspunkt der experimentellen User Preferences API. Die Eigenschaft gibt ein PreferenceManager-Objekt für das aktuelle Dokument zurück. Darüber kommen Sie an die Nutzereinstellungen heran, die Sie sonst nur über CSS-Media-Features wie prefers-color-scheme, prefers-contrast, prefers-reduced-motion, prefers-reduced-transparency oder prefers-reduced-data abfragen könnten.

Jede Einstellung ist ein PreferenceObject (z. B. navigator.preferences.colorScheme). Es bietet:

  • value: den aktuell wirksamen Wert, also die Systemeinstellung oder die Überschreibung,
  • validValues: die zulässigen Werte,
  • override: die aktive Überschreibung oder null,
  • requestOverride(value): setzt eine Überschreibung für diese Website (gibt ein Promise zurück),
  • clearOverride(): entfernt die Überschreibung,
  • das Ereignis change, das bei jeder Änderung des Werts ausgelöst wird.

Der große Vorteil: Überschreibt eine Website eine Einstellung, zum Beispiel über einen eigenen Dunkelmodus-Schalter, wirkt das direkt auf die CSS-Media-Queries. Sie müssen die Stile also nicht doppelt pflegen, etwa über Klassen wie .dark und zusätzlich @media (prefers-color-scheme: dark).

Die Eigenschaft ist schreibgeschützt und hat keine Parameter. Setzen Sie sie nur mit Feature-Erkennung ein und sehen Sie immer einen Rückfall über matchMedia() vor.

Rückgabewert

Typ
PreferenceManager
Beschreibung
Ein PreferenceManager mit den PreferenceObject-Eigenschaften colorScheme, contrast, reducedMotion, reducedTransparency und reducedData. In Browsern ohne Unterstützung ist navigator.preferences undefined.

Beispiele

Unterstützung prüfen und aktuelle Einstellungen lesen

if ('preferences' in navigator) {
  const { colorScheme, reducedMotion } = navigator.preferences;
  console.log('Farbschema:', colorScheme.value);
  console.log('Erlaubte Werte:', colorScheme.validValues);
  console.log('Reduzierte Bewegung:', reducedMotion.value);
} else {
  // Rückfall über matchMedia
  const dark = matchMedia('(prefers-color-scheme: dark)').matches;
  console.log('Farbschema (Rückfall):', dark ? 'dark' : 'light');
}
Farbschema: dark Erlaubte Werte: ['light', 'dark'] Reduzierte Bewegung: no-preference

Dunkelmodus-Schalter, der auf CSS-Media-Queries wirkt

const toggle = document.querySelector('#theme-toggle');

toggle.addEventListener('click', async () => {
  const pref = navigator.preferences?.colorScheme;
  if (!pref) {
    document.documentElement.classList.toggle('dark');
    return;
  }
  const next = pref.value === 'dark' ? 'light' : 'dark';
  try {
    await pref.requestOverride(next);
    console.log('Überschrieben auf:', pref.override);
  } catch (err) {
    console.error('Überschreiben nicht erlaubt:', err);
  }
});
Überschrieben auf: light

Auf Änderungen reagieren und Überschreibung zurücksetzen

const motion = navigator.preferences?.reducedMotion;

if (motion) {
  const apply = () => {
    document.body.dataset.animations =
      motion.value === 'reduce' ? 'off' : 'on';
    console.log('Animationen:', document.body.dataset.animations);
  };
  motion.addEventListener('change', apply);
  apply();

  // Zurück zur Systemeinstellung
  document.querySelector('#reset')
    ?.addEventListener('click', () => motion.clearOverride());
}
Animationen: on

// Wichtig · Fallstricke

  • Experimentell: Die API stammt aus einem WICG-Entwurf und ist bisher nur in Chromium hinter einem Flag verfügbar („Experimental Web Platform features“). Firefox und Safari unterstützen sie nicht. Prüfen Sie deshalb immer mit 'preferences' in navigator oder navigator.preferences?..
  • Überschreibungen gelten nur für den eigenen Origin und ändern nie die Systemeinstellung. requestOverride() kann abgelehnt werden, zum Beispiel ohne Nutzerinteraktion oder mit einem Wert, der nicht in validValues steht. Fangen Sie Fehler des Promise daher ab.
  • Wie lange eine Überschreibung erhalten bleibt, legt der Browser fest. Verlassen Sie sich nicht darauf, dass sie Sitzungen überdauert, und speichern Sie die Wahl bei Bedarf zusätzlich selbst, etwa in localStorage.
  • Die Eigenschaft ist schreibgeschützt. Eine Zuweisung an navigator.preferences hat keine Wirkung.
  • Name und Form der API können sich noch ändern. Verwenden Sie sie in Produktivcode nur als schrittweise Verbesserung.