Sass Keyframes 动画混合生成无效的 CSS

Posted

技术标签:

【中文标题】Sass Keyframes 动画混合生成无效的 CSS【英文标题】:Sass Keyframes animation mixin generating invalid CSS 【发布时间】:2015-02-10 21:14:14 【问题描述】:

我有以下关键帧 mixin,但似乎生成了无效的 CSS:

@mixin keyframes($animationName)

    @-webkit-keyframes $animationName 
        @content;
    
    @-moz-keyframes $animationName 
        @content;
    
    @-o-keyframes $animationName 
        @content;
    
    @keyframes $animationName 
        @content;
    


@include keyframes(icon-one) 
        0% 
          opacity: 1;
        
        33% 
          opacity: 0;
        
        66% 
          opacity: 0;
        
        100% 
          opacity: 0;
        

这是输出:

@-webkit-keyframes $animationName 
  0% 
    opacity: 1;
  
  33% 
    opacity: 0;
  
  66% 
    opacity: 0;
  
  100% 
    opacity: 0;
  

@-moz-keyframes $animationName 
  0% 
    opacity: 1;
  
  33% 
    opacity: 0;
  
  66% 
    opacity: 0;
  
  100% 
    opacity: 0;
  

@-o-keyframes $animationName 
  0% 
    opacity: 1;
  
  33% 
    opacity: 0;
  
  66% 
    opacity: 0;
  
  100% 
    opacity: 0;
  

@keyframes $animationName 
  0% 
    opacity: 1;
  
  33% 
    opacity: 0;
  
  66% 
    opacity: 0;
  
  100% 
    opacity: 0;
  

关键帧名称不是icon-one,而是写出$animationName

【问题讨论】:

你能把编译好的 CSS 贴出来吗? 对不起,我认为 sass 更干净,我已经着手删除 sass 并添加了纯 css 哇,谢谢,现在一切看起来都很清晰 :) 【参考方案1】:

您需要对关键帧名称的变量使用字符串插值。你的关键帧 mixin 需要这样写:

@mixin keyframes($animationName)

    @-webkit-keyframes #$animationName 
        @content;
    
    @-moz-keyframes #$animationName  
        @content;
    
    @-o-keyframes #$animationName 
        @content;
    
    @keyframes #$animationName 
        @content;
    

注意keyframes mixin that comes with Compass does this。

GitHub 上有一个问题表明interpolation was not required in certain versions of Sass (possibly limited to 3.3.x)。然而,Sass 的作者认为这是一个错误:

之前的行为是一个错误。绝不应允许在任何指令中未插值的变量。

【讨论】:

【参考方案2】:

同上加前缀:

@mixin keyframes($animationName) 
  @-webkit-keyframes #$animationName 
    $browser: '-webkit-' !global;
    @content;
  
  @-moz-keyframes #$animationName 
    $browser: '-moz-' !global;
    @content;
  
  @-o-keyframes #$animationName 
    $browser: '-o-' !global;
    @content;
  
  @keyframes #$animationName 
    $browser: '' !global;
    @content;
  
 $browser: null;

详细信息here。

或者直接使用Autoprefixer。

【讨论】:

以上是关于Sass Keyframes 动画混合生成无效的 CSS的主要内容,如果未能解决你的问题,请参考以下文章

css3动画基础详解(@keyframes和animation)

Sass 带参混合

动画animation @keyframes

CSS3@keyframes规则和animation动画

css-@keyframes动画

animation属相详解 - @keyframes 用法 -animation案列- @keyframes 案列