SVG 在 <path> 中获取当前动画进度 (SMIL):stroke-dashoffset
SVG get current animation progress (SMIL) in <path>: stroke-dashoffset
我有非常简单的 path
元素动画。动画适用于 stroke-dashoffset
属性。我面临的问题是暂停动画后我无法获得动画进度。
这是我的 SVG 代码和 javascript,它实际上除了暂停和启动动画外什么都不做:
setTimeout(function(){
$('.svg')[0].pauseAnimations();
// get current stroke-dashoffset value ??
// $('#stroke')[0]['stroke-dashoffset'].animVal - it doesn't work
$('.svg')[0].unpauseAnimations();
}, 500); // 500 is testing value (!) it can be anything
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" class="svg">
<path d="M47.488,10.079A40,40,0,0,0,16.302,71.551" id="stroke" style="stroke-width: 10px; fill: none; stroke: #333;" stroke-dasharray="83.07828521728516px 83.07828521728516px" stroke-dashoffset="-83.07828521728516px">
<animate attributeName="stroke-dashoffset" id="anim2" dur="1000ms" from="-83.07828521728516px" to="-39.095663631663605" fill="freeze"></animate>
</path>
</svg>
我知道如何在使用 <circle>
元素时获得动画进度: 但我不知道如何在 <path>
中获得 stroke-dashoffset
值。
我可以通过将超时与 min/max stroke-dashoffset
相结合来完成它并计算大概的进度,但我相信(希望)我遗漏了一些东西并且可以通过 [=19= 轻松完成].
所以请不要 post 那种解决方案的答案,因为我知道如何自己做。
非常有趣,我不知道所有动画属性都没有 animVal
,但似乎 stroke-dashoffset
属性直接转换为其等效样式。
因此对于您的问题,一个简单的解决方案是请求元素的计算样式:
setTimeout(function(){
$('.svg')[0].pauseAnimations();
// get current stroke-dashoffset value
console.log( getComputedStyle($('#stroke')[0]).strokeDashoffset );
$('.svg')[0].unpauseAnimations();
}, 500); // 500 is testing value (!) it can be anything
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" class="svg">
<path d="M47.488,10.079A40,40,0,0,0,16.302,71.551" id="stroke" style="stroke-width: 10px; fill: none; stroke: #333;" stroke-dasharray="83.07828521728516px 83.07828521728516px" stroke-dashoffset="-83.07828521728516px">
<animate attributeName="stroke-dashoffset" id="anim2" dur="1000ms" from="-83.07828521728516px" to="-39.095663631663605" fill="freeze"></animate>
</path>
</svg>
我有非常简单的 path
元素动画。动画适用于 stroke-dashoffset
属性。我面临的问题是暂停动画后我无法获得动画进度。
这是我的 SVG 代码和 javascript,它实际上除了暂停和启动动画外什么都不做:
setTimeout(function(){
$('.svg')[0].pauseAnimations();
// get current stroke-dashoffset value ??
// $('#stroke')[0]['stroke-dashoffset'].animVal - it doesn't work
$('.svg')[0].unpauseAnimations();
}, 500); // 500 is testing value (!) it can be anything
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" class="svg">
<path d="M47.488,10.079A40,40,0,0,0,16.302,71.551" id="stroke" style="stroke-width: 10px; fill: none; stroke: #333;" stroke-dasharray="83.07828521728516px 83.07828521728516px" stroke-dashoffset="-83.07828521728516px">
<animate attributeName="stroke-dashoffset" id="anim2" dur="1000ms" from="-83.07828521728516px" to="-39.095663631663605" fill="freeze"></animate>
</path>
</svg>
我知道如何在使用 <circle>
元素时获得动画进度: 但我不知道如何在 <path>
中获得 stroke-dashoffset
值。
我可以通过将超时与 min/max stroke-dashoffset
相结合来完成它并计算大概的进度,但我相信(希望)我遗漏了一些东西并且可以通过 [=19= 轻松完成].
所以请不要 post 那种解决方案的答案,因为我知道如何自己做。
非常有趣,我不知道所有动画属性都没有 animVal
,但似乎 stroke-dashoffset
属性直接转换为其等效样式。
因此对于您的问题,一个简单的解决方案是请求元素的计算样式:
setTimeout(function(){
$('.svg')[0].pauseAnimations();
// get current stroke-dashoffset value
console.log( getComputedStyle($('#stroke')[0]).strokeDashoffset );
$('.svg')[0].unpauseAnimations();
}, 500); // 500 is testing value (!) it can be anything
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" class="svg">
<path d="M47.488,10.079A40,40,0,0,0,16.302,71.551" id="stroke" style="stroke-width: 10px; fill: none; stroke: #333;" stroke-dasharray="83.07828521728516px 83.07828521728516px" stroke-dashoffset="-83.07828521728516px">
<animate attributeName="stroke-dashoffset" id="anim2" dur="1000ms" from="-83.07828521728516px" to="-39.095663631663605" fill="freeze"></animate>
</path>
</svg>