Правило @supports позволяет проверить, поддерживает браузер ту или иную возможность, и на основе этого применить стили. Можно создавать составные условия с помощью логических операторов not, and, or.
В качестве условия в круглых скобках пишется CSS свойство и его значение. Далее в фигурных скобках идут стили. Если браузер поддерживает указанное свойство, то применяются заданные стили, в противном случае они игнорируются.
123
@supports(transform:perspective(300px)){/* Браузер поддерживает свойство transform с функцией perspective() */}
Для проверки того, что свойство не поддерживается применяется логический оператор not, он ставится перед условием.
123
@supportsnot(transform:perspective(300px)){/* Браузер НЕ поддерживает свойство transform с функцией perspective() */}
Объединить несколько условий можно через логический оператор and. Если хотя бы одно из условий не поддерживается, то стили не применяются.
12345
@supports(transform-origin:50%100%)and(transform:perspective(300px)){/* Браузер одновременно поддерживает свойства transform-origin И transform с функцией perspective() */}
Для выбора одного из условий используется логический оператор or. Если поддерживается хотя бы одно из условий, то применяются стили.
12345
@supports(perspective:300px)or(transform:perspective(300px)){/* Браузер поддерживает свойство perspective ИЛИ свойство transform с функцией perspective() */}
@supports(animation-name:test){/* CSS applied when animations are supported without a prefix */@keyframes{/* Other at-rules can be nested inside */}}
Тестирование на поддержку заданного свойства CSS или версии с префиксом:
1234567
@supports((perspective:10px)or(-moz-perspective:10px)or(-webkit-perspective:10px)or(-ms-perspective:10px)or(-o-perspective:10px)){/* CSS applied when 3D transforms, prefixed or not, are supported */}
Тестирование на отсутствие поддержки определенного свойства CSS:
123456
@supportsnot((text-align-last:justify)or(-moz-text-align-last:justify)){/* CSS to provide fallback alternative for text-align-last: justify */}
Тестирование на поддержку пользовательских свойств:
Тестирование на поддержку селектора, например :is()
1 2 3 4 5 6 7 8 910111213141516171819202122
/* This rule won't be applied in browsers which don't support :is() */:is(ul,ol)>li{/* CSS applied when the :is(…) selector is supported */}@supportsnotselector(:is(a,b)){/* Fallback for when :is() is unsupported */ul>li,ol>li{/* The above expanded for browsers which don't support :is(…) */}}@supportsselector(:nth-child(1nofa,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 supported */:is(:nth-child(1noful,ol)a,details>summary){/* CSS applied when the :is(…) selector and the `of` argument of :nth-child(…) are both supported */}}
<!doctype html><html><head><title>@supports</title><metacharset="utf-8"/><style>@supports(display:flex){.no{display:none;}}@supportsnot(display:flex){.yes{display:none;}}</style></head><body><pclass="yes">
Ваш браузер поддерживает display: flex.
</p><pclass="no">
Ваш браузер не поддерживает display: flex.
</p></body></html>