@supports
Quick Summary for @supports
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.
Code Usage for @supports
@supports (display: grid) {   div {     display: grid;   } } 
More Details for @supports

@supports

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: grid) {   div {     display: grid;   } } 
@supports not (display: grid) {   div {     float: right;   } } 

In JavaScript, @supports can be accessed via the CSS object model interface CSSSupportsRule.

Syntax

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.

Declaration syntax

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%) {} 

Function syntax

The second basic supports condition is a supports function, the syntax for these is supported by all browsers, but the functions themselves are still being standardized.

selector()

Tests if the browser supports the tested selector syntax. The following example returns true if the browser supports the child combinator:

@supports selector(A > B) {} 

The not operator

The 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: grid) 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.

The and operator

The 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:contents) {} @supports (display: table-cell) and ((display: list-item) and (display:contents)) {} 

The or operator

The 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.

Formal syntax

@supports <supports-condition> {   <group-rule-body> }

where <supports-condition> = not <supports-in-parens> | <supports-in-parens> [ and <supports-in-parens> ]* | <supports-in-parens> [ or <supports-in-parens> ]*

where <supports-in-parens> = ( <supports-condition> ) | <supports-feature> | <general-enclosed>

where <supports-feature> = <supports-decl> | <supports-selector-fn><general-enclosed> = [ <function-token> <any-value> ) ] | ( <ident> <any-value> )

where <supports-decl> = ( <declaration> )<supports-selector-fn> = selector( <complex-selector> )

where <complex-selector> = <compound-selector> [ <combinator>? <compound-selector> ]*

where <compound-selector> = [ <type-selector>? <subclass-selector>* [ <pseudo-element-selector> <pseudo-class-selector>* ]* ]!<combinator> = '>' | '+' | '~' | [ '||' ]

where <type-selector> = <wq-name> | <ns-prefix>? '*'<subclass-selector> = <id-selector> | <class-selector> | <attribute-selector> | <pseudo-class-selector><pseudo-element-selector> = ':' <pseudo-class-selector><pseudo-class-selector> = ':' <ident-token> | ':' <function-token> <any-value> ')'

where <wq-name> = <ns-prefix>? <ident-token><ns-prefix> = [ <ident-token> | '*' ]? | <id-selector> = <hash-token><class-selector> = '.' <ident-token><attribute-selector> = '[' <wq-name> ']' | '[' <wq-name> <attr-matcher> [ <string-token> | <ident-token> ] <attr-modifier>? ']'

where <attr-matcher> = [ '~' | | | '^' | '$' | '*' ]? '='<attr-modifier> = i | s

Examples

Testing for the support of a given CSS property

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

Testing for the support of a given CSS property or a prefixed version

@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 */ } 

Testing for the non-support of a specific CSS property

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

Testing for the support of custom properties

@supports (--foo: green) {   body {     color: var(--varName);   } } 

Testing for the support of a selector

The CSS Conditional Rules Level 4 specification adds the ability to test for support of a selector—for example :is().

/* 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 */ }  @supports not selector(:is(a, b)) {   /* Fallback for when :is() is unsupported */   ul > li,   ol > li {     … /* The above expanded for browsers which don't support :is(…) */   } }  /* 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 */   } } 

Specifications

Specification
CSS Conditional Rules Module Level 4 # at-supports-ext
CSS Conditional Rules Module Level 3 # at-supports

See also

Using feature queries The CSSOM class CSSSupportsRule, and the CSS.supports() method that allows the same check to be performed via JavaScript. Select your preferred language English (US)EspañolFrançais日本語한국어PolskiРусский中文 (简体) Change language

No Items Found.

Add Comment
Type in a Nick Name here
 
Other Categories in CSS
css
Search CSS
Search CSS by entering your search text above.
Welcome

This is my test area for webdev. I keep a collection of code here, mostly for my reference. Also if i find a good link, i usually add it here and then forget about it. more...

Subscribe to weekly updates about things i have added to the site or thought interesting during the last week.

You could also follow me on twitter or not... does anyone even use twitter anymore?

If you found something useful or like my work, you can buy me a coffee here. Mmm Coffee. ☕

❤️👩‍💻🎮

🪦 2000 - 16 Oct 2022 - Boots
Random Quote

"Olivia, my eldest daughter, caught measles when she was seven years old. As the illness took its usual course I can remember reading to her often in bed and not feeling particularly alarmed about it. Then one morning, when she was well on the road to recovery, I was sitting on her bed showing her how to fashion little animals out of coloured pipe-cleaners, and when it came to her turn to make one herself, I noticed that her fingers and her mind were not working together and she couldn’t do anything. 'Are you feeling all right?' I asked her. 'I feel all sleepy,' she said. In an hour, she was unconscious. In twelve hours she was dead. The measles had turned into a terrible thing called measles encephalitis and there was nothing the doctors could do to save her. That was...in 1962, but even now, if a child with measles happens to develop the same deadly reaction from measles as Olivia did, there would still be nothing the doctors could do to help her. On the other hand, there is today something that parents can do to make sure that this sort of tragedy does not happen to a child of theirs. They can insist that their child is immunised against measles. ...I dedicated two of my books to Olivia, the first was ‘James and the Giant Peach’. That was when she was still alive. The second was ‘The BFG’, dedicated to her memory after she had died from measles. You will see her name at the beginning of each of these books. And I know how happy she would be if only she could know that her death had helped to save a good deal of illness and death among other children."

I just checked google books for BFG, and the dedication is there. 

https://www.google.com.au/books/edition/_/quybcXrFhCIC?hl=en&gbpv=1 


Roald Dahl, 1986
Random CSS Property

size-adjust

The size-adjust CSS descriptor defines a multiplier for glyph outlines and metrics associated with this font. This makes it easier to harmonize the designs of various fonts when rendered at the same font size.
size-adjust (@font-face) css reference