背景
要测试大转盘动画在不同转速下的效果。
通过动画持续时间影响倍速
完成一次动画的持续时间越短,动画越快。因此将初始动画持续时间除以倍速即可。
示例CSS代码:
css
.App {
font-family: sans-serif;
text-align: center;
}
.turntable-container {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background-color: #f0f0f0;
}
.turntable {
width: 300px;
height: 300px;
border-radius: 50%;
position: relative;
overflow: hidden;
animation: rotate calc(2s / var(--animation-speed)) linear infinite; /* 初始2秒一圈 */
border: 10px solid #f8d38d;
/* 使用圆锥渐变:每 45度 切换一个颜色,实现 8等分 */
background: conic-gradient(
#ff6b6b 0deg 45deg,
#4ecdc4 45deg 90deg,
#ff6b6b 90deg 135deg,
#4ecdc4 135deg 180deg,
#ff6b6b 180deg 225deg,
#4ecdc4 225deg 270deg,
#ff6b6b 270deg 315deg,
#4ecdc4 315deg 360deg
);
box-shadow: 0 0 20px rgba(0, 0, 0, 0.2);
}
@keyframes rotate {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
示例js代码:
javascript
import { useEffect, useState } from "react";
import "./styles.css";
export default function App() {
const [animationSpeed, setAnimationSpeed] = useState(1);
useEffect(() => {
// 开启2倍速播放
setAnimationSpeed(2);
}, []);
return (
<div className="App">
<div class="turntable-container">
<div
class="turntable"
style={{ "--animation-speed": animationSpeed }}
></div>
</div>
</div>
);
}
效果演示
正常倍速:
正常倍速大转盘
2倍速:
2倍速播放大转盘
小结
综上,我们使用CSS圆锥渐变实现了一个简易大转盘,并使其按照2秒1圈的速度匀速转动。js中维护了animationSpeed状态代表倍速,初始值为1。通过将其设置为2实现2倍速播放。实战中,我们需要对希望支持倍速播放的动画的每一部分的动画持续时间都做CSS变量的插值,防止出现时间轴错乱的情况。