【问题标题】:What is the most practical way to check for "@supports" support using only CSS?仅使用 CSS 检查“@supports”支持的最实用方法是什么?
【发布时间】:2013-05-11 03:46:11
【问题描述】:

在昨天 Eric Bidelman 的 Google I/O presentation 谈到了 @supports 的主题之后,我想我会开始在 Chrome Canary 中使用它。然而,它提出了一个明显的问题:

检查浏览器是否仅使用 CSS 支持 @supports 的最佳方法是什么?


我目前正在通过简单地检查是否支持display: block 来玩弄它。显然,这种方法有效,但我不确定这是否是最实用的方法:

body { background:#fff; font-family:Arial; }
body:after { content:'Ek! Your browser does not support @supports'; }

@supports (display:block) {
    body { background:#5ae; }
    body:after { color:#fff; content:'Your browser supports @supports, yay!'; }
}

这是一个JSFiddle 的实际演示。

这些尝试不起作用(至少在 Chrome Canary 中):

@supports (@supports) { ... }
@supports () { ... }
@supports { ... }

【问题讨论】:

    标签: css


    【解决方案1】:

    @supports 目前只测试属性/值组合,没有别的。您的其他选项不起作用,因为它们都无效(包括最后一个只有 at 关键字后跟左大括号的选项!)。属性/值对要求由 @supports 的语法规定,您可以在 spec 中找到该语法。

    简单地测试一个你知道的属性/值对,无论@supports 是否实现,它都能保证在所有用户代理中工作。这(在某种程度上)消除了您遇到实现@supports 但不是该属性/值组合的用户代理的可能性,而是专注于它对@supports 的支持。

    您给定的display: block 示例就足够了。您使用级联来检查浏览器是否不 实现@supports 通过覆盖@supports 规则中支持它的浏览器的声明也是可以接受的(被无论如何,唯一明显的方法)。

    【讨论】:

    • 会不会出现display: block 不 包含在 CSS 实现中的情况?如果是这样,针对永远不会成为 CSS 一部分的东西进行测试是否更合乎逻辑?类似@supports not (_:_) {}?
    • @JamesDonnelly @supports not (_:_) {} == @supports not (whateverbutthisdoesntmakeanysenseproprty:5px) {} 因此,如果属性值对无效或属性根本无效,浏览器将假定它尚不支持
    • @James Donnelly:实际上,不——我宁愿担心浏览器错误地实现@supports。但如果你愿意,你也可以这样做。
    • @Mr.外星人:是的。当然,您必须确保它不会违反@supports 规则。
    • 伙计,我需要获得一个带有 K 的 3 位数代表才能让我的答案被选为正确;)
    【解决方案2】:

    这可能行不通,您无法检查 @supports 是否仅由 CSS 支持,您的示例在这里完全没问题,但是这里没有直接方法的选项,例如您正在使用这个:

    @supports (@supports) {
       /* Styles */
    }
    

    现在这实际上不起作用,可能适用于Chrome Canary,这很好@supports 但是当它继续检查括号之间的内容时,它失败了,为什么?它期望括号内有一个 CSS property: value 对,而不是任何 @ 规则,它实际上检查任何属性是否有效,即使你用 @supports (@font-face) 替换它也不起作用,再往下,我会用demo给你讲解

    当你使用@supports时,它带有一个名为not的关键字,用于检查浏览器是否支持特定样式,如果支持,则应用,否则应用其他...

    例子

    @supports (-webkit-border-radius: 6px) {
        div:nth-of-type(1) {
            color: red;
        }
    }
    
    @supports not (-moz-border-radius: 6px) {
        div:nth-of-type(2) {
            color: blue;
        }
    }
    

    Demo(注意:目前仅适用于 chrome canary)

    解释:

    @supports (-webkit-border-radius: 6px) 将在 Chrome Canary 中检查是否支持名为 -webkit-border-radius 的属性,如果支持则继续,将第一个 div 的颜色更改为 red,它确实支持,因为 Chrome Canary 确实支持 @ 987654337@ 属性,而第二个将失败,因为 Chrome 不支持 -moz 前缀属性,它会涂成蓝色,因为我在这里使用not

    @supports not (-moz-border-radius: 6px)
            ---^---
    

    希望常见问题解答

    1) 为什么浏览器中没有应用样式?

    那是因为您的浏览器还不支持@supports,因此不会应用任何浏览器,因为浏览器只会忽略@supports 规则


    来自W3C

    “@supports”规则是一个条件组规则,其条件测试 用户代理是否支持 CSS 属性:值对

    【讨论】:

    • 该演示实际上并没有解释为什么@supports (@font-face) 不起作用......它只是解释了如何使用 @supports,正如OP所提到的那样与问题无关。
    • @BoltClock @supports but when it goes ahead to check between parenthesis, it fails, why? It expects a CSS property: value pair inside the parenthesis and not any @ rule, it actually checks whether any property is valid or not, even if you replace that with @supports (@font-face) won't work@supports 仅适用于属性值对时如何为他提供演示?
    • 您正在展示@supports 和@supports not 之间的区别——这与@supports (@font-face) 有什么关系?虽然我猜这是由常见问题解答位回答的,但您的回答似乎很混乱。
    • @BoltClock 我向他展示了它如何仅适用于属性而不适用于 @ 规则的演示,然后我向他解释了如何使用具有 property:value 组合的有效参数的 @supports ,当然@font-face 与演示无关,因为它只是不工作,所以我向他解释了它是如何以真实方式工作的,所以他无法检查他尝试的方式,正如他的问题@ 987654353@ 的目的是弄清楚它是如何工作的,我创建了一个演示来展示这一点
    • @BoltClock 我想这就是让你感到困惑的原因呵呵I'll explain you with a demo
    【解决方案3】:

    David walsh 博客有一篇关于@supports Link 的精彩教程。

    确实,您的 JsFiddle 在 Chrome Canary 中可以完美运行。

    @supports 的有效语法是,

    @supports(prop:value) {
        /* more styles */
    }
    
    /* Negation */
    @supports not(prop:value) {
        /* more styles */
    }
    
    /* `or` keyword*/
    @supports(prop:value) or
             (prop:value){
        /* more styles */
    }
    
    /* `and` keyword*/
    @supports(prop:value) and
             (prop:value){
        /* more styles */
    }
    
    /* `or`, `and` keywords*/
    @supports(prop:value) or
             (prop:value) and 
              (prop:value) {
        /* more styles */
    }
    

    【讨论】:

    • 他的问题是如何检查 @supports 是否支持仅使用 CSS 而不是如何检查支持哪些属性:)
    • 是的,最近想通了
    • @NobalMohan 可以检查伪吗?喜欢@support @supports .element(:focus-within) { ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 2013-05-02
    • 2011-10-09
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多