Signatur
Beschreibung
Ein MediaQueryList-Objekt enthält Informationen über eine CSS-Media-Query, die auf das aktuelle Dokument angewendet wird. Man erzeugt es nie direkt, sondern immer über window.matchMedia(query). Das Objekt erlaubt zwei Arten der Auswertung: sofort über die Eigenschaft matches und ereignisgesteuert über das change-Event, das ausgelöst wird, sobald sich das Ergebnis der Query ändert.
Typische Einsatzfälle sind responsive Logik in JavaScript (z. B. anderes Menüverhalten auf Mobilgeräten), das Erkennen von Nutzerpräferenzen wie prefers-color-scheme (Dark Mode) oder prefers-reduced-motion sowie das Reagieren auf Druckansicht, Ausrichtung oder Pixeldichte. Im Gegensatz zu einem resize-Listener feuert change nur beim tatsächlichen Umschalten der Bedingung – das ist deutlich effizienter.
Wichtige Mitglieder:
matches(nur lesbar,boolean) –true, wenn das Dokument der Query aktuell entspricht.media(nur lesbar,string) – die serialisierte Media Query.onchange– Handler-Eigenschaft für daschange-Event (Ereignisobjekt:MediaQueryListEventmitmatchesundmedia).addListener()/removeListener()– veraltete Aliase; stattdessenaddEventListener("change", …)verwenden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $query Pflicht | string | Media-Query-String, der an window.matchMedia() übergeben wird, z. B. "(max-width: 600px)" oder "(prefers-color-scheme: dark)". Das Interface selbst hat keinen öffentlichen Konstruktor. |
Rückgabewert
window.matchMedia() zurückgegebenes Objekt mit den Eigenschaften matches, media und dem change-Event.Beispiele
Instanz erzeugen und sofort auswerten
const mql = window.matchMedia('(max-width: 600px)');
console.log(mql.media); // serialisierte Query
console.log(mql.matches); // aktueller Zustand
if (mql.matches) {
document.body.classList.add('mobile');
}
Dark Mode per change-Event verfolgen
const darkQuery = window.matchMedia('(prefers-color-scheme: dark)');
const applyTheme = (isDark) => {
document.documentElement.dataset.theme = isDark ? 'dark' : 'light';
console.log(`Theme: ${isDark ? 'dunkel' : 'hell'}`);
};
// Initialzustand setzen – change feuert NICHT beim Registrieren
applyTheme(darkQuery.matches);
darkQuery.addEventListener('change', (event) => {
applyTheme(event.matches);
});
Listener sauber wieder entfernen (on-Property und removeEventListener)
const mql = window.matchMedia('(orientation: landscape)');
const onOrientation = (e) => {
console.log(e.matches ? 'Querformat' : 'Hochformat');
};
mql.addEventListener('change', onOrientation);
// Später, z. B. beim Unmount einer Komponente:
mql.removeEventListener('change', onOrientation);
// Alternative über die Handler-Eigenschaft:
mql.onchange = onOrientation;
mql.onchange = null; // entfernt den Handler wieder
Animationen bei reduzierter Bewegung abschalten
const reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)');
const scrollToTop = () => {
window.scrollTo({
top: 0,
behavior: reduceMotion.matches ? 'auto' : 'smooth'
});
};
document.querySelector('#nach-oben')?.addEventListener('click', scrollToTop);
// Wichtig · Fallstricke
- Kein Initial-Event:
changewird nur bei einer Änderung ausgelöst. Den Startzustand immer separat übermatchesauswerten. - Veraltete API:
addListener()/removeListener()sind deprecated. Safari vor Version 14 unterstützt allerdings nur diese; für sehr alte Browser ggf. Fallback:mql.addEventListener ? mql.addEventListener('change', fn) : mql.addListener(fn). - Referenz behalten: Zum Entfernen des Listeners muss dieselbe Funktionsreferenz übergeben werden – anonyme Pfeilfunktionen lassen sich nicht wieder abmelden. Alternativ ein
AbortSignalüber diesignal-Option nutzen. - Ungültige Queries werfen keinen Fehler;
medialiefert dann"not all"undmatchesistfalse. - Performance:
matchMediamitchangeist einemresize-Listener mit manueller Breitenprüfung fast immer vorzuziehen. - In Node.js oder beim Server-Side-Rendering existiert
window.matchMedianicht – vorher auftypeof window !== 'undefined'prüfen. In Test-Umgebungen wie jsdom muss es gemockt werden.