有一个代码可以无休止地为图像设置动画
const svg = document.getElementById('svg-element')
const warp = new Warp(svg)
warp.interpolate(4)
warp.transform(([ x, y ]) => [ x, y, y ])
let offset = 0
function animate()
{
warp.transform(([ x, y, oy ]) => [ x, oy + 4 * Math.sin(x / 16 + offset), oy ])
offset += 0.1
requestAnimationFrame(animate)
}
animate()
#svg-element {
margin: 20px;
overflow: visible;
width: 300px;
height: auto;
}
<script src="https://cdn.jsdelivr.net/npm/warpjs@1.0.8/dist/warp.js"></script>
<svg id="svg-element" viewBox="0 0 303 251">
<circle cx="88.784" cy="141.382" r="88.784" style="fill: #00fbd1; mix-blend-mode: multiply;"/>
<path d="M278.078,26.195l-161.04,-26.195l-26.195,161.04l161.04,26.195l26.195,-161.04Z" style="fill: #d867ff; mix-blend-mode: multiply;"/>
<path d="M170.608,63.772l131.392,155.722l-213.216,30.874l81.824,-186.596Z" style="fill: #fffa2a; mix-blend-mode: multiply;"/>
</svg>
我想创建运行代码、暂停代码和重置动画的命令。
或多或少是这样的:
const svg = document.getElementById('svg-element')
const warp = new Warp(svg)
warp.interpolate(4)
warp.transform(([ x, y ]) => [ x, y, y ])
let offset = 0
var requestId = undefined;
function start(ani) {
if (!requestId) {
requestId = window.requestAnimationFrame(ani);
}
}
function pause(ani) {
if (requestId) {
window.cancelAnimationFrame(ani);
requestId = undefined;
}
}
function stop() {
offset = 0
}
function animate(){
warp.transform(([ x, y, oy ]) => [ x, oy + 4 * Math.sin(x / 16 + offset), oy ])
offset += 0.1
self.start = start(animate)
self.pause = pause(animate)
self.stop = stop()
}
animate.start
如果会有多个动画,我怎样才能做得更好?
为每个编写停止、启动等函数start_animation_1()
是没有意义的,调用也是没有意义的。
好吧,您需要某种附加组件
Warp
。问题是您无法使用会自行停止和启动一切的魔法功能。例如,
stop
它必须确切知道需要重置哪些值:可以有 2 个或 3 个值,而不是一个偏移量。那些。在初始化期间,您需要传递一个带有初始值的附加对象。在这种情况下,您可以先尝试弄清楚使用该功能是否方便,然后再考虑如何实现它。去做吧,不要再看里面发生了什么。我摆弄了一下,直到它看起来像这样: