是否可以对 @media 规则进行 CSS @supports 检查?

Posted

技术标签:

【中文标题】是否可以对 @media 规则进行 CSS @supports 检查?【英文标题】:Is it possible to do a CSS @supports check on a @media rule? 【发布时间】:2017-10-29 20:45:35 【问题描述】:

@support 规则允许对 CSS 属性进行特性查询。我想知道是否可以对特定的@media 规则进行功能检查?

例如,我想知道浏览器是否支持@media 指针或任意指针条件:

@supports @media (pointer:fine) 

或者

@supports @media (pointer) 

这似乎不起作用。它应该工作吗?

编辑:这不是引用问题的重复。也许我应该澄清这个问题以解释为什么这是一个不同的问题,所以这里是:

我不想将@supports 嵌套在@media 中,反之亦然。我想检测是否支持@media 查询本身,特别是指针的@media 规则。这与在媒体查询中嵌套随机支持查询完全不同。

【问题讨论】:

tl;dr 您需要将媒体查询嵌套在 @supports 括号内。 我不确定,但您是否尝试过嵌套 codepen.io/anon/pen/mmYNgp 之类的内容? @tylerh:问题是如何? @MichaelCoker:谢谢,我为你的起点创建了一个fork:codepen.io/fchristant/pen/BRgoKN它基本上证明了这种方法行不通。它不会检测到嵌套在@media 中的规则,但在没有嵌套的情况下,它本身就可以工作。所以我的问题仍然存在。 【参考方案1】:

这似乎不起作用。它应该工作吗?

没有; @supports 仅支持属性声明,不支持规则或 CSS 中的任何其他语法结构。无论如何,您都不想检查对@media 规则的支持;您正在尝试检查对特定媒体功能的支持。但@supports 也不支持,即使媒体功能与属性声明共享相同的声明语法。

为此,您根本不需要@supports 规则。要检查浏览器是否支持某个媒体功能,只需编写一个@media 规则,其中包含一个媒体查询列表,其中包含媒体功能及其否定:

@media not all and (pointer), (pointer) 
  p  color: green; 
<p>If this text is green, your browser supports the <code>pointer</code> media feature.

(请注意,媒体查询 4 ​​从 MQ3 中删除了not 需要媒体类型的限制,因此否定确实应该是not (pointer),但no browser supports this yet 和媒体类型仍然是必需的。)

无法识别pointer 媒体功能的浏览器会将@media 规则解释为@media not all, not all(尽管not all and (pointer) 媒体查询中有not)。见section 3.2 of the spec,上面写着

未知的 ,或不允许的 ,会导致值“未知”。值为“unknown”的 必须替换为 not all。

如果您需要在浏览器支持媒体功能时应用 CSS,这些错误处理规则意味着您需要利用级联(如果您不知道提前原始值,你可能会卡住):

p  color: red; 

@media not all and (pointer), (pointer) 
  p  color: currentcolor; 
<p>If this text is red, your browser does not support the <code>pointer</code> media feature.

【讨论】:

谢谢,这正是我想要的!为了完整起见,我确实有一个后续问题:您的示例中的语法是什么来做相反的事情?检查浏览器是否不支持指针? @Ferdy:在这种情况下,级联将成为您的朋友。我已经用一个例子更新了我的答案。 我看到它实时发生,你很快。谢谢! 这简直太美了!为了完成指针值的答案:@media not all and ( pointer: fine ), ( pointer: fine )

以上是关于是否可以对 @media 规则进行 CSS @supports 检查?的主要内容,如果未能解决你的问题,请参考以下文章

Chrome 是如何对 CSS 规则进行分类的? [复制]

pg 函数匹配规则

从 Firefox Developer Edition Inspector 工具编辑 CSS

从 Javascript 更改 CSS 规则集

fiddler功能介绍

是否可以找到导致规则在 Chrome 检查器中显示为灰色值的父 CSS?