jquery – 改变动画CSS3的速度?

前端之家收集整理的这篇文章主要介绍了jquery – 改变动画CSS3的速度?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有动画:
  1. img.rotate {
  2. animation-name: rotate;
  3. animation-duration: 1.5s;
  4. animation-iteration-count: infinite;
  5. animation-timing-function: linear;
  6. }
  7.  
  8. @keyframes rotate {
  9. from {
  10. transform: rotate(0deg);
  11. }
  12. to {
  13. transform: rotate(360deg);
  14. }
  15. }

我有无限的旋转图像.现在我想用JS改变旋转速度.我试过了:

  1. $('img').css('animation-duration','2s');

持续时间会改变速度,但动画会重新启动到帧密钥0%(第一个),但我只想让动画继续,就像没有发生任何事情一样;我不想回到0%.

我怎样才能做到这一点?

解决方法

这是一个非常困难的过程.目前,更改动画中动画的唯一方法是使用setInterval来近似当前关键帧百分比,保存该关键帧的属性,更新动画(在您的情况下只是速度)然后应用新版本的动画开始从保存的点.我在为CSS Tricks编写的文章中创建了一个类似的例子,名为 Controlling CSS Animations & Transitions with Javascript

正如文章所描述的那样,更容易改变animationIteration的速度,在你的情况下看起来像this demo,但它仍然远非漂亮

  1. var pfx = ["webkit","moz","MS","o",""],rotates = $('.rotate'),prevent = false;
  2.  
  3. function PrefixedEvent(element,type,callback) {
  4. for (var p = 0; p < pfx.length; p++) {
  5. if (!pfx[p]) type = type.toLowerCase();
  6. element.addEventListener(pfx[p]+type,callback,false);
  7. }
  8. }
  9.  
  10. function listen() {
  11. for(var i = 0,j = rotates.length; i < j; i ++) {
  12. PrefixedEvent(rotates[i],"AnimationIteration",function() {
  13. if(!$('#faster').is(':checked') && !prevent) {
  14. var el = $(this),newOne = el.clone(true)
  15. .css({'animation':'rotate 2s linear infinite'});
  16. el.before(newOne);
  17. $("." + el.attr("class") + ":last").remove();
  18. rotates = $('.rotate');
  19. listen();
  20. prevent = true;
  21. }
  22. else if($('#faster').is(':checked') && prevent) {
  23. prevent = false;
  24. var el = $(this),newOne = el.clone(true)
  25. .css({'animation':'rotate 1.5s linear infinite'});
  26. el.before(newOne);
  27. $("." + el.attr("class") + ":last").remove();
  28. rotates = $('.rotate');
  29. listen();
  30. }
  31. });
  32. }
  33. }
  34. listen();

目前我们不能简单地使用不同的计时功能重新启动动画(即使你暂停它并像Michael所说的那样再次运行它).因此,您必须使用setInterval(提供更高的延迟)或克隆具有更改值的元素.有关我使用的方法的更多信息,请参阅演示,我在我添加的所有javascript中添加了注释

编辑基于您在评论中的链接小提琴

由于您正在尝试模拟轮盘赌,因此您根本不需要使用javascript!只需更改旋转动画即可随时间更改速度(:Here’s an rough version,如何执行此操作,但您应添加更多关键帧,使其看起来比目前的行为更平滑

  1. @-webkit-keyframes rotate {
  2. 0% { -webkit-transform: rotate( 0deg); }
  3. 30% { -webkit-transform: rotate(2600deg); }
  4. 60% { -webkit-transform: rotate(4000deg); }
  5. 80% { -webkit-transform: rotate(4500deg); }
  6. 100% { -webkit-transform: rotate(4780deg); }
  7. }

编辑2

因为你显然需要一个随机的结束位置并可能多次运行它你可以做something like this更简单,只使用CSS转换,并且非常有用

  1. var img = document.querySelector('img');
  2. img.addEventListener('click',onClick,false);
  3. var deg = 0;
  4.  
  5. function onClick() {
  6. this.removeAttribute('style');
  7. deg += 5 * Math.abs(Math.round(Math.random() * 500));
  8. var css = '-webkit-transform: rotate(' + deg + 'deg);';
  9. this.setAttribute(
  10. 'style',css
  11. );
  12. }

和CSS

  1. img { -webkit-transition: -webkit-transform 2s ease-out; }

编辑3

这不完全相关或不相关,但您可以使用GSAP(如I did in this project)进行非常类似的操作,以使其更具交互性/动态性

猜你在找的jQuery相关文章