这是一个实验中的功能
此功能某些浏览器尚在开发中,请参考浏览器兼容性表格以得到在不同浏览器中适合使用的前缀。由于该功能对应的标准文档可能被重新修订,所以在未来版本的浏览器中该功能的语法和行为可能随之改变。
概述
@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
操作符位于表达式的最外层,则没有必要使用小括号将它括起来.但如果要将该表达式与其他表达式连接起来使用,比如and
和or
,则需要外面的小括号.
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 )))
注意: 在使用and
和or操作符
时,如果是为了定义多个表达式的执行顺序,则必须使用小括号.如果不这样做的话,该条件就是无效的,会导致整个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 |
浏览器兼容性
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才可用.
相关链接
- The CSSOM class
CSSSupportsRule
, and thewindow.supportCSS
method that allows to perform the same check via JavaScript.