A Look Into: Scalable Vector Graphics (SVG) Animation
Today we are going to continue our discussion on Scalable Vector Graphic (SVG), and this time we are going to work with SVG Animation. Don’t be scared though, SVG Animation is relatively easy and actually in this post we will start from the basics.
Recommended Reading: A Look into Scalable Vector Graphic
Basic Implementation
Animation in SVG can be done through <animate>
element;
<svg> <rect width="200" height="200" fill="slategrey"> <animate attributeName="height" from="0" to="200" dur="3s"/> </rect> </svg>
As you can see from the code snippet above, we add the <animate>
inside the element that is going to affected. This <animate>
contains some of the following attributes;
attributeName: This attribute specifies which element’s attribute will be affected in the animation.
from: This attribute is optional, we can specify an exact value or leave it to let it start from where it was.
to: This attribute specifies the animation direction. Depending on the specified value in attributeName
, the results may vary. But in this example it will extend the height
.
dur: This attribute specifies the animation duration. The value of this attribute is expressed in Clock Value Syntax. For example, 02:33
represents 2 minutes and 33 seconds, while 3h
is equal to 3 hours, but we don’t need that long so we specified the duration for just 3s
or 3 seconds;
The same thing goes to <circle>
element, but this time we target the circle’s radius attribute (r
).
<svg> <circle r="100" cx="100" cy="100" fill="slategrey"> <animate attributeName="r" from="0" to="100" dur="3s"/> </circle> </svg>
Moving Element
In moving SVG elements, we only need to target the element’s coordinate x
and y
;
<svg> <rect x="0" y="0" width="200" height="200" fill="slategrey"> <animate attributeName="x" from="0" to="200" dur="3s" fill="freeze"/> </rect> </svg>
In the example above, we move the rectangle from 0
to 200
in 3 seconds, the rectangle will appear moving horizontally from the left to the right. Also, if you look carefully we also added another attribute to the <animate>
element, namely fill
.
fill
attribute here is nothing to do with the background color like in the other SVG elements. This attribute specifies how the animation will act after the duration ends. In this example we freeze
the affected element so it stays where the animation ends.
It also works similarly to the <circle>
element, we can use cx
or cy
, like so:
<svg> <circle r="100" cx="100" cy="100" fill="slategrey"> <animate attributeName="cy" from="100" to="200" dur="3s" fill="freeze"/> </circle> </svg>
Animate Multiple Attributes
So far, we only target one attribute to be animated, but it is also possible to animate more than one attribute at once. The example below shows how we do it:
<svg> <circle r="100" cx="110" cy="110" fill="slategrey" stroke="#000" stroke-width="7"> <animate attributeName="r" from="0" to="100" dur="3s"/> <animate attributeName="stroke-width" from="0" to="10" dur="7s"/> </circle> </svg>
As you can see, it works in a similar way, only now we have two <animate>
elements inside the <circle>
to target the radius and the stroke width to be affected.
Following a Path
In our previous post on Working with Text in SVG, we have showed you how to flow the Text to a Path. It is also possible to do the same thing in SVG Animation, we can animate an element to follow a Path. Here is an example.
<svg> <defs> <path id="thepath" fill="none" stroke="#000000" d="M0.905,0.643c0,0,51.428,73.809,79.047,166.19s68.095,38.572,107.144-18.095 c39.047-56.667,72.381-92.382,113.333-42.381S335.5,178.5,374,200.5s82-18.5,97.5-33.5"/> </defs> <circle r="15" cx="15" cy="15" fill="slategrey"> </svg>
The Path is better defined within a <defs>
element, like shown above. In order for the element to follow the Path, we need to define the animation with <animateMotion>
and link the path id
with <mpath>
element, as follows;
<animateMotion dur="3s"> <mpath xlink:href="#thepath"/> </animateMotion>
That’s it, now let’s see it in action;
Transformations
We can also use transformation like scale
, translate
and rotate
for the Animation, and to do so we will use <animateTransform>
;
<svg> <rect width="200" height="200" fill="slategrey"> <animateTransform attributeName="transform" type="scale" from="0" to="1" dur="3s"/> </rect> </svg>
Transformations in SVG shares similar principles with CSS3, and we have covered about it quite comprehensively in our previous post about CSS3 2D Transformation.
Final Thoughts
Depending on your proficiency on SVG Animation you can create something like this or maybe this one.
One advantage of using SVG Animation over Flash Animation is that it doesn’t rely on third-party plugins to work and it also considerably faster than Flash. After Adobe stopped their Flash support in Android, you might want to start trying out this approach to serve animation in your next website.
0 nhận xét:
Đăng nhận xét