在CSS中将@supports与@media查询混合

vru*_*gel 6 css progressive-enhancement css3 media-queries

我是第一次使用CSS网格构建网站。由于并非所有浏览器都支持此功能,因此我设置了一组后备样式,并有条件地使用@supports not (display:grid)。但我也想将其用作移动样式表,并且仅在较大的屏幕上使用CSS网格-这可以通过简单的媒体查询来实现@media screen and (max-width:700px)。现在的问题是-如果其中任何一个都成立,也就是说,如果浏览器不支持CSS网格或者浏览器窗口的宽度不超过700像素,我想使用我的后备样式表。

所以我的问题是-我怎么问的浏览器@supports@media在同一时间?嵌套它们是行不通的,因为这本质上是在要求它们都为真,并且仅将整个样式表复制粘贴@supports到中,这是错误的@media

基本上,我想要这样的东西:

(@supports not (display:grid)) or (@media screen and (max-width:700px)){
    /*my stylesheet*/
}
Run Code Online (Sandbox Code Playgroud)

Bol*_*ock 8

没有一种方法可以通过OR逻辑将两个不同的条件规则组合为一个规则(如您所述,AND逻辑可以通过嵌套来完成,即使严格地说它们仍然是两个单独的规则)。除非您的管道能够自动为您跨两个独立的条件规则复制CSS,否则您将必须手动执行。

如果可能,请考虑从渐进增强的角度而不是从优雅降级的角度来解决此问题。也就是说,与其将后备样式应用于不支持网格或显示在较小屏幕上的浏览器,而不是将网格样式应用于支持网格显示在较大屏幕上的浏览器,这就是您提到的嵌套规则的地方感:

@supports (display: grid) {
    /* Or screen and (min-width: 701px),
       or not screen and (max-width: 700px),
       depending on your needs and preferences */
    @media screen and (min-width: 700px) {
        /* Grid styles */
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您不喜欢额外的缩进,可以稍微减少一点,或者根本不缩进;)

  • @安东尼:是的,是的。还需要指出的是,当浏览器在加载时与媒体查询不匹配时,media属性不会阻止样式表的加载,因为它必须考虑导致其与样式匹配的更改(可能)。事后查询,因此也不会节省带宽。 (3认同)
  • 请注意任何读者(像我一样)最初对*“没有办法将两个不同的条件 at 规则与 OR 逻辑组合成一个”的说法进行双重考虑* - 是的,正如您以前可能看到了,你*可以*在`@media`规则中*结合*两个不同的媒体查询,用逗号分隔它们。但是不幸的是,您*不能* 做的是使用逗号分隔两个不同的@-rules,例如`@media` 和`@supports`。 (2认同)