首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JS旋转动画变化速度

JS旋转动画变化速度
EN

Stack Overflow用户
提问于 2018-04-24 14:32:05
回答 2查看 3.8K关注 0票数 4

我试着做一个旋转块,它的转速由<input type="range"控制。问题是我找不到解决方案,当速度更新时,不会重新启动动画

我尝试了三种变体:

  • 直接设置CSS动画速度由JS。-重新启动动画;
  • jQuery的animate -不适用于转换;
  • anime.js -它有速度变化的方法,但它也重新启动动画(或者只是块跳转,还不清楚)

什么方法允许通过JS动画创建平稳的变化?

代码语言:javascript
复制
let block = anime({
   targets: '#transforms .block',
   rotateY: '360',
   easing: 'linear',
   loop: true,
   duration: 1000,
});


var el = document.querySelectorAll('#range')[0];

el.addEventListener('change', function() {  
  // console.log(value);
  // console.log(pos);
  var value = this.value;
  anime.speed = value/20;
  // console.log(block);
})
代码语言:javascript
复制
.block {
  width: 500px;
  height: 300px;
  background-color: red;
}
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/animejs/2.2.0/anime.js"></script>
<div id="transforms">
  <div class="block"></div>
</div>

<input id="range" type="range" min="0" max="20" step="1" value="10">

anime.js示例代码论科迪

EN

回答 2

Stack Overflow用户

发布于 2018-04-24 14:39:25

使用速度动画库,您可以这样做:

代码语言:javascript
复制
Velocity.animate(this.yourElement, {
  rotateZ: `${angle}deg`,
  duration: yourSpeed

})

票数 0
EN

Stack Overflow用户

发布于 2018-04-25 10:03:26

我想在动画周期结束时触发速度变化是你所需要的。但是,对于这个包,我无法将过渡端事件侦听器附加到这两个div中的任何一个。不会触发的。因此,深入了解这个库,我想您可能会通过将一个run属性附加到anime options对象来完成类似的任务,该对象接受一个函数作为值,并通过传递一个进度参数多次调用它。一旦这个进度参数是100,我们就可以进行速度变化操作,如果速度已经改变(newSpeed !== void 0)。

别让void 0迷惑你。它只是一个完美的undefined值,我喜欢在比较未定义的值时使用它。

代码语言:javascript
复制
let block = anime({
   targets : '#transforms .block',
   rotateY : '360',
   easing  : 'linear',
   loop    : true,
   duration: 1000,
   run     : anim => anim.progress === 100 && newSpeed !== void 0 && (anime.speed = newSpeed, newSpeed = void 0)
});

var range    = document.getElementById('range'),
    newSpeed = void 0;  // perfect undefined

anime.speed = range.value/20;
range.addEventListener('change', function(e) {
                                   newSpeed = e.target.value/20;
                                 });
代码语言:javascript
复制
.block {
  width: 500px;
  height: 300px;
  background-color: red;
}
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/animejs/2.2.0/anime.js"></script>
<div id="transforms">
  <div class="block"></div>
</div>

<input id="range" type="range" min="0" max="20" step="1" value="10">

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50004291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档