支持 | @supports

@supports

@supportsCSSat-rule关联了一组嵌套的CSS语句,这些语句被放置在一个CSS区块中,该区块以大括号分割, 还有一个由多个CSS声明检测组成的条件,它是一个键值组合, 由逻辑与,逻辑或,逻辑非组合而成. 这样的条件语句称为支持条件.

@supports (display: flex) { div { display: flex; } }

@supports not (display: flex) { div { float: right; } }

在JavaScript中,@supports可以通过CSS对象模型接口进行访问CSSSupportsRule

语法

一个支持条件是由一个或者多个由不同的逻辑操作符组成的表达式声明组合而成的.使用小括号可以调整这些表达式之间的运算优先级.

声明语法

最简单的表达式就是CSS声明,也就是一个CSS属性后跟一个值,中间用冒号分开.如果transform-origin的实现语法认为5% 5%是有效的,则下面的表达式会返回true.

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

not操作符

not操作符可以放在任何表达式的前面来产生一个新的表达式,新的表达式为原表达式的值的否定.如果transform-origin的实现语法不认为10em 10em 10em是有效的.则下面的表达式会返回true.

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

和其他操作符一样,not操作符可以应用在任意复杂度的表达式上.下面的几个例子中都是合法的表达式:

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

注意:如果not操作符位于表达式的最外层,则没有必要使用小括号将它括起来.但如果要将该表达式与其他表达式连接起来使用,比如andor,则需要外面的小括号.

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)))

: 在使用andor操作符时,如果是为了定义多个表达式的执行顺序,则必须使用小括号.如果不这样做的话,该条件就是无效的,会导致整个at-rule失效.

正式语法

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

示例

检测是否支持指定的CSS属性

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

检测是否支持指定的CSS属性或者其带前缀版本

@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属性

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

规范

SpecificationStatusComment
CSS Conditional Rules Module Level 3The definition of '@supports' in that specification.Candidate RecommendationInitial definition.

浏览器兼容性

FeatureChromeEdgeFirefox (Gecko)Internet ExplorerOperaSafari
Basic support28.020 (12.10240)22 (22) 1No support12.19

FeatureAndroidAndroid WebviewEdgeFirefox Mobile (Gecko)IE MobileOpera MobileSafari MobileChrome for Android
Basic supportNo support?(Yes)22.0 (22) 1No support12.1928.0