How to detect prefers-color-scheme change in javascript?

You can add an event-listener with callback on the MediaQueryList returned by Window.matchMedia():

function activateDarkMode() {
  // set style to dark
}

// MediaQueryList
const darkModePreference = window.matchMedia("(prefers-color-scheme: dark)");

// recommended method for newer browsers: specify event-type as first argument
darkModePreference.addEventListener("change", e => e.matches && activateDarkMode());

// deprecated method for backward compatibility
darkModePreference.addListener(e => e.matches && activateDarkMode());

Note:
There are two method versions to register an event-listener:

  1. the recommended addEventListener("change", listener)) which allows more fine-grained assignment to event-types
  2. the deprecated addListener(listener)

See also


Thanks to lukaszpolowczyk for pointing out that method addListener(listener) has become deprecated and to AsukaSong for initiating a complete rewrite of this answer.

Leave a Comment