在 for 循环中更改 SVG 行的 strokeDashoffset
Change strokeDashoffset of a SVG line in a for loop
我正在尝试为一条展开的线设置动画。我已经在 css 中拥有它,但我需要在 javaScript 中完成它,因为这是我获得所需路径长度的唯一方法。
我认为我非常接近,但它不起作用!
有任何想法吗?
以下是我的代码。如您所见,我得到了路径的长度,并给它一个该长度的 strokeDashArray。这意味着该线将是虚线,但破折号会填满整条线。诀窍是减小 strokeDashoffset 值,因为它决定了破折号的开始位置。因此,如果它也从 pathLength 开始,则该线将完全不可见,并且减小该值将显示路径。
我知道这是可能的顺便说一句 :) 如前所述,我已经在 css.
中使用它了
var element = document.getElementById("animpath");
var pathLength = element.getTotalLength();
element.style.strokeDasharray = pathLength;
element.style.strokeDashoffset = pathLength;
function animateRoute (e)
{
e.style.strokeDashoffset = e.style.strokeDashoffset - 100;
}
for (i = 0; i < 100; i++)
{
animateRoute(element);
}
提前致谢!
代码:
function animateRoute (e)
{
e.style.strokeDashoffset = e.style.strokeDashoffset - 100;
}
for (i = 0; i < 100; i++)
{
animateRoute(element);
}
基本等同于
e.style.strokeDashoffset = e.style.strokeDashoffset - 10000;
因为循环会快速完成所有迭代,而没有给浏览器更新页面的机会。
为了解决这个问题,在循环中执行一个步骤,然后调用 setTimeout() 告诉浏览器稍后返回给我们,以便我们可以进行下一次迭代。
var element = document.getElementById("animpath");
var pathLength = element.getTotalLength();
element.style.strokeDasharray = pathLength;
element.style.strokeDashoffset = pathLength;
function animateRoute(e, len)
{
// Each step we decrement the dash offset
len -= 10;
if (len < 0)
len = 0; // clamp to minimum 0
element.style.strokeDashoffset = len;
// We need to stop looping when the length gets to 0
if (len > 0) {
// Do another step
setTimeout(function() { animateRoute(e, len); }, 10);
}
}
animateRoute(element, pathLength);
<svg viewBox="-10 -10 420 120">
<path id="animpath" d="M 0 0 L 400 10 0 20 400 30 0 40 400 50 0 60 400 70 0 80 400 90 0 100"
stroke="black" stroke-width="3" fill="none"/>
</svg>
我正在尝试为一条展开的线设置动画。我已经在 css 中拥有它,但我需要在 javaScript 中完成它,因为这是我获得所需路径长度的唯一方法。 我认为我非常接近,但它不起作用! 有任何想法吗?
以下是我的代码。如您所见,我得到了路径的长度,并给它一个该长度的 strokeDashArray。这意味着该线将是虚线,但破折号会填满整条线。诀窍是减小 strokeDashoffset 值,因为它决定了破折号的开始位置。因此,如果它也从 pathLength 开始,则该线将完全不可见,并且减小该值将显示路径。
我知道这是可能的顺便说一句 :) 如前所述,我已经在 css.
中使用它了var element = document.getElementById("animpath");
var pathLength = element.getTotalLength();
element.style.strokeDasharray = pathLength;
element.style.strokeDashoffset = pathLength;
function animateRoute (e)
{
e.style.strokeDashoffset = e.style.strokeDashoffset - 100;
}
for (i = 0; i < 100; i++)
{
animateRoute(element);
}
提前致谢!
代码:
function animateRoute (e)
{
e.style.strokeDashoffset = e.style.strokeDashoffset - 100;
}
for (i = 0; i < 100; i++)
{
animateRoute(element);
}
基本等同于
e.style.strokeDashoffset = e.style.strokeDashoffset - 10000;
因为循环会快速完成所有迭代,而没有给浏览器更新页面的机会。
为了解决这个问题,在循环中执行一个步骤,然后调用 setTimeout() 告诉浏览器稍后返回给我们,以便我们可以进行下一次迭代。
var element = document.getElementById("animpath");
var pathLength = element.getTotalLength();
element.style.strokeDasharray = pathLength;
element.style.strokeDashoffset = pathLength;
function animateRoute(e, len)
{
// Each step we decrement the dash offset
len -= 10;
if (len < 0)
len = 0; // clamp to minimum 0
element.style.strokeDashoffset = len;
// We need to stop looping when the length gets to 0
if (len > 0) {
// Do another step
setTimeout(function() { animateRoute(e, len); }, 10);
}
}
animateRoute(element, pathLength);
<svg viewBox="-10 -10 420 120">
<path id="animpath" d="M 0 0 L 400 10 0 20 400 30 0 40 400 50 0 60 400 70 0 80 400 90 0 100"
stroke="black" stroke-width="3" fill="none"/>
</svg>