The @supports
CSS at-rule lets you specify declarations that depend on a browser's support for one or more specific CSS features. This is called a feature query. The rule may be placed at the top level of your code or nested inside any other conditional group at-rule.
@supports (display: flex) { div { display: flex; } }
@supports not (display: flex) { div { float: right; } }
In JavaScript, @supports
can be accessed via the CSS object model interface CSSSupportsRule
.
The @supports
at-rule associates a block of statements with a supports condition. The supports condition consists of one or more name-value pairs combined by conjunctions (and
), disjunctions (or
), and/or negations (not
). Precedence of operators can be defined with parentheses.
The most basic supports condition is a simple declaration (a property name followed by a value, separated by a colon). The declaration must be surrounded by parentheses. The following example returns true if the browser's transform-origin
property considers 5% 5%
valid:
@supports (transform-origin: 5% 5%)
not
operatorThe not
operator can precede any expression to create a new expression, resulting in the negation of the original one. The following example returns true if the browser's transform-origin
property doesn't consider 10em 10em 10em
valid:
@supports not (transform-origin: 10em 10em 10em)
As with any operator, the not
operator can be applied to a declaration of any complexity. The following examples are both valid:
@supports not (not (transform-origin: 2px)) @supports (display: flexbox) and (not (display: inline-grid))
Note: There is no need to enclose the not
operator between two parentheses at the top level. To combine it with other operators, like and
and or
, the parentheses are required.
and
operatorThe and
operator creates a new expression from the conjunction of two shorter expressions. It returns true only if both of the shorter expressions are also true. The following example returns true if and only if the two shorter expressions are simultaneously true:
@supports (display: table-cell) and (display: list-item)
Multiple conjunctions can be juxtaposed without the need of more parentheses. The following are both equivalent:
@supports (display: table-cell) and (display: list-item) and (display:run-in) @supports (display: table-cell) and ((display: list-item) and (display:run-in))
or
operatorThe or
operator creates a new expression from the disjunction of two shorter expressions. It returns true if one or both of the shorter expressions is also true. The following example returns true if at least one of the two shorter expressions is true:
@supports (transform-style: preserve) or (-moz-transform-style: preserve)
Multiple disjunctions can be juxtaposed without the need of more parentheses. The following are both equivalent:
@supports (transform-style: preserve) or (-moz-transform-style: preserve) or (-o-transform-style: preserve) or (-webkit-transform-style: preserve) @supports (transform-style: preserve-3d) or ((-moz-transform-style: preserve-3d) or ((-o-transform-style: preserve-3d) or (-webkit-transform-style: preserve-3d)))
Note: When using both and
and or
operators, the parentheses must be used to define the order in which they apply. Otherwise, the condition is invalid and the whole rule is ignored.
@supports <supports-condition> { <group-rule-body> }
@supports (animation-name: test) { … /* CSS applied when animations are supported with a prefix */ @keyframes { /* Other at-rules can be nested inside */ … } }
@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 */ }
@supports not ((text-align-last: justify) or (-moz-text-align-last: justify)) { … /* CSS to provide fallback alternative for text-align-last: justify */ }
@supports (--foo: green) { body { color: var(--varName); } }
Specification | Status | Comment |
---|---|---|
CSS Conditional Rules Module Level 3 The definition of '@supports' in that specification. | Candidate Recommendation | Initial definition. |
Feature | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
Basic support | 28 | 12 |
22 17 —?1 |
No | 12.1 | 9 |
Feature | Android webview | Chrome for Android | Edge mobile | Firefox for Android | Opera Android | iOS Safari | Samsung Internet |
---|---|---|---|---|---|---|---|
Basic support | ? | 28 | Yes |
22 17 —?1 |
12.1 | 9 | ? |
1. From version 17: this feature is behind the layout.css.supports-rule.enabled
preference (needs to be set to true
). To change preferences in Firefox, visit about:config.
CSSSupportsRule
, and the CSS.supports
method that allows the same check to be performed via JavaScript.
© 2005–2018 Mozilla Developer Network and individual contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/CSS/@supports