首页 > 解决方案 > CSS 结束一个关键帧循环动画并让它重新开始动画

问题描述

我有一个旋转正方形的循环动画。当我删除启用动画的类时,正方形立即回到起始位置。

我需要能够将正方形动画化回 JS 事件的起始位置。

这是一个代码笔

我尝试向元素添加变换,并切换到另一个关键帧动画,但都没有奏效。

html:

<div class="container">
  <div class="animate rotating"></div>
</div>

CSS:

.container{
  position: absolute;
  width: 100%;
  height: 100%;
  background-color: #333;
}

.animate{
  width: 100px;
  height: 100px;
  background-color: red;
  position: absolute;
  top: 50%;
  left: 50%;
  margin: -50px 0 0 -50px;
  transform: all 2s ease;
}

@keyframes rotating {
  0%{transform: rotate(30deg);}
  50%{transform: rotate(-30deg);}
  100%{transform: rotate(30deg);}
}

.rotating {
  animation: rotating 6s ease-in-out infinite forwards;
  animation-delay: -2s;
}

jQuery:

$('.animate').click(function(){
  $(this).removeClass('rotating');
});

标签: csscss-animationskeyframe

解决方案


你的代码有一点问题:

transform: all 2s ease;

你打错了过渡,但我很确定这种方法行不通。如果您愿意使用 jQuery 完成此操作,您可以获得当前旋转并应用于您的元素:

function getRotationDegrees(obj) {
    var matrix = obj.css("-webkit-transform") ||
    obj.css("-moz-transform")    ||
    obj.css("-ms-transform")     ||
    obj.css("-o-transform")      ||
    obj.css("transform");
    if(matrix !== 'none') {
        var values = matrix.split('(')[1].split(')')[0].split(',');
        var a = values[0];
        var b = values[1];
        var angle = Math.round(Math.atan2(b, a) * (180/Math.PI));
    } else { var angle = 0; }
    return (angle < 0) ? angle + 360 : angle;
}

$('.animate').click(function(){
  var el = $(this);
  var elRotate = getRotationDegrees(el);
  el.css('transform',`rotate(${elRotate}deg)`);
  el.removeClass('rotating');
  // set new transform here
});

这将冻结您的元素旋转,您可以在最后设置所需的旋转并应用过渡。


推荐阅读