Signatur
Beschreibung
Die Eigenschaft media eines MediaQueryListEvent enthält die Media-Query als serialisierten String, z. B. "(max-width: 600px)". Das Event wird am MediaQueryList-Objekt ausgelöst, das von window.matchMedia() zurückgegeben wird, sobald sich der Wert von matches ändert, also wenn die Abfrage neu zutrifft oder nicht mehr zutrifft.
Nützlich ist media vor allem dann, wenn ein einziger Handler für mehrere Media-Queries zuständig ist. Anhand von event.media lässt sich feststellen, welche Abfrage das Event ausgelöst hat, zum Beispiel ein Breakpoint, prefers-color-scheme oder prefers-reduced-motion. Zusammen mit event.matches weiß man dann, welche Abfrage betroffen ist und ob sie jetzt zutrifft.
Der Wert ist die normalisierte Form der Abfrage, die der Browser erzeugt. Er kann sich deshalb in Leerzeichen, Groß-/Kleinschreibung oder Klammern von dem String unterscheiden, den man an matchMedia() übergeben hat. Für Vergleiche sollte man darum mql.media verwenden und nicht den ursprünglichen Literal-String.
Rückgabewert
"(prefers-color-scheme: dark)". Der Wert ist schreibgeschützt.Beispiele
Einfacher Breakpoint-Listener
const mql = window.matchMedia('(max-width: 600px)');
mql.addEventListener('change', (event) => {
console.log(`Query: ${event.media}, trifft zu: ${event.matches}`);
});
// Fenster auf unter 600px verkleinern ...
Ein Handler für mehrere Media-Queries
const queries = {
dark: window.matchMedia('(prefers-color-scheme: dark)'),
reducedMotion: window.matchMedia('(prefers-reduced-motion: reduce)'),
mobile: window.matchMedia('(max-width: 768px)')
};
const handleChange = (event) => {
// Normalisierten String über mql.media vergleichen, nicht über das Literal
const [name] = Object.entries(queries)
.find(([, mql]) => mql.media === event.media) ?? ['unbekannt'];
document.documentElement.classList.toggle(`is-${name}`, event.matches);
console.log(`${name} (${event.media}) -> ${event.matches}`);
};
for (const mql of Object.values(queries)) {
mql.addEventListener('change', handleChange);
}
Event manuell erzeugen (z. B. für Tests)
const event = new MediaQueryListEvent('change', {
media: '(orientation: landscape)',
matches: true
});
console.log(event.media);
console.log(event.matches);
// Wichtig · Fallstricke
- Normalisierung:
event.mediaenthält die serialisierte Form. AusmatchMedia('(MAX-WIDTH:600px)')kann zum Beispiel"(max-width: 600px)"werden. Vergleiche mitmql.mediasind deshalb robuster als Vergleiche mit eigenen Literal-Strings. - Ungültige Abfragen werden zu
"not all"serialisiert. Sie lösen nie einchange-Event aus. - Schreibgeschützt: Eine Zuweisung an
event.mediahat keine Wirkung (im Strict Mode wird einTypeErrorausgelöst). - Kompatibilität: Ältere Safari-Versionen (vor 14) unterstützen
addEventListeneranMediaQueryListnicht. Dort muss man das veraltetemql.addListener(handler)als Fallback verwenden. Die Eigenschaftmediaist trotzdem verfügbar. - Das Event feuert nur bei einer Änderung. Den Anfangszustand muss man einmal selbst über
mql.matchesabfragen.