javascript - 动画 SVG viewBox 变化

标签 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); 
        }
     });
}   

最佳答案

您可以通过 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>

关于javascript - 动画 SVG viewBox 变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33820012/

相关文章:

css - 为什么我的动画不能正确重复?

javascript - Autocad .dwg 到 SVG 到 PolyMap 的瓷砖,从而产生事件平面图

javascript - 在浏览器中将 svg 转换为 png 图像(包括 IE 在内的跨浏览器)

javascript - 如何基于bower/npm自动生成Tern工程文件?

javascript - 当我从子进程调用它时,useState 值会发生变化

javascript - Slider Revolution 只出现在 Internet Explorer 中

javascript - 使用 D3 标记动画折线图

javascript - 如何在 SequelizeJS 中使用 $in 运算符?

c# - 不使用 XNA 或其他第三方库的 2d Sprite 动画

css - 带有 <object> 的 SVG Sprite 图