我需要一些帮助这种特殊的动画。它是一个正方形的螺旋图案,不断向内,直到它完全完成。我确实设法让它继续运行,但我不知道如何正确地停止动画,我不确定它背后的数学是否有效/正确。
以下是我目前的情况:
function createSquareSpiralPath(
strokeWidth,
width,
height,
) {
const maxIterations = Math.trunc(Math.min(width, height) / 2 / strokeWidth); // ???
let path = '';
for (let i = 0; i <= maxIterations; i++) {
const step = strokeWidth * i;
const computed = [
`${step},${height - step}`,
`${step},${step}`,
`${width - step - strokeWidth},${step}`,
`${width - step - strokeWidth},${height - step - strokeWidth} `,
];
path += computed.join(' ');
}
return path.trim();
}
.spiral {
stroke-dasharray: 6130;
stroke-dashoffset: 6130;
animation: moveToTheEnd 5s linear forwards;
}
@keyframes moveToTheEnd {
to {
stroke-dashoffset: 0;
}
}
<svg viewBox="-10 -10 350 350" height="350" width="350">
<polyline class="spiral" points="
0,350 0,0 330,0 330,330 20,330 20,20 310,20 310,310 40,310 40,40 290,40 290,290 60,290 60,60 270,60 270,270 80,270 80,80 250,80 250,250 100,250 100,100 230,100 230,230 120,230 120,120 210,120 210,210 140,210 140,140 190,140 190,190 160,190 160,160 170,160 170,170"
style="fill:transparent;stroke:black;stroke-width:20" />
Sorry, your browser does not support inline SVG.
</svg>
我添加js函数只是为了演示如何生成点。正如你所看到的动画播放正是我想要的,我只是找不到一种方法来 Package 它正确。此外,我不确定这个函数是否会为不同的宽度/高度/strokeWidth生成正确的点。
我感谢任何帮助!先谢谢你了。:)
附言:我找不到一个数学术语来描述这种模式(方形螺旋),所以我很乐意学习如何正确地称呼它。
编辑
基于@enxaneta的回答(谢谢!)似乎我错误地计算了最大迭代次数。这可以在width !== height
时看到。我会做一些研究,我是如何产生这个值,也许这个公式是不够的,以正确的“停止”动画没有任何空格。
2条答案
按热度按时间von4xj4u1#
我猜你还需要检查你当前的绘图位置是否已经达到了最大x/y(接近你的中心)。
循环迭代的计算工作正常。
目前,您在每一步中绘制4个新点。
根据您的
stroke-width
,您可能需要停止绘制,例如在2.或3.当你接近中心X/Y坐标时点。nom7f22z2#
要控制动画,请使用Web Animations API,而不是CSS
<svg-spiral>
中,这样您就可以在屏幕上拥有多个组件,而不会产生任何全局CSS冲突。pathLenght="100"
,这样就不必进行计算stroke-dasharray
必须写成:WAAPI中的strokeDasharray
onfinish
函数<svg-spiral>
将重新启动动画