Spec-Zone.ru › CSS

CSS-ат-правило `@supports`

Базовая поддержка Широко доступно

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и во многих версиях браузеров. Она доступна во всех браузерах с сентября 2015 года.

@supports CSS ат-правило позволяет задавать объявления CSS, применение которых зависит от поддержки браузером функций CSS. Использование этого ат-правила обычно называют запросом функции. Правило необходимо размещать на верхнем уровне кода или вкладывать в любое другое условное групповое ат-правило.

В JavaScript к @supports можно получить доступ через интерфейс объектной модели CSS CSSSupportsRule.

Попробуйте

.flex-container > * {
  padding: 0.3em;
  list-style-type: none;
  text-shadow: 0 0 2px red;
  float: left;
}

@supports (display: flex) {
  .flex-container > * {
    text-shadow: 0 0 2px blue;
    float: none;
  }

  .flex-container {
    display: flex;
  }
}
<ul class="flex-container">
  <li><a href="#">Index</a></li>
  <li><a href="#">About me</a></li>
  <li><a href="#">Contact</a></li>
</ul>

Синтаксис

@supports (<supports-condition>) {
  /* If the condition is true, use the CSS in this block. */
}

@supports (<supports-condition>) and (<supports-condition>) {
  /* If both conditions are true, use the CSS in this block. */
}

Ат-правило @supports состоит из блока инструкций с условием поддержки. Условия можно объединять с помощью конъюнкций (and), дизъюнкций (or) и/или отрицаний (not). Приоритет операторов можно задавать с помощью скобок.

В условиях поддержки можно использовать синтаксис <property>: <value> для объявления или синтаксис <function()>. В следующих разделах описано использование каждого типа условий поддержки.

Синтаксис объявления

Синтаксис объявления проверяет, поддерживает ли браузер указанное объявление <property>: <value>. Объявление необходимо заключить в скобки. Следующий пример возвращает true, если браузер поддерживает выражение transform-origin: 5% 5%:

@supports (transform-origin: 5% 5%) {
}

Синтаксис функции

Синтаксис функции проверяет, поддерживает ли браузер значения или выражения внутри функции. Функции, поддерживаемые в этом синтаксисе, описаны в следующих разделах.

at-rule()

Эта функция проверяет, поддерживает ли браузер указанное ат-правило. Следующий пример возвращает true и применяет содержащиеся в нём стили CSS, если браузер поддерживает ат-правило @keyframes:

@supports at-rule(@keyframes) {
}

selector()

Эта функция проверяет, поддерживает ли браузер указанный синтаксис селектора. Следующий пример возвращает true и применяет содержащиеся в нём стили CSS, если браузер поддерживает комбинатор дочерних элементов:

@supports selector(h2 > p) {
}

font-tech()

Эта функция проверяет, поддерживает ли браузер указанную технологию шрифтов для компоновки и отображения. Следующий пример возвращает true и применяет содержащиеся в нём стили CSS, если браузер поддерживает технологию шрифтов COLRv1:

@supports font-tech(color-COLRv1) {
}

В таблице ниже описаны технологии шрифтов (<font-tech>), включая технологии цветных шрифтов (<color-font-tech>), технологии функций шрифтов (<font-features-tech>) и другие доступные технологии шрифтов, которые можно проверить с помощью функции font-tech():

Технология Поддержка
<color-font-tech>
color-colrv0 Многоцветные глифы с помощью таблицы COLR версии 0
color-colrv1 Многоцветные глифы с помощью таблицы COLR версии 1
color-svg Многоцветные таблицы SVG
color-sbix Стандартные таблицы растровой графики
color-cbdt Таблицы растровых данных о цвете
<font-features-tech>
features-opentype Таблицы OpenType GSUB и GPOS
features-aat Таблицы TrueType morx и kerx
features-graphite Функции Graphite, а именно таблицы Silf, Glat, Gloc, Feat и Sill
Другие значения <font-tech>
incremental-patch Инкрементальная загрузка шрифтов с использованием метода подмножеств патчей
incremental-range Инкрементальная загрузка шрифтов с использованием метода запросов диапазона
incremental-auto Инкрементальная загрузка шрифтов с использованием согласования методов
variations Вариативные шрифты TrueType и OpenType для управления осями шрифта, начертанием, глифами и т. д.
palettes Палитры шрифтов, выбираемые с помощью font-palette из множества цветовых палитр шрифта

font-format()

Эта функция проверяет, поддерживает ли браузер указанный формат шрифта для компоновки и отображения. Следующий пример возвращает true и применяет содержащиеся в нём стили CSS, если браузер поддерживает формат шрифта opentype:

@supports font-format(opentype) {
}

В следующей таблице описаны доступные форматы (значения <font-format>), которые можно проверить с помощью этой функции:

Формат Описание Расширения файлов
collection Коллекция OpenType .otc, .ttc
embedded-opentype Встроенный OpenType .eot
opentype OpenType .ttf, .otf
svg Шрифт SVG (устаревший формат) .svg, .svgz
truetype TrueType .ttf
woff WOFF 1.0 (Web Open Font Format) .woff
woff2 WOFF 2.0 (Web Open Font Format) .woff2

Оператор not

Оператор not предшествует выражению и приводит к отрицанию этого выражения. Следующее условие возвращает true, если свойство transform-origin браузера считает 10em 10em 10em недопустимым:

@supports not (transform-origin: 10em 10em 10em) {
}

Как и любой оператор, оператор not можно применять к объявлению любой сложности. Следующие примеры корректны:

@supports not (not (transform-origin: 2px)) {
}
@supports (display: grid) and (not (display: inline-grid)) {
}

Примечание: На верхнем уровне оператор not не нужно заключать в две скобки. Чтобы объединить его с другими операторами, такими как and и or, скобки необходимы.

Оператор and

Оператор and создаёт новое выражение, представляющее собой конъюнкцию двух более коротких выражений. Он возвращает true, только если оба коротких выражения также истинны. Следующий пример возвращает true только в том случае, если оба коротких выражения истинны одновременно:

@supports (display: table-cell) and (display: list-item) {
}

Несколько конъюнкций можно записать подряд без дополнительных скобок. Следующие варианты эквивалентны:

@supports (display: table-cell) and (display: list-item) and (display: contents) {
}
@supports (display: table-cell) and
  ((display: list-item) and (display: contents)) {
}

Оператор or

Оператор or создаёт новое выражение, представляющее собой дизъюнкцию двух более коротких выражений. Он возвращает true, если истинно одно или оба коротких выражения. Следующий пример возвращает true, если истинно хотя бы одно из двух коротких выражений:

@supports (transform-style: preserve) or (-moz-transform-style: preserve) {
}

Несколько дизъюнкций можно записать подряд без дополнительных скобок. Следующие варианты эквивалентны:

@supports (transform-style: preserve) or (-moz-transform-style: preserve) or
  (-webkit-transform-style: preserve) {
}

@supports (transform-style: preserve-3d) or
  (
    (-moz-transform-style: preserve-3d) or
      (-webkit-transform-style: preserve-3d)
  ) {
}

Примечание: При использовании операторов and и or необходимо задействовать скобки, чтобы определить порядок их применения. В противном случае условие будет недопустимым, и всё правило будет проигнорировано.

Формальный синтаксис

Примеры

Проверка поддержки свойства CSS

@supports (animation-name: test) {
  /* CSS applied when animations are supported without a prefix */
  @keyframes {
    /* Other at-rules can be nested inside */
  }
}

Проверка поддержки заданного свойства CSS или его версии с префиксом

@supports (text-stroke: 10px) or (-webkit-text-stroke: 10px) {
  /* CSS applied when text-stroke, prefixed or not, is supported */
}

Проверка отсутствия поддержки определённого свойства CSS

@supports not ((text-align-last: justify) or (-moz-text-align-last: justify)) {
  /* CSS to provide fallback alternative for text-align-last: justify */
}

Проверка поддержки селектора

Условные правила CSS позволяют проверять поддержку селектора, например :has().

/* This rule won't be applied in browsers that don't support :has() */
ul:has(> li li) {
  /* CSS is applied when the :has(…) pseudo-class is supported */
}

@supports not selector(:has(a, b)) {
  /* Fallback for when :has() is unsupported */
  ul > li,
  ol > li {
    /* The above expanded for browsers that don't support :has(…) */
  }
}

/* Note: So far, there's no browser that supports the `of` argument of :nth-child(…) */
@supports selector(:nth-child(1n of a, b)) {
  /* This rule needs to be inside the @supports block, otherwise
     it will be partially applied in browsers which don't support
     the `of` argument of :nth-child(…) */
  :is(:nth-child(1n of ul, ol) a, details > summary) {
    /* CSS applied when the :is(…) selector and
       the `of` argument of :nth-child(…) are both supported */
  }
}

Проверка поддержки технологии шрифтов

Следующий пример применяет цветной шрифт Bungee Spice, если браузер поддерживает технологию шрифтов COLRv1:

@supports font-tech(color-COLRv1) {
  body {
    font-family: "Bungee Spice", fantasy;
  }
}

Поддержку технологии шрифтов также можно проверить с помощью функции tech внутри ат-правила @font-face. В следующем примере, если браузер не поддерживает технологию цветных шрифтов в шрифте bungee-spice.woff2, вместо него будет использоваться обычный шрифт bungee.woff2.

@font-face {
  font-family: "Bungee Spice";
  src:
    url("bungee-spice.woff2") tech(color-COLRv1) format("woff2"),
    url("bungee.woff2") format("woff2");
}

Проверка поддержки формата шрифта

В следующем примере используется версия шрифта WOFF2, если браузер поддерживает этот формат; в противном случае используется указанная ранее версия WOFF:

@font-face {
  font-family: "Open Sans WOFF";
  src: url("open-sans.woff") format("woff");
}

@font-face {
  font-family: "Open Sans WOFF2";
  src: url("open-sans.woff2") format("woff2");
}

body {
  font-family: "Open Sans WOFF", sans-serif;
}

@supports font-format(woff2) {
  body {
    font-family: "Open Sans WOFF2", sans-serif;
  }
}

Однако более эффективный способ указать несколько форматов шрифта — перечислить их в дескрипторе src единственного ат-правила @font-face, расположив их в порядке от наиболее предпочтительного формата к наименее предпочтительному:

@font-face {
  font-family: "Open Sans";
  src:
    url("open-sans.woff2") format("woff2"),
    url("open-sans.woff") format("woff");
}

body {
  font-family: "Open Sans", sans-serif;
}

Проверка поддержки ат-правила

Следующий пример применяет набор стилей цветовой схемы с ограниченной областью действия, если браузер поддерживает ат-правило @scope:

@supports at-rule(@scope) {
  @scope (.light-scheme) {
    :scope {
      background-color: plum;
    }

    a {
      color: darkmagenta;
    }
  }

  @scope (.dark-scheme) {
    :scope {
      background-color: darkmagenta;
      color: antiquewhite;
    }

    a {
      color: plum;
    }
  }
}

Спецификации

Спецификация
CSS Conditional Rules Module Level 5
# at-supports-ext
CSS Conditional Rules Module Level 4
# at-supports-ext
CSS Conditional Rules Module Level 3
# at-supports

Совместимость с браузерами

Настольные Мобильные
Chrome Edge Firefox Opera Safari Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet WebView Android WebView on iOS
supports
28
12
22
12.1
9
28
22
12.1
9
1.5
4.4
9
at-rule
148
148
предварительная версия
132
предварительная версия
148
Нет
99
Нет
Нет
148
Нет
font-format
108
108
106
94
17
108
106
73
17
21.0
108
17
font-tech
108
108
106
94
17
108
106
73
17
21.0
108
17
named-feature
150
150
Нет
134
Нет
150
Нет
101
Нет
Нет
150
Нет
selector
83
83
69
69
14.1
83
79
Нет
14.5
13.0
83
14.5

См. также

  • Использование запросов функций
  • Функции CSS-ат-правил
  • CSSSupportsRule
  • метод CSS.supports()

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/At-rules/@supports

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API