动画SVG视图框更改

时间:2015-11-20 06:05:10

标签: javascript animation svg velocity.js

我目前正在使用velocity.js来控制我正在创建的SVG绘图上的一些动画。它与用户交互,因此当某些部分发生点击时,图片可能会向右或向下增长。到目前为止,一切都运行良好,直到SVG盒子的图片太大。

在这些情况下,我只需调整viewBox的大小即可缩放图像。

svgDoc.setAttribute("viewBox", "0 0 " + svgDocWidth + " " + svgDocHeight);

这样可行,但它看起来并不好看,因为它没有动画效果。它只是跳到新的大小。有没有办法用velocity.js为viewBox更改动画?

我尝试过这种方法:

$viewBox = $(svgDoc.viewBox);
$viewBox.velocity({height: svgDocHeight, width: svgDocWidth});

但那并没有做任何事情。

这是否超出了velocity.js可以支持的范围?

2015-11-21解决方案

@Ian给出了我最终使用的解决方案。结果看起来像这样:

var origHeight = this.svgDoc.viewBox.animVal.height;
var origWidth = this.svgDoc.viewBox.animVal.width;

var docHeight = this.SvgHeight();
var docWidth = this.SvgWidth();

if ((origHeight != docHeight) || (origWidth != docWidth))
{
    var deltaHeight = docHeight - origHeight;
    var deltaWidth = docWidth - origWidth;

    $(this.svgDoc).velocity(
    { 
        tween: 1 
    },
    { 
        progress: function(elements, complete, remaining, start, tweenValue)
        {
            var newWidth = origWidth + complete * deltaWidth;
            var newHeight = origHeight + complete * deltaHeight;
            elements[0].setAttribute('viewBox', '0 0 ' + newWidth + ' ' + newHeight); 
        }
     });
}   

2 个答案:

答案 0 :(得分:3)

您可以通过SMIL平滑地为viewBox设置动画。像这样......



<svg width="100%" height="100%" viewBox="0 0 200 200">
  <animate attributeName="viewBox" to="0 0 400 400" dur="5s" fill="freeze" />
  <circle cx="100" cy="100" r="100" fill="green" />
</svg>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

我认为Chrome中的SMIL已被弃用(如果我错了请纠正我),所以我猜测会越来越依赖其他方法。

没有理由你不能使用速度,而是使用自己的计算和progress / tweenValue参数,例如有点像这样......

$("#mysvg").velocity(
    { tween: 200 },
    { progress: animViewbox }
)

function animViewbox (elements, complete, remaining, start, tweenValue) {
     elements[0].setAttribute('viewBox', '0 0 ' + tweenValue + ' ' + tweenValue);  
}

jsfiddle