【问题标题】:Continuous CSS rotation animation on hover, animated back to 0deg on hover out悬停时连续的 CSS 旋转动画,悬停时动画回到 0 度
【发布时间】:2011-12-20 19:08:34
【问题描述】:

我有一个元素,当你无限期地悬停在它上面时,它会旋转。当您悬停时,动画停止。简单:

@-webkit-keyframes rotate {
    from {
        -webkit-transform: rotate(0deg);
    }
    to { 
        -webkit-transform: rotate(360deg);
    }
}

.elem:hover {
    -webkit-animation-name: rotate; 
    -webkit-animation-duration: 1.5s; 
    -webkit-animation-iteration-count: infinite;
    -webkit-animation-timing-function: linear;
}

但是,当您将鼠标悬停时,动画会突然停止,恢复到 0 度。我想动画回到那个位置,但我在语法上遇到了一些问题。

任何输入都会很棒!

【问题讨论】:

  • 老实说,我认为你做不到。无论如何,我创建了一个 jsFiddle,所以如果有人有想法...jsfiddle.net/4Vz63/1
  • 感谢 jsfiddle - 把我自己难住了,似乎关键帧应该可以实现,但我对 CSS# 动画语法还不是很熟悉。
  • 我认为只有使用 -webkit-transition 属性而不是 -webkit-animation 才能获得动画的反向效果
  • 当然你可以在 JS 中做到这一点,但不能在纯 CSS 中做到。另外请检查这个解决方案,它有点接近你想要的 - jsfiddle.net/SebastianPataneMasuelli/nkEwQ/7

标签: css css-animations


【解决方案1】:

跨浏览器兼容JS方案:

var e = document.getElementById('elem');
var spin = false;

var spinner = function(){
e.classList.toggle('running', spin);
if (spin) setTimeout(spinner, 2000);
}

e.onmouseover = function(){
spin = true;
spinner();
};

e.onmouseout = function(){
spin = false;
};
body { 
height:300px; 
}
#elem {
position:absolute;
top:20%;
left:20%;
width:0; 
height:0;
border-style: solid;
border-width: 75px;
border-color: red blue green orange;
border-radius: 75px;
}

#elem.running {
animation: spin 2s linear 0s infinite;
}

@keyframes spin { 
100% { transform: rotate(360deg); } 
}
<div id="elem"></div>

【讨论】:

    【解决方案2】:

    解决方案是在您的 .elem 中设置默认值。 但是这个动画在 -moz 下工作得很好,但在 -webkit 中还没有实现

    看看我从你那里更新的小提琴: http://jsfiddle.net/DoubleYo/4Vz63/1648/

    它在 Firefox 上运行良好,但在 Chrome 上不行

    .elem{
        position: absolute;
        top: 40px;
        left: 40px;
        width: 0; 
        height: 0;
        border-style: solid;
        border-width: 75px;
        border-color: red blue green orange;
        transition-property: transform;
        transition-duration: 1s;
    }
    .elem:hover {
        animation-name: rotate; 
        animation-duration: 2s; 
        animation-iteration-count: infinite;
        animation-timing-function: linear;
    }
    
    @keyframes rotate {
        from {transform: rotate(0deg);}
        to {transform: rotate(360deg);}
    }
    <div class="elem"></div>

    【讨论】:

    • 伟大的小提琴伙伴(或 fiffle ;))
    • 我是个彻头彻尾的混蛋,因为不知何故没有注意到这个答案。 FF中的修复总比没有好,可以用JS修补以在Chrome中工作。
    • 试过 jFiddle 它在​​ chrome 中运行良好,我在 FF 中突然出现动画。看起来如果增加动画持续时间然后旋转效果很好。 -moz-animation-duration: 6s 之类的东西(6s 没什么神奇的)1.5s 对 FF 来说太快了
    • 我最喜欢的小提琴之一,我喜欢改变border-style
    • 这在 Chrome 35 中对我不起作用。它在 FF 30 中起作用(有点)。如果我将鼠标悬停,离开,然后在重置为 0 之前将鼠标悬停,它会完成动画然后跳转开始无限旋转动画。
    【解决方案3】:

    这是一个简单的工作解决方案:

    @-moz-keyframes spin { 100% { -moz-transform: rotate(360deg); } }
    @-webkit-keyframes spin { 100% { -webkit-transform: rotate(360deg); } }
    @keyframes spin { 100% { -webkit-transform: rotate(360deg); transform:rotate(360deg); } }
    
    .elem:hover {
        -webkit-animation:spin 1.5s linear infinite;
        -moz-animation:spin 1.5s linear infinite;
        animation:spin 1.5s linear infinite;
    }
    

    【讨论】:

      【解决方案4】:
      <script>
      var deg = 0
      
      function rotate(id)
      {
          deg = deg+45;
          var txt = 'rotate('+deg+'deg)';
          $('#'+id).css('-webkit-transform',txt);
      }
      </script>
      

      我所做的事情非常简单...在开始时声明一个全局变量...然后根据我的喜好递增变量,并使用 jquery 的 .css 来递增。

      【讨论】:

      • 谢谢,但问题是关于 CSS 的。
      【解决方案5】:

      这是一个适用于 web-kit 的 javascript 实现:

      var isHovering = false;
      
      var el = $(".elem").mouseover(function(){
          isHovering = true;
          spin();
      }).mouseout(function(){
          isHovering = false;
      });
      
      var spin = function(){
          if(isHovering){
              el.removeClass("spin");
      
              setTimeout(function(){
                  el.addClass("spin");
      
                  setTimeout(spin, 1500);
              }, 0);
          }
      };
      spin();
      

      JSFiddle:http://jsfiddle.net/4Vz63/161/

      呕吐。

      【讨论】:

        【解决方案6】:

        尝试了几次,但我能够让您的 jsFiddle 正常工作(仅适用于 Webkit)。

        当用户重新进入div时,动画速度仍然存在问题。

        基本上,只需将当前旋转值设置为一个变量,然后对该值进行一些计算(转换为度数),然后将该值设置回鼠标移动和鼠标进入时的元素。

        查看 jsFiddle:http://jsfiddle.net/4Vz63/46/

        查看这篇文章了解更多信息,包括如何添加跨浏览器兼容性: http://css-tricks.com/get-value-of-css-rotation-through-javascript/

        【讨论】:

          【解决方案7】:

          你应该触发动画在使用 javascript 完成后恢复。

            $(".item").live("animationend webkitAnimationEnd", function(){
              $(this).removeClass('animate');
            });
          

          【讨论】:

          • 这是不正确的。这个问题是基于CSS 的,并且已经可以使用CSS。因此投反对票
          猜你喜欢
          • 1970-01-01
          • 2015-12-26
          • 2015-12-15
          • 2016-10-27
          • 2021-01-02
          • 2012-02-09
          • 2014-11-02
          相关资源
          最近更新 更多