SVG has been one of the most underused technologies when it comes to web development. Despite it’s usefulness and powerful possibilities it’s still a mystery to many and when it comes to integrating it and using animations, many developers don’t know where to start. With great libraries like Snap.svg the use of SVG assets becomes more easy and today we’d like to explore how to animate SVG icons.
You’ve surely seen some great examples of animated icons using CSS transitions and animations like the Navicon Transformicons by Bennett Feely which were explained in this excellent collaborative tutorial by Sara Soueidan. We want to try to do something similar using SVG icons with the help of Snap.svg.
Please note that we are working with a modern JavaScript library for manipulating our SVGs. Older and non-supporting browsers will not be capable of all features.
The first thing we do is to create some SVG icons using an SVG editor like Inkscape. We used a size of 64×64 pixel for the icons.
For each icon we want a special animation to happen. For example, for the zoom icon we’ll want to scale up the plus path. We’ll define what will happen for each icon in our script.
We’ll add the icons dynamically to our page using Snap.svg and if SVG is not supported we’ll simply show a background image for the span elements that we use to wrap each graphic:
1
2
3
4
5
| < section class = "si-icons" > < span class = "si-icon si-icon-play" data-icon-name = "play" ></ span > < span class = "si-icon si-icon-monitor" data-icon-name = "monitor" ></ span > <!-- ... --> </ section > |
1
2
3
| .no-svg .si-icon-play { background-image : url ( '../png/play.png' ) } .no-svg .si-icon-monitor { background-image : url ( '../png/monitor.png' ) } |
If you add the class “si-icon-reverse” to the span, the icon will be initially rendered with the reversed “shape”. For instance, if you want to display the stop icon rather than the play icon, you can achieve that in the following way:
1
| < span class = "si-icon si-icon-reverse" data-icon-name = "play" ></ span > |
Now let’s take a look at what we are doing in the JavaScript. The idea is to do something with each icon. That can be some kind of transformation, like a rotation or a scale, or a change of a path altogether. With the Snap.svg we can dynamically load our SVGs, which we store in a folder, and manipulate them in a very practical way thanks to the powerful API.
The configuration variable for the icons, “svgIconConfig” has all the animation settings for each icon.
Let’s take a look at its logic:
1
2
3
4
| [icon name - same name given to the data-icon-name] : { url : [url of the svg file], animation : [array of animation configs for each element] } |
1
2
3
4
| { el : [element selector], animProperties : [animation config for the initial/from and final/to state] } |
1
2
3
4
5
6
7
| from : { val : [animation name value pairs], after : [attribute name value pairs to be applied when the animation ends], before : [attribute name value pairs to be applied before the animation starts], delayFactor : [animation delay factor], animAfter : [animation name value pairs to be applied when the animation ends] } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| myIconName : { url : 'svgs/myIconName.svg' , animation : [ { el : 'path:nth-child(5)' , animProperties : { from : { val : '{"path" : "m 61.693118,24.434001 -59.386236,0 29.692524,19.897984 z"}' , animAfter : '{"stroke" : "#000"}' }, to : { val : '{"path" : "m 61.693118,24.434001 -59.386236,0 29.692524,-19.7269617 z"}' , animAfter : '{"stroke" : "#444"}' } } }, { el : 'rect:nth-child(3)' , animProperties : { from : { val : '{"transform" : "t0 0"}' , after : '{ "opacity" : 0 }' }, to : { val : '{"transform" : "t-10 -10"}' , before : '{ "opacity" : 1 }' } } } ] } |
1
| new svgIcon( element, configuration [, options] ); |
1
2
3
4
5
6
7
8
| { speed : 200, // animation speed easing : mina.linear, // animation esing evtoggle : 'click' , // event: click || mouseover size : { w : 64, h : 64 }, // size onLoad : function () { return false ; }, // callback on svg load onToggle : function () { return false ; } // callback on toggle (click or mouseover/mouseout) } |
source: http://tympanus.net/codrops/2013/11/05/animated-svg-icons-with-snap-svg/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+tympanus+%28Codrops%29
0 komentar:
Post a Comment