@supports
åºçº¿
广æ³å¯ç¨
èª 2015å¹´9æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
@supports CSS at è§åå¯ä»¥æå®ä¾èµäºæµè§å¨ä¸çä¸ä¸ªæå¤ä¸ªç¹å®ç CSS åè½çæ¯æå£°æãè¿è¢«ç§°ä¸ºç¹æ§æ¥è¯¢ã该è§åå¯ä»¥æ¾å¨ä»£ç çé¡¶å±ï¼ä¹å¯ä»¥åµå¥å¨ä»»ä½å
¶ä»æ¡ä»¶ç»è§åä¸ã
@supports (display: grid) {
div {
display: grid;
}
}
@supports not (display: grid) {
div {
float: right;
}
}
å¨ JavaScript ä¸ï¼å¯ä»¥éè¿ CSS å¯¹è±¡æ¨¡åæ¥å£ CSSSupportsRule æ¥è®¿é® @supportsã
è¯æ³
@supports at-rule ç±ä¸ç»æ ·å¼å£°æå䏿¡æ¯ææ¡ä»¶ææãæ¯ææ¡ä»¶ç±ä¸æ¡æå¤æ¡ä½¿ç¨ é»è¾ä¸ï¼andï¼ãé»è¾æï¼orï¼ãé»è¾éï¼notï¼ç»åçåç§° - å¼å¯¹ï¼name-value pairï¼ç»æãå¯ä»¥ä½¿ç¨åæ¬å·è°æ´æä½ç¬¦çä¼å
级ã
声æè¯æ³
æåºæ¬çæ¯ææ¡ä»¶å°±æ¯ CSS 声æï¼ä¹å°±æ¯ä¸ä¸ª CSS 屿§åè·ä¸ä¸ªå¼ï¼ä¸é´ç¨åå·åå¼ã妿 transform-origin çå®ç°è¯æ³è®¤ä¸º 5% 5% æ¯ææçå¼ï¼åä¸é¢ç表达å¼ä¼è¿å trueã
@supports (transform-origin: 5% 5%) {
}
彿°è¯æ³
第äºç§åºæ¬æ¯ææ¡ä»¶æ¯æ¯æå½æ°ï¼å ä¹æææµè§å¨é½æ¯æè¿ç§è¯æ³ï¼ä½å½æ°æ¬èº«ä»å¨æ ååè¿ç¨ä¸ã
selector()
æµè¯æµè§å¨æ¯å¦æ¯æç»è¿æµè¯çéæ©å¨è¯æ³ã妿æµè§å¨æ¯æåç»åå¨ï¼å以ä¸ç¤ºä¾è¿å trueï¼
@supports selector(A > B) {
}
not æä½ç¬¦
å° not æä½ç¬¦æ¾å¨ä»»ä½è¡¨è¾¾å¼ä¹åå°±è½å¦å®ä¸æ¡è¡¨è¾¾å¼ã妿 transform-origin çå®ç°è¯æ³è®¤ä¸º 10em 10em 10em æ¯æ æçï¼åä¸é¢ç表达å¼ä¼è¿å trueã
@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 æä½ç¬¦ç¨æ¥å°ä¸¤ä¸ªåå§ç表达å¼åé»è¾ä¸åçæä¸ä¸ªæ°ç表达å¼ï¼å¦æä¸¤ä¸ªåå§è¡¨è¾¾å¼çå¼é½ä¸ºçï¼åçæç表达å¼ä¹ä¸ºçãå¨ä¸ä¾ä¸ï¼å½ä¸ä»
å½ä¸¤ä¸ªåå§è¡¨è¾¾å¼åæ¶ä¸ºçæ¶ï¼æ´ä¸ªè¡¨è¾¾å¼æä¸ºçï¼
@supports (display: table-cell) and (display: list-item) {
}
å¯ä»¥å°å¤ä¸ªååè¯å¹¶ç½®èä¸éè¦æ´å¤çæ¬å·ã以ä¸ä¸¤è 齿¯çæçï¼
@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 æä½ç¬¦
or æä½ç¬¦ç¨æ¥å°ä¸¤ä¸ªåå§ç表达å¼åé»è¾æåçæä¸ä¸ªæ°ç表达å¼ï¼å¦æä¸¤ä¸ªåå§è¡¨è¾¾å¼ç弿ä¸ä¸ªæè
é½ä¸ºçï¼åçæç表达å¼ä¹ä¸ºçãå¨ä¸ä¾ä¸ï¼å½ä¸¤ä¸ªåå§è¡¨è¾¾å¼ä¸è³å°æä¸ä¸ªä¸ºçæ¶ï¼æ´ä¸ªè¡¨è¾¾å¼æä¸ºçï¼
@supports (transform-style: preserve) or (-moz-transform-style: preserve) {
}
å¯ä»¥å°å¤ä¸ªæåè¯å¹¶ç½®èä¸éè¦æ´å¤çæ¬å·ã以ä¸ä¸¤è 齿¯çæçï¼
@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)
)
) {
}
夿³¨ï¼å¨ä½¿ç¨ and å or æä½ç¬¦æ¶ï¼å¦ææ¯ä¸ºäºå®ä¹å¤ä¸ªè¡¨è¾¾å¼çæ§è¡é¡ºåºï¼åå¿
须使ç¨åæ¬å·ã妿ä¸è¿æ ·åçè¯ï¼è¯¥æ¡ä»¶å°±æ¯æ æçï¼ä¼å¯¼è´æ´ä¸ª at-rule 失æã
å½¢å¼åè¯æ³
@supports =
@supports <supports-condition> { <rule-list> }
<supports-condition> =
not <supports-in-parens> |
<supports-in-parens> [ and <supports-in-parens> ]* |
<supports-in-parens> [ or <supports-in-parens> ]*
<supports-in-parens> =
( <supports-condition> ) |
<supports-feature> |
<general-enclosed>
<supports-feature> =
<supports-selector-fn> |
<supports-font-tech-fn> |
<supports-font-format-fn> |
<supports-at-rule-fn> |
<supports-named-feature-fn> |
<supports-env-fn> |
<supports-decl>
<general-enclosed> =
[ <function-token> <any-value>? ) ] |
[ ( <any-value>? ) ]
<supports-selector-fn> =
selector( <complex-selector> )
<supports-font-tech-fn> =
font-tech( <font-tech> )
<supports-font-format-fn> =
font-format( <font-format> )
<supports-at-rule-fn> =
at-rule( <at-keyword-token> )
<supports-named-feature-fn> =
named-feature( <ident> )
<supports-env-fn> =
env( <ident> )
<supports-decl> =
( [ <declaration> | <supports-condition-name> ] )
<complex-selector> =
<complex-selector-unit> [ <combinator>? <complex-selector-unit> ]*
<font-tech> =
<font-features-tech> |
<color-font-tech> |
variations |
palettes |
incremental
<font-format> =
<string> |
collection |
embedded-opentype |
opentype |
svg |
truetype |
woff |
woff2
<complex-selector-unit> =
[ <compound-selector>? <pseudo-compound-selector>* ]!
<combinator> =
'>' |
'+' |
'~' |
[ '|' '|' ] |
[ / <wq-name> / ]
<font-features-tech> =
features-opentype |
features-aat |
features-graphite
<color-font-tech> =
color-COLRv0 |
color-COLRv1 |
color-SVG |
color-sbix |
color-CBDT
<compound-selector> =
[ <type-selector>? <subclass-selector>* ]!
<pseudo-compound-selector> =
<pseudo-element-selector> <pseudo-class-selector>*
<wq-name> =
<ns-prefix>? <ident-token>
<type-selector> =
<wq-name> |
<ns-prefix>? '*'
<subclass-selector> =
<id-selector> |
<class-selector> |
<attribute-selector> |
<pseudo-class-selector>
<pseudo-element-selector> =
: <pseudo-class-selector> |
<legacy-pseudo-element-selector>
<pseudo-class-selector> =
: <ident-token> |
: <function-token> <any-value> )
<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>? ']'
<legacy-pseudo-element-selector> =
: [ before | after | first-line | first-letter ]
<attr-matcher> =
[ '~' | '|' | '^' | '$' | '*' ]? '='
<attr-modifier> =
i |
s
示ä¾
>æ£æµæ¯å¦æ¯ææå®ç CSS 屿§
@supports (animation-name: test) {
/* å¦ææ¯æä¸å¸¦åç¼ç animation-nameï¼åä¸é¢æå®ç CSS ä¼çæ */
@keyframes {
/* @supports æ¯ä¸ä¸ª CSS æ¡ä»¶ç» at-ruleï¼å®å¯ä»¥å
å«å
¶ä»ç¸å
³ç at-rules */
}
}
æ£æµæ¯å¦æ¯ææå®ç CSS 屿§æè å ¶å¸¦åç¼çæ¬
@supports (
(perspective: 10px) or (-moz-perspective: 10px) or (-webkit-perspective: 10px)
or (-ms-perspective: 10px) or (-o-perspective: 10px)
) {
/* å¦ææ¯æä¸å¸¦åç¼ä»¥å带åç¼ç perspective 屿§ï¼åä¸é¢æå®ç CSS ä¼çæ */
}
æ£æµæ¯å¦ä¸æ¯ææå®ç CSS 屿§
@supports not ((text-align-last: justify) or (-moz-text-align-last: justify)) {
/* è¿éç CSS 代ç ç¨æ¥æ¨¡æ text-align-last:justify */
}
æµè¯æ¯å¦æ¯æèªå®ä¹å±æ§
@supports (--foo: green) {
body {
color: var(--varName);
}
}
æµè¯æ¯å¦æ¯æéæ©å¨ (eg. :is())
å®éªæ§: è¿æ¯ä¸é¡¹å®éªæ§ææ¯
å¨å°å
¶ç¨äºç产ä¹åï¼è¯·ä»ç»æ£æ¥æµè§å¨å
¼å®¹æ§è¡¨æ ¼ã
/* è¿æ¡ CSS è§åå¨ä¸æ¯æ is:() çæµè§å¨ä¸æ æ */
:is(ul, ol) > li {
/* æ¯æ :is(...) 鿩卿¶ï¼è¿éç CSS çæ */
}
@supports not selector(:is(a, b)) {
/* 䏿¯æ :is() æ¶çå¤éæ¹æ¡ */
ul > li,
ol > li {
/* 以ä¸ç»ä¸æ¯æ :is(...) çæµè§å¨å±å¼äº CSS éæ©å¨è§å */
}
}
@supports selector(:nth-child(1n of a, b)) {
/* è¿æ¡è§åéè¦å
åµå¨ @supports åå
ã
å¦å该è§å卿¯æ :nth-child(â¦) ä½ä¸æ¯æå
¶å
ç `of` åæ°çæµè§å¨ä¸ï¼
åªæé¨åçæ */
:is(:nth-child(1n of ul, ol) a, details > summary) {
/* å½:is(...) éæ©å¨ä»¥å :nth-child(â¦) ç `of` 忰齿¯ææ¶ï¼
è¿éç CSS ä¼çæ */
}
}
è§è
| è§è |
|---|
| 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> |
æµè§å¨å ¼å®¹æ§
åè§
- 使ç¨ç¹æ§æ¥è¯¢
- The CSSOM class
CSSSupportsRule, and theCSS.supports()method that allows the same check to be performed via JavaScript.