css旋转45度_CSS/JS:如何实现动画的暂停和播放

e85c34d72b638364457b930808b87348.png

如题所示,我遇到一个常见的动画场景: 让一个圆形图框让它转动起来。当然如果单纯这样做很简单,声明一个keyframe,控制transform: rotate(deg)属性从0到360度变化。然后在animation中使用这个keyframe就可以了。

但是如果在此基础上添加一个要求: 增加动画的暂停和重新播放功能。这样的话又该如何实现呢?就类似于音乐软件的那个转盘,想要让它在音乐暂停的时候转动动画也暂停,等到音乐播放的时候再继续转动

87ef2c6ab2decaeb109f46325ff8a7f5.png

这时候我发现了一个最为关键的问题:传统的animation属性或者keyframe提供的的播放功能是“一镜到底”的,也就是直接从开始播放到结束,没有中断控制的功能。

正当我感到烦恼的时候我查询到了一个我正需要的CSS属性:animation-play-state。它包含有两个值:pausedrunning。前者可以使animation属性制定的动画处于暂停状态,后者可以使动画处于播放状态。这正是我需要的东西

animation-play-state​developer.mozilla.org
45d2813ec18df0e07d2a9e80d842e835.png

我们看看怎么来使用它吧,下面我们来演示一下,首先我们用@keyframes声明一个动画帧然后在animation中使用它。

再然后我们给两个类:active类和paused类,分别设为animation-play-state: running; 和animation-play-state: paused;

@

最后我们讲会在html中给一个Div动态地切换active和paused类, 并且在按钮点击的时候实现切换,这样就可以实现播放和暂停啦,下面是React的演示代码

import 

效果如下

0bdf9d5dd36e24ac38eec1a72f51ba9b.png
https://www.zhihu.com/video/1202385925147430912

但是问题来了,animation-play-state的兼容性怎么样呢,让我们看看,果然问题还是出现在IE浏览器: IE10以下不兼容。

ca991be98198b7482da055a42b21ed41.png

那么问题来了,我们如果想要在IE10以下也实现旋转动画的播放和暂停该怎么办呢?

答案是:自己在JS中手动递归setTimeout改变div的transform: rotate。

你可能会问,为什么我们不用专供动画的requestAnimationFrame呢?那是因为:requestAnimationFrame的兼容性和animation-play-state一个鸟样,都是对IE10以下不兼容。(心塞)

471bf085dc5b625b3df6149555923a8b.png

因此我用setTimeout去模拟requestAnimationFrame的效果,我们统一假设帧渲染频率为60HZ,在这种情况下屏幕16.7秒刷新一次,把这作为我的setTimeout里的函数递归调用的间隔时间。如下所示

import 

CSS代码

.

实现效果

b52c404a471093e52847213ea525c7e6.png
https://www.zhihu.com/video/1202386056601120768

自己实现当然也有缺点,总结如下

  • 当多种CSS特性复合的时候,实现起来并不太方便
  • 播放速度和效果受限,setTimeout实际是有最短时间的,如果动画确实很快执行完毕的话,效果会不流畅

本文完


附两句霸气的台词

  • the world!
  • 时间,开始流动

f8e2b680ef17ceb5b78f1009f32ad1d0.png

e3185101eb4bb85a2334468a10aa4827.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值