你如何在webkit中反转css关键帧动画?

时间:2011-10-05 23:50:36

标签: css html5 animation css3 keyframe

我有一个控件,我想在关键帧动画之后在两个位置之间转换。有没有办法使用相同的关键帧,但相反?另外,有没有办法停止动画,中途将其反转到开头?

这就是我现在所拥有的(我想要结合两个关键帧:

@-webkit-keyframes explode {
  0% {
-webkit-transform: scale(1.0) rotate(0deg) translate(0px, 0px);
 }
 33% {
   -webkit-transform: scale(2.0)   translate(100px, -150px);
 }
 67% {
   -webkit-transform: scale(2.0)   translate(200px, -250px);
 }
 100% {
   -webkit-transform: scale(1.0)  translate(-15px, -15px);
 }
}

@-webkit-keyframes explodeBack {
 0% {
  -webkit-transform: scale(1.0)  translate(-15px, -15px);
 }
 67% {
   -webkit-transform: scale(2.0)   translate(100px, -150px);

 }
 100% {
   -webkit-transform: scale(1.0) rotate(0deg) translate(0px, 0px);

 }
}

.leftArrowAnimateForward{
     -webkit-animation-name: explode;
     -webkit-animation-duration: 3s;
     -webkit-animation-timing-function: linear;
     -webkit-animation-direction:normal; /* Safari and Chrome */
      -webkit-transform: scale(1.0)  translate(-15px, -15px);
}

.leftArrowAnimateBackward{
     -webkit-animation-name: explodeBack;
     -webkit-animation-duration: 3s;
     -webkit-animation-timing-function: linear;
     -webkit-animation-direction:alternate; 
      -webkit-transform: scale(1.0)  translate(0px, 0px);
}

3 个答案:

答案 0 :(得分:0)

如果没有直观地看到你到目前为止所做的事情,很难看到你想要做什么,但结帐动画填充模式。

这将允许您的动画在设置为转发时停在最后一个关键帧上,此时我相信关键帧在完成时会回到0。

玩游戏,如果您成功,请告诉我们。

答案 1 :(得分:0)

如果你将animation-iteration-count:2与动画方向:alternate结合,动画延迟与动画的长度相结合,你可以做你想要做的第一件事,你会得到一个动画只能反向播放一次。 (它基本上会跳到反向动画并开始在那里播放。)

除非你定义第二组关键帧并使用JS(或悬停或其他)在类之间切换,否则你不能用纯CSS动画做第二件事

答案 2 :(得分:0)

我遇到了同样的问题,并使用SCSS生成了两个版本的关键帧normalreverse.

https://github.com/lichunbin814/scss-utils#with-reverse-version

/* mixin */

@mixin keyframe-reverse( $name, $value) {
  @keyframes #{$name}-rev {
    @each $position,
    $change in $value {
      #{ 100 -$position}% {
        @each $prop,
        $val in $change {
          #{$prop}: #{$val};
        }
      }
    }
  }
}

@mixin keyframe-normal( $name, $value) {
  @keyframes #{$name} {
    @each $position,
    $change in $value {
      #{$position}% {
        @each $prop,
        $val in $change {
          #{$prop}: #{$val};
        }
      }
    }
  }
}

@mixin keyframe-gen( $name, $value, $genReverse) {
  @include keyframe-normal( $name: $name, $value: $value);
  @if ($genReverse) {
    @include keyframe-reverse( $name: $name, $value: $value)
  }
}


/* use */

@include keyframe-gen(
  $name : "fadeIn" ,  
   $value : (
      0: (
            transform: scale(1),
            opacity: 1
      ),
      100: (
            transform: scale(0),
            opacity: 0
      ),
   ) , 
   $genReverse : true 
);

.menu {
  animation-name: fadeIn-rev;
  &.active {
    animation-name: fadeIn;
  }
}

// output css

/*
@keyframes fadeIn {
  0% {
    transform: scale(1);
    opacity: 1;
  }
  100% {
    transform: scale(0);
    opacity: 0;
  }
}

@keyframes fadeIn-rev {
  100% {
    transform: scale(1);
    opacity: 1;
  }
  0% {
    transform: scale(0);
    opacity: 0;
  }
}
*/