Что такое @custom-media и зачем он нужен?
Правило @custom-media из CSS Media Queries Level 5 позволяет задавать именованные алиасы для сложных медиавыражений прямо в CSS.

В современном CSS медиавыражения могут быть длинными и визуально сбивать с толку — особенно когда вы комбинируете проверки вроде (min-width: 1024px) and (hover: hover) and (pointer: fine).
Спецификация CSS Media Queries Level 5 вводит правило @custom-media. Оно позволяет объявлять глобальные именованные алиасы для сложных условий прямо в CSS — по аналогии с CSS-переменными (var()).
/* Объявляем именованное медиавыражение */
@custom-media --desktop (min-width: 1024px);
@custom-media --hoverable (hover: hover) and (pointer: fine);
/* Использование в коде */
@media (--desktop) and (--hoverable) {
.card:hover {
transform: translateY(-4px);
}
}
Главные плюсы:
- DRY в CSS: Брейкпоинты и проверки не дублируются сотни раз по всем файлам.
- Единый источник истины: Если меняется значение брейкпоинта, вы меняете его в одном месте.
- Семантика: Вместо магических цифр
768pxкод читается как понятные условия:--desktop,--touch,--retina.
Ещё примеры:
/* Брейкпоинты */
@custom-media --from-360 (min-width: 360px);
@custom-media --from-760 (min-width: 760px);
@custom-media --from-1260 (min-width: 1260px);
/* Широкий цветовой охват */
@custom-media --true-hdr (color-gamut: p3) and (dynamic-range: high);
@media (--true-hdr) {
.hero-banner {
background-color: color(display-p3 1 0 0); /* Сочный ультра-красный */
}
}
/* Темы и A11y */
@custom-media --dark-mode (prefers-color-scheme: dark);
@custom-media --reduce-motion (prefers-reduced-motion: reduce);
@media (--reduce-motion) {
* {
animation-duration: 0.001ms !important;
}
}
🚦 Что по поддержке браузеров?
На данный момент @custom-media нативно реализован только в Firefox за экспериментальным флагом (layout.css.custom-media.enabled). Chromium и WebKit пока держат фичу в статусе обсуждения/разработки.
Как использовать в продакшене уже сегодня:
- PostCSS / LightningCSS: Плагины (например,
postcss-custom-media) компилируют алиасы в обычные@media (...)на этапе сборки. - Container Style Queries: Переход на
@container style(), если хочется похожей логики в нативном CSS без сборщиков.
/* Definition */
:root {
@media (hover: hover) and (pointer: fine) {
--mouse: any-valid-ident;
}
@media (hover: none) and (pointer: coarse) {
--touch: true;
}
}
/* Usage */
@container style(--mouse) {
/* ... */
}
@container style(--touch) {
/* ... */
}