SVG trigger animation with event
Solution 1
Here's an article that covers what you need:
http://dev.opera.com/articles/view/advanced-svg-animation-techniques/
Edit: link is removed. Archived copies:
- https://github.com/operasoftware/devopera-static-backup/blob/master/http/dev.opera.com/articles/view/advanced-svg-animation-techniques/index.html
- http://web.archive.org/web/20140228202850/http://dev.opera.com/articles/view/advanced-svg-animation-techniques
In short:
Create the
<animation>
withbegin="indefinite"
so that it won't treat the animation as starting on document load. You can do this either via JavaScript or raw SVG source.-
Call
beginElement()
on theSVGAnimationElement
instance (the<animate>
element) when you're ready for the animation to start. For your use case, use a standardaddEventListener()
callback to invoke this method when you're ready, e.g.myAnimationElement.addEventListener('mySpecialEvent',function(){ myAnimationElement.beginElement(); },false);
Solution 2
Start an SVG animation:
Without javascript, using the "event-value" type of the begin attribute="id.event" (without an "on" prefix) on an animation element; or
<svg xmlns="http://www.w3.org/2000/svg" width="600px" height="400px">
<rect x="10" y="10" width="100" height="100">
<animate attributeName="x" begin="go.click" dur="2s" from="10" to="300" fill="freeze" />
</rect>
</svg>
<button id="go">Go</button>
(W3C 2018, "SVG Animations Level 2, Editor’s Draft", https://svgwg.org/specs/animations/), " Attributes to control the timing of the animation", "begin" attribute, "event-value" value type, https://svgwg.org/specs/animations/#TimingAttributes
From javascript, by setting an animation element's begin attribute to "indefinite"; and calling beginElement() from script;
function go () {
var elements = document.getElementsByTagName("animate");
for (var i = 0; i < elements.length; i++) {
elements[i].beginElement();
}
}
<svg xmlns="http://www.w3.org/2000/svg" width="600px" height="400px">
<rect x="10" y="10" width="100" height="100">
<!-- begin="indefinite" allows us to start the animation from script -->
<animate attributeName="x" begin="indefinite" dur="2s" from="10" to="300" fill="freeze" />
</rect>
</svg>
<button onclick="go();">Go</button>
(W3C 2018, "SVG Animations Level 2, Editor’s Draft", https://svgwg.org/specs/animations/), " Attributes to control the timing of the animation", "begin" attribute, "indefinite" value type, https://svgwg.org/specs/animations/#TimingAttributes
Related videos on Youtube
Comments
-
Hendekagon almost 2 years
how do I trigger an svg animate element to begin animating via javascript with an arbitrary event ? I'm imagining something like
begin="mySpecialEvent"
, then later I can sendmySpecialEvent
and the animation will start (or start again if it has already played).-
Phrogz over 12 years+1 for a great question; I had been wondering the same thing for a separate question. Now that I know how to kick off SVG animation on demand I can improve that answer. :)
-
-
Mike Aski over 11 yearsGreat. In fact, simply calling
beginElement()
also made the job. -
Starwave about 9 yearsUnfortunately, doesn't work on IE: "Object doesn't support property or method 'beginElement'"
-
Phrogz about 9 years@Starwave Very little works in IE. This is an unfortunate fact of web development.
-
web-tiki about 9 years@Phrogz the first link in answer is dead. Maybe it can be replaced by this one w3.org/TR/SVG/interact.html#SVGEvents ?
-
Persijn about 8 yearsWhat are we going to use now that SVG animations are not longer supported?
-
JoshuaDavid almost 8 years@Persijn You can use CSS animations to achieve just about everything you can with SMIL.
-
David Smith over 7 yearsSVG animations (aka SMIL animations) are no longer depreciated: groups.google.com/a/chromium.org/forum/#!topic/blink-dev/…
-
Tucaen almost 4 yearsThis has one drawback. You can no longer reference this animation to start others. For example this is not working ``` <animateMotion #flyUpText id="moveAnimation" dur="1s" begin="indefinite" path="M 0 0 25 -50" /> <set attributeName="display" to="block" begin="moveAnimation.begin" /> <set attributeName="display" to="none" begin="moveAnimation.end" /> ``` Or am I doing someting wrong? When setting
begin
of#flyUpText
to "0s" it's working as expected. Besides it's triggered right away. -
ashleedawg over 3 yearslol,
Very little works in IE