Custom Media Queries: @custom-media in PostCSS vs. natives CSS
AI generated
{ }
@
CSS · PostCSS · Media Queries
Custom Media Queries
@custom-media in PostCSS vs. der kommende native CSS-Standard

@custom-media erlaubt es, eine Media-Query-Bedingung einmal zu benennen und danach überall im Stylesheet wiederzuverwenden, statt dieselbe Breitenangabe an zwanzig Stellen zu wiederholen. Bisher übernimmt PostCSS diese Übersetzung beim Build, doch die Media Queries Level 5 Spezifikation bringt genau diese Fähigkeit direkt in den Browser.

15 Min. Lesezeit @custom-media · PostCSS Media Queries Level 5

1. Das Grundproblem: dieselbe Breitenangabe an zwanzig Stellen

In einem gewachsenen Stylesheet taucht ein Breakpoint wie min-width: 48rem oft an Dutzenden Stellen auf, verstreut über verschiedene Komponenten-Dateien. Ändert sich der Breakpoint, weil das Designteam die Tablet-Grenze anpasst, muss diese Zahl an jeder einzelnen Stelle manuell gesucht und ersetzt werden, mit dem Risiko, eine Stelle zu übersehen und eine inkonsistente Darstellung zu produzieren.

Custom Media Queries lösen genau dieses Problem, indem sie eine Bedingung wie --breakpoint-tablet genau einmal definieren und danach per Namen referenzieren. Das ist konzeptionell dasselbe, was Custom Properties für Farbwerte oder Abstände leisten, nur eben auf Ebene ganzer Media-Query-Bedingungen statt einzelner Werte.

2. @custom-media in PostCSS: Syntax und Grundeinrichtung

Mit dem PostCSS-Plugin postcss-custom-media wird eine benannte Bedingung mit der At-Regel @custom-media deklariert, typischerweise in einer zentralen Datei, die vor allen anderen Stylesheets eingebunden wird. Der Name beginnt zwingend mit zwei Bindestrichen, genau wie bei Custom Properties, und kann danach in jeder @media-Regel des Projekts als Bedingung eingesetzt werden.

Beim Build-Schritt ersetzt PostCSS jede Verwendung von @media (--breakpoint-tablet) durch die tatsächliche, ausgeschriebene Bedingung, sodass der ausgelieferte CSS-Code am Ende ganz normale, von jedem Browser verstandene Media Queries enthält. Für das Entwicklungsteam bleibt im Quellcode aber der sprechende Name erhalten, was Lesbarkeit und Wartbarkeit deutlich erhöht.


/* breakpoints.css -- zentral definiert, vor allen anderen Dateien geladen */
@custom-media --breakpoint-tablet (min-width: 48rem);
@custom-media --breakpoint-desktop (min-width: 64rem);
@custom-media --dark-mode (prefers-color-scheme: dark);

/* component.css -- Verwendung an beliebig vielen Stellen */
.sidebar {
  display: none;
}

@media (--breakpoint-tablet) {
  .sidebar {
    display: block;
  }
}

3. Bedingungen kombinieren: and, or und verschachtelte Custom Media Queries

Ein besonderer Vorteil von @custom-media ist, dass sich mehrere benannte Bedingungen mit and oder or kombinieren lassen, ohne die zugrunde liegende Definition doppelt auszuschreiben. Eine Bedingung wie Tablet oder größer, aber nicht im Dunkelmodus lässt sich dadurch lesbar formulieren, statt eine lange, schwer verständliche einzelne Media-Query-Kette zu pflegen.

PostCSS erlaubt außerdem, eine Custom Media Query innerhalb der Definition einer anderen zu verwenden, was hierarchische Bedingungen wie Desktop, was Tablet einschließt ermöglicht. Diese Verschachtelung sollte allerdings sparsam eingesetzt werden, weil sie schnell unübersichtlich wird, wenn eine Bedingung über mehrere Ebenen hinweg aus anderen Bedingungen zusammengesetzt ist.


@custom-media --breakpoint-tablet (min-width: 48rem);
@custom-media --dark-mode (prefers-color-scheme: dark);

@media (--breakpoint-tablet) and not (--dark-mode) {
  .banner {
    background: #ede9fe;
  }
}

@media (--breakpoint-tablet) or (--dark-mode) {
  .contrast-note {
    display: block;
  }
}

4. Der native Weg: Custom Media Queries in Media Queries Level 5

Die Spezifikation Media Queries Level 5 definiert dieselbe At-Regel @custom-media nativ für den Browser, mit nahezu identischer Syntax zu PostCSS. Sobald ein Browser diese Regel unterstützt, muss keine Build-Zeit-Übersetzung mehr stattfinden, weil der Browser die Bedingung selbst zur Laufzeit auflöst und bei jeder Verwendung von @media (--breakpoint-tablet) die hinterlegte Definition direkt anwendet.

Der praktische Unterschied zur PostCSS-Variante liegt vor allem darin, dass native Custom Media Queries auch nachträglich per JavaScript oder über CSS Custom Properties beeinflussbar werden könnten, sobald die Spezifikation entsprechend erweitert wird, während eine PostCSS-Bedingung als Build-Zeit-Konstante feststeht und sich zur Laufzeit im Browser nicht mehr ändern lässt.

5. Browser-Unterstützung heute und die realistische Zeitschiene

Zum jetzigen Stand unterstützt kein aktueller Browser die native @custom-media-Regel vollständig produktionsreif, sie befindet sich in unterschiedlichen Experimentierstadien hinter Flags oder in frühen Implementierungen. Ein produktives Projekt kann sich also nicht allein auf die native Unterstützung verlassen, sondern muss weiterhin auf PostCSS oder eine vergleichbare Build-Zeit-Lösung setzen, um Custom Media Queries schon heute nutzbar zu machen.

Für die Projektplanung bedeutet das: Wer heute mit postcss-custom-media arbeitet, verwendet bereits exakt die Syntax, die später nativ funktionieren wird, weil beide Spezifikationen bewusst aufeinander abgestimmt sind. Das minimiert das Migrationsrisiko erheblich, weil kein Syntaxwechsel nötig sein wird, sondern lediglich der Build-Schritt irgendwann entfallen kann.

6. Migrationsstrategie: vom PostCSS-Plugin zum nativen Browser-Feature

Der empfohlene Weg ist, alle Custom-Media-Definitionen von Anfang an in einer einzigen, zentralen Datei zu bündeln, statt sie über das gesamte Projekt zu verteilen. Das macht die spätere Migration zu einer Ein-Datei-Änderung: Sobald native Unterstützung in allen relevanten Zielbrowsern gegeben ist, wird das PostCSS-Plugin einfach aus der Build-Pipeline entfernt, ohne dass an den Definitionen selbst etwas geändert werden muss.

Wichtig ist außerdem, in dieser Übergangszeit auf @supports-Prüfungen zu verzichten, weil sich @custom-media im PostCSS-Fall ohnehin vollständig in reguläre @media-Regeln auflöst, bevor der Code den Browser erreicht. Der Feature-Test wird erst relevant, sobald tatsächlich mit einer gemischten Codebasis aus nativer und noch nicht übersetzter Syntax gearbeitet wird, was in einem gut geplanten Migrationsprojekt in der Regel vermieden werden sollte.


# Vorher: PostCSS uebernimmt die Aufloesung im Build
npm install postcss-custom-media --save-dev

# postcss.config.js
module.exports = {
  plugins: [
    require('postcss-custom-media'),
    require('autoprefixer'),
  ],
};

# Nachher, sobald native Unterstuetzung ausreicht:
# Plugin-Zeile einfach aus postcss.config.js entfernen,
# @custom-media-Definitionen bleiben unveraendert bestehen.

7. Custom Media Queries neben Tailwind CSS: sinnvolle Ergänzung, kein Ersatz

In einem Projekt mit Tailwind CSS decken die eingebauten Breakpoint-Präfixe wie md: oder lg: bereits den größten Teil des Anwendungsfalls ab, weil sie exakt dasselbe Ziel verfolgen: benannte, konsistent wiederverwendbare Bedingungen statt ausgeschriebener Breitenangaben. Custom Media Queries werden dort relevant, wo Bedingungen jenseits reiner Breakpoints stehen, etwa eine Kombination aus prefers-reduced-motion und einer Mindestbreite, die als eigene, wiederverwendbare Einheit benannt werden soll.

Auch in handgeschriebenem CSS außerhalb des Utility-Frameworks, etwa für komplexe Komponenten-Bibliotheken oder Design-System-Basis-Stylesheets, bleibt @custom-media das richtige Werkzeug, um Bedingungen genauso konsistent zu benennen wie Farb- und Abstandswerte über Custom Properties.

8. Namenskonventionen: semantische Namen statt reiner Pixelwerte

Ein häufiger Anfängerfehler ist, Custom Media Queries nach ihrem Zahlenwert zu benennen, etwa --bp-768, statt nach ihrer eigentlichen Bedeutung im Design-System. Ändert sich später der zugrunde liegende Breitenwert, weil das Designteam den Tablet-Breakpoint von 48rem auf 50rem verschiebt, bleibt der Name --bp-768 plötzlich inhaltlich falsch, obwohl er im Code unverändert weiterverwendet wird und dadurch für Verwirrung sorgt.

Bewährt hat sich stattdessen eine semantische Benennung nach Zweck statt nach Wert, etwa --breakpoint-tablet oder --breakpoint-nav-collapse, die auch dann noch korrekt bleibt, wenn sich der konkrete Zahlenwert dahinter ändert. Dieselbe Konvention gilt für funktionale Bedingungen wie --dark-mode oder --reduced-motion, die den Zweck der Bedingung beschreiben, statt die zugrunde liegende Media-Feature-Syntax im Namen zu wiederholen.


/* Ungünstig: Name koppelt sich an einen konkreten Zahlenwert */
@custom-media --bp-768 (min-width: 48rem);

/* Besser: Name beschreibt den Zweck, bleibt bei Wertaenderung korrekt */
@custom-media --breakpoint-tablet (min-width: 48rem);
@custom-media --breakpoint-nav-collapse (max-width: 61.9375rem);
@custom-media --reduced-motion (prefers-reduced-motion: reduce);

9. PostCSS-Ansatz und nativer Standard im direkten Vergleich

Beide Wege führen syntaktisch zum selben Ergebnis, unterscheiden sich aber in Zeitpunkt der Auflösung, Browser-Abhängigkeit und den daraus entstehenden praktischen Konsequenzen für Build-Pipeline und Debugging.

Aspekt PostCSS (postcss-custom-media) Native CSS (Media Queries Level 5) Konsequenz
Auflösungszeitpunkt Build-Zeit, vor Auslieferung Laufzeit, im Browser selbst Native Variante reagiert potenziell auf spätere Änderungen
Browser-Support heute Universell, weil zu Standard-CSS übersetzt Kaum vorhanden, meist hinter Flags PostCSS bleibt aktuell die produktionsreife Wahl
Debugging DevTools zeigen bereits aufgelöste Media Query DevTools könnten künftig den Custom-Namen zeigen PostCSS erschwert Rückverfolgung zur Quelldefinition leicht
Migrationsaufwand Build-Plugin muss installiert und gepflegt werden Kein Build-Schritt nötig, sobald Support da ist Syntax bleibt identisch, nur der Build-Schritt entfällt

Mironsoft

Modernes CSS, Layout-Architektur und Rendering-Performance

CSS, das wartbar bleibt statt mit jeder Änderung zu brechen?

Wir prüfen bestehende Stylesheets auf Spezifitäts-Chaos und Layout-Thrashing und bauen daraus eine CSS-Architektur mit Cascade Layers, Custom Properties und modernen Layout-Primitiven, die auch nach dem zehnten Feature noch verständlich ist.

CSS-Audit

Spezifität, Cascade-Konflikte und ungenutzte Selektoren systematisch aufdecken.

Architektur-Refactoring

Cascade Layers, Custom Properties und Design Tokens sauber einführen.

Performance-Tuning

Layout-Thrashing, teure Selektoren und Rendering-Engpässe gezielt beheben.

10. Zusammenfassung

Custom Media Queries: Das Wichtigste auf einen Blick

Grundidee

@custom-media benennt eine Media-Query-Bedingung einmal zentral und macht sie im gesamten Stylesheet per Name wiederverwendbar.

Heute

postcss-custom-media übersetzt die Regel beim Build zu Standard-Media-Queries und ist produktionsreif in jedem Browser einsetzbar.

Morgen

Media Queries Level 5 definiert dieselbe Syntax nativ, aktuelle Browser unterstützen sie aber noch nicht produktionsreif.

Migration

Definitionen zentral in einer Datei bündeln, dann genügt später das Entfernen des PostCSS-Plugins, ohne die Syntax zu ändern.

11. FAQ: Custom Media Queries: Das Wichtigste auf einen Blick

1Was ist eine Custom Media Query?
Eine mit @custom-media benannte, wiederverwendbare Media-Query-Bedingung, die anschließend per Name statt per ausgeschriebener Bedingung in beliebig vielen @media-Regeln verwendet werden kann.
2Brauche ich für @custom-media ein PostCSS-Plugin?
Aktuell ja, weil kein Browser die Regel produktionsreif nativ unterstützt. Das Plugin postcss-custom-media übersetzt die Regel beim Build in reguläre, von jedem Browser verstandene Media Queries.
3Wird @custom-media irgendwann nativ im Browser funktionieren?
Ja, die Spezifikation Media Queries Level 5 definiert dieselbe At-Regel nativ. Aktuelle Browser unterstützen sie aber noch nicht flächendeckend produktionsreif.
4Muss ich die Syntax später ändern, wenn native Unterstützung kommt?
Nein, die PostCSS-Syntax und die native Spezifikation sind bewusst aufeinander abgestimmt. Es genügt, das Build-Plugin zu entfernen, die Definitionen selbst bleiben unverändert.
5Kann ich mehrere Custom Media Queries mit and oder or kombinieren?
Ja, sowohl in PostCSS als auch in der nativen Spezifikation lassen sich benannte Bedingungen mit and, or und not zu komplexeren Ausdrücken verknüpfen.
6Wo sollte ich Custom-Media-Definitionen ablegen?
In einer einzigen, zentralen Datei, die vor allen anderen Stylesheets geladen wird. Das erleichtert spätere Änderungen und die Migration zum nativen Standard erheblich.
7Ersetzt @custom-media Tailwinds Breakpoint-Präfixe wie md: oder lg:?
Nein, für reine Breakpoints deckt Tailwind das bereits ab. @custom-media wird relevant für komplexere, benannte Bedingungen jenseits einfacher Breitenangaben, etwa Kombinationen mit prefers-reduced-motion.
8Erschwert PostCSS das Debugging im Browser?
Etwas, weil die DevTools nur die bereits aufgelöste Media Query zeigen, nicht den ursprünglichen Custom-Namen. Ein Blick in die Quelldatei mit der @custom-media-Definition schafft schnell Klarheit.
9Kann ich eine Custom Media Query innerhalb einer anderen verwenden?
Ja, PostCSS erlaubt Verschachtelung für hierarchische Bedingungen. Das sollte aber sparsam eingesetzt werden, weil tief verschachtelte Definitionen schnell unübersichtlich werden.
10Lohnt sich @custom-media für ein kleines Projekt mit wenigen Breakpoints?
Bei nur zwei oder drei Breakpoints ist der Nutzen gering. Der Vorteil zeigt sich vor allem in größeren Codebasen mit vielen Komponenten-Dateien, in denen dieselbe Bedingung sonst an zahlreichen Stellen dupliziert würde.