特性查询
在 2015 到 2016 年之间,CSS 获得了在特定情况下(即浏览器支持的 CSSs 属性-值的组合下)应用 CSS 块的能力。这被称为特性查询。
他们在结构上与媒体查询非常相似。考虑这样一种情况:如果 color 是受支持的属性,那么就对元素应用 color。它是这样的:
1 | @supports (color:black) { |
实际上,它意味着“如果理解并能处理color: black
这样的属性-值组合,就应用这些样式,否则,就跳过这些样式”。在不理解@supports
的用户代理(浏览器等)中,整个 CSS 规则块被跳过。
特性查询是渐进增强样式的完美方法。例如,假设想在现有的浮动和内联块布局中添加一些网格布局,可以保留旧的布局方案,然后在样式表中包含这样的块:
1 | @supports (display: grid) { |
这样样式将应用于支持网格显示的浏览器中,覆盖旧的页面布局样式,然后应用所需的样式使其在基于网格的未来中生效。太老的浏览器无法支持网格布局,也很可能因太老而无法支持@supports
,所以他们完全的跳过整个块,就好像从来没出现过一样。
特性查询 可以彼此 嵌入,也可以嵌入到媒体查询中,反之亦然。
编写基于弹性盒子布局的屏幕、打印的样式,将媒体查询包裹在@support (display: flex)
块中:
1 | @supports (display: flex) { |
相反,可以在各种响应设计的媒体查询块中,添加@supports ()
块:
1 | @media screen and (max-width: 30em) { |
如何组织这些区块完全取决自己。
与媒体查询一样,特性查询也允许有逻辑操作符。假设想要在一个用户代理同时支持网格布局和 CSS 形状(shapes
)时应用样式,应该这样的:
1 | @supports (display: grid) and (shape-outside: circle()) { |
这基本上等价于以下写法:
1 | @supports (display: flex) { |
除了and
操作符外,还有更多可用的操作。CSS 形状是个很好的例子去说明为什么or
是 有用的。因为在很长一段时间 webkit
浏览器只支持通过 带厂商前缀属性的 CSS 形状。所以,如果用形状,可以这样使用特性查询:
1 | @supports (shape-outside: circle()) or (-webkit-shape-outside: circle()) { |
你仍然需要确保同时使用带前缀和不带 前缀的形状属性,这将支持 webkit 发行版本,并向后兼容,同时也支持其他支持 形状的浏览器,但不是通过带前缀的属性。
特性查询也可以使用not
。例如,在不支持网格布局时应用以下样式:
1 | @supports not (display: grid) { |