MDN - CSS @supports 用法

1,449 阅读4分钟
原文链接: developer.mozilla.org
这是一个实验中的功能
此功能某些浏览器尚在开发中,请参考浏览器兼容性表格以得到在不同浏览器中适合使用的前缀。由于该功能对应的标准文档可能被重新修订,所以在未来版本的浏览器中该功能的语法和行为可能随之改变。

概述

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

该语句可以用来做特性查询.

@supports at-rule 不仅可以使用在CSS中的嵌套顶部语句中,也可以嵌在任意的 CSS conditional-group at-rule语句内部.

语法

@supports <supports_condition> {
  /* specific rules */
}

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

声明语法

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

( transform-origin: 5% 5% )

一个CSS声明总被包含在一组小括号中.

not操作符

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

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

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

not( not( transform-origin: 2px ) )
(display: flexbox) and ( not (display: inline-grid) )
注意: 如果not操作符位于表达式的最外层,则没有必要使用小括号将它括起来.但如果要将该表达式与其他表达式连接起来使用,比如andor,则需要外面的小括号.

and操作符

and操作符用来将两个原始的表达式做逻辑与后生成一个新的表达式, 如果两个原始表达式的值都为真,则生成的表达式也为真.在下例中,当且仅当两个原始表达式同时为真时,整个表达式才为真:

(display: table-cell) and (display: list-item)

几个逻辑与可以并列成为一个表达式,而不需要使用更多的括号:

(display: table-cell) and (display: list-item) and (display:run-in)

等价于:

(display: table-cell) and ((display: list-item) and (display:run-in))

or操作符

or操作符用来将两个原始的表达式做逻辑或后生成一个新的表达式, 如果两个原始表达式的值有一个为真或者都为真,则生成的表达式也为真.在下例中,当两个原始表达式中至少有一个为真时,整个表达式才为真:

( transform-style: preserve ) or ( -moz-transform-style: preserve )

几个逻辑或可以并列成为一个表达式,而不需要使用更多的括号:

( transform-style: preserve ) or ( -moz-transform-style: preserve ) or 
( -o-transform-style: preserve ) or ( -webkit-transform-style: preserve  )

等价于:

( 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失效.

例子

检测是否支持指定的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 */
}

规范

Specification Status Comment
CSS Conditional Rules Module Level 3
@supports
Candidate Recommendation  

浏览器兼容性

We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help!
Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support 未实现 17 (17)[*] 未实现 未实现 未实现
Feature Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support 未实现 17.0 (17)[*] 未实现 未实现 未实现

[*] 号表示该at-rule默认为禁用状态, 只有当用户在about:config中将layout.css.supports-rule.enable设置为true时,@supports at-rule才可用.

相关链接