SVG Egg Morph动画

时间:2013-04-07 00:29:45

标签: javascript animation svg transformation

我想将一个简单的SVG路径转换为另一个。我想使用JavaScript来控制何时发生这种情况。

这是我创建的JSFiddle的链接,作为我正在尝试做的简化示例:http://jsfiddle.net/brentmitch/RqRjq/

以下是该示例使用的基本代码:

function makeEgg() {
    var svgContainer = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
    svgContainer.setAttribute("version", "1.1");
    svgContainer.setAttribute("width", "142.308px");
    svgContainer.setAttribute("height", "142.308px");
    svgContainer.setAttribute("id", "curvecontainer");
    svgContainer.setAttribute("x", "0px");
    svgContainer.setAttribute("y", "0px");
    var eggPath = document.createElementNS('http://www.w3.org/2000/svg', 'path');
    eggPath.setAttribute("id", "eggpath");
    eggPath.setAttribute("d", "M126.308,83.154c0,39.297-32.718,56.154-55.154,56.154S16,122.451,16,83.154S50,0,71.154,0S126.308,43.856,126.308,83.154z");
    eggPath.setAttribute("fill", "GoldenRod");
    svgContainer.appendChild(eggPath);
    document.getElementById('svgcontainer').appendChild(svgContainer);
}

function changeToArrow() {
    var animateEggPath = document.createElementNS('http://www.w3.org/2000/svg', 'animate');
    animateEggPath.setAttribute("id", "egganimation");
    animateEggPath.setAttribute("xlink:href", "#eggpath");
    animateEggPath.setAttribute("attributeType", "XML");
    animateEggPath.setAttribute("attributeName", "d");
    animateEggPath.setAttribute("from", "M126.308,83.154c0,39.297-32.718,56.154-55.154,56.154S16,122.451,16,83.154S50,0,71.154,0S126.308,43.856,126.308,83.154z");
    animateEggPath.setAttribute("to", "M126.308,95.154c0,39.297-17.333-28.667-39.769-28.667S16,134.451,16,95.154S50,12,71.154,12   S126.308,55.856,126.308,95.154z");
    animateEggPath.setAttribute("dur", "4s");
    animateEggPath.setAttribute("fill", "freeze");
}

function resetToEgg() {
    var animations = document.getElementById('egganimation');
    document.getElementById('eggpath').removeChild(animations);
}

使用SVG,它会产生一个蛋,将其变形为箭头,然后通过移除动画节点重置它。我遇到的问题是动画只能在第一次使用。当我尝试重置它并再次运行时,它不再动画。它只是立即转换为箭头。我必须重新加载/刷新浏览器窗口才能再次进行动画制作。

我知道Raphael JavaScript库对于这种动画很棒,但我想做的只是一个简单的变形。我的访问者大多数都会使用移动设备,所以我想避免加载一个库只是为了做一个简单的动画。

2 个答案:

答案 0 :(得分:3)

动画在时间轴上运行。动画时间基本上从0开始,然后当你运行动画时它运行到4秒。当您删除并重新添加动画时,您不会重置时间轴,因此动画将从4秒(即结束点)开始运行。您可以通过调用setCurrentTime来重新启动时间轴......

function resetToEgg() {
    var animations = document.getElementById('egganimation');
    document.getElementById('eggpath').removeChild(animations);
    curvecontainer.setCurrentTime(0);
    document.getElementById('arrowbutton').style.display = "inline";
    document.getElementById('resetbutton').style.display = "none";
}

答案 1 :(得分:0)

好的,所以首先代码有点乱,所以我没有花很多时间浏览每一行而且我道歉如果我错过了一些重要的东西。

因为您的初始功能makeEgg()changeToArrow(),所以我将这些功能单独留下了。

我修改了来自resetToEgg()的前两行:

var animations = document.getElementById('egganimation');
document.getElementById('eggpath').removeChild(animations);

var animations = document.getElementById('curvecontainer');
document.getElementById('svgcontainer').removeChild(animations);

这样就删除了svg元素。接下来我添加了makeEgg();以便重置鸡蛋

以下是功能完整的版本http://jsfiddle.net/berodam/hArrb/