对CSS @keyframes规则进行分组

时间:2014-04-01 08:26:32

标签: css css3 css-selectors css-animations

我完全理解您无法对动画关键帧选择器进行分组,例如

@keyframes,
@-moz-keyframes,
@-webkit-keyframes { /*do something*/ }

你绝对必须

@keyframes { /*do something*/ }
@-moz-keyframes { /*do something*/ }
@-webkit-keyframes { /*do something*/ }

我知道有预处理器可以为我做这一切。但我对为什么背后的原因更感兴趣?

我的google-fu让我失望了。它似乎总是指向一个stackoverflow页面,告诉别人他们“不能”做到这一点,他们必须将它们全部分开,或者告诉人们关于预处理器 - 或者 - 我被发送到那个可怕的about.com并阅读像

在这种情况下,显然不是这样。如果有人可以指导我阅读文章,或者向我解释为什么它无法分组,那将是最有帮助的。

2 个答案:

答案 0 :(得分:6)

请记住,at-rules和selectors是完全不同的东西。

at {规则}包含在this section of CSS2.1 spec中,该规则表明,at-rule只包含一个at-keyword,后跟一些语句(无论是以分号结尾的语句还是块)。就CSS解析器而言,你拥有的是一组三个独立的at-rules,每个供应商有一个前缀,标准有一个无前缀的规则。

at-rules的更合适的对应方式是规则集或样式规则,描述为here。规则集由选择器和声明块(包含样式声明)组成。这类似于如上所述的规则的内容。这也意味着选择器只是规则集的一部分

某些规则允许在其前奏中使用以逗号分隔的值,例如@media

@media screen, projection {
    /* Styles for both screen and projection media */
}

但是,不是将at-rules整体分组,而是在规则开头的at-keyword之后的值内进行分组。

@media规则可以扩展为两个单独的规则,如下所示:

@media screen {
    /* Styles for screen media */
}

@media projection {
    /* Styles for projection media */
}

请注意,每个规则都有自己的@media at-keyword。

同样,当您将多个选择器组合到一个规则中时,您拥有的是一个样式规则。分组的部分是选择器;以下声明块中的所有内容都适用于组中列出的所有选择器:

.foo, .bar {
    /* Styles that apply to both .foo and .bar elements */
}

当你扩展它时,它变成两个规则集:

.foo {
    /* Styles that apply to .foo elements */
}

.bar {
    /* Styles that apply to .bar elements */
}

答案 1 :(得分:2)

因为

  

当用户代理无法解析选择器时(即,它不是有效的CSS 2.1),它必须忽略选择器和以下声明块(如果有的话)。

发现于http://www.w3.org/TR/CSS21/syndata.html#rule-sets


因此,每个供应商前缀使整个规则对所有其他供应商都不可解析。