# Performant Animations Using KUTE.js: Part 3, Animating SVG

The previous tutorial of the series showed you how to animate different CSS properties of any element using KUTE.js. However, the core engine does not allow you to animate properties that are specific to SVG elements. Similarly, you can't animate the SVG morphing of different path shapes or the drawing of different SVG elements using strokes. You will have to use the KUTE.js SVG plugin to achieve any of these tasks.

Before we begin, keep in mind that you will have to include both the KUTE.js core engine and the SVG plugin for the examples in this tutorial to work.

## Morphing SVG Shapes

Morphing one SVG shape into another is a very common feature that you will come across. The KUTE.js SVG plugin gives us everything that we need to create our own morphing animations with ease.

There are three ways to morph SVG shapes using this library:

1. You can use the fromTo() method to specify both the initial and the final SVG path for your element.
2. You can also use the to() method and avoid specifying the initial path. In this case, the start value for the morphing will be determined based on the value of the d attribute of the selected element that you want to morph.
3. One more option that you have is to pass the final path as a string directly to the tween. This way, you can avoid having two different paths in your SVG.
 1 KUTE.fromTo('#shape-a', {path: '#shape-a' }, { path: '#shape-b' });  2 KUTE.to('#shape-a', { path: '#shape-b' });  3 4 KUTE.fromTo('#shape-a', {path: '#shape-a' }, { path: 'The path of #shape-b as a valid string.' });  5 KUTE.to('#shape-a', { path: 'The path of #shape-b as a valid string.' }); 

During initialization, the library samples some points based on the paths that we provided. These points are then stored in two different arrays. Finally, these arrays are used for the interpolation. There are a number of options that you can configure to control the morphing behavior for different paths.

• morphPrecision: As you might have guessed, this option allows you to specify the precision or accuracy of the morphing. It is specified as a number, and a lower value means higher precision. Keep in mind that higher precision will result in more accuracy, but it will also be detrimental to the performance. This option does not apply when you are dealing with polygonal shapes or paths where the d attribute consists only of hl, and v. In such cases, the original polygon paths are used instead of sampling new ones.
• reverseFirstPath: You can set the value of this option to true in order to reverse the drawing path for your first shape. Its default value is false.
• reverseSecondPath: You can set the value of this option to true in order to reverse the drawing path for your second shape. Its default value is also false.
• morphIndex: Sometimes, the points on a path might have to cover a lot of distance during morphing. You can control this behavior using the morphIndex parameter. When specified, this parameter allows you to rotate the final path in such a way that all the points travel the least distance possible.

Let's use what we have learned so far to morph a battery icon into a bookmark icon. You should note that I have used lowercase l in order to specify the path in relative terms. This is the required markup:

 1   3  

The following JavaScript creates the tween object and starts the animation on button click:

 1 var morphA = KUTE.to(  2  '#battery-a',  3  { path: '#bookmark-a' },  4  { duration: 5000 }  5 );  6 7 startButton.addEventListener(  8  "click",  9  function() {  10  morphA.start();  11  },  12  false  13 ); 

Here is a demo that shows the above code in action. I have also added an extra element where the morph animation sets reverseFirstPath to true. This will help you understand the overall impact of different configuration options on the morphing. The animation duration has been set to 5 seconds so that you can closely observe both the animations and spot the differences.

In the previous example, the main path did not have any subpaths. This made the morphing very straightforward. However, this might not always be the case.

Let's add an extra subpath to our bookmark as well as the battery icon. If you morph the icons now, you will see that only the first subpath animates. The second subpath just disappears at the beginning of the animation and reappears at the end. The only way to animate all the subpaths in such cases is by changing the subpaths into individual paths. Here is an example:

 1   2   5   8   9   10   12   14   16  

## Animating SVG Strokes

Another popular SVG-related animation effect includes starting from nothing and then drawing a predefined shape using SVG strokes. This can be used to animate the drawing of logos or other objects. In this section, you will learn how to use KUTE.js to create a stroking animation for the Font Awesome bicycle icon

There are three ways to animate SVG strokes in KUTE.js. You can animate from 0% to 100% by setting the fromTo values as 0% 0% and 0% 100%. You can also draw a part of the SVG shape by setting the values to something like 0% 5% and 95% 100%. Finally, you can set the ending value to 0% 0% in order to create an erasing effect instead of a drawing effect.

Here is the JavaScript code that I have used to animate our bicycle:

 1 var wholeAnimation = KUTE.fromTo(  2  "#icon",  3  { draw: "0% 0%" },  4  { draw: "0% 100%" },  5  { duration: 10000}  6 );  7 8 var partialAnimation = KUTE.fromTo(  9  "#icon",  10  { draw: "0% 5%" },  11  { draw: "95% 100%" },  12  { duration: 10000}  13 );  14 15 var eraseAnimation = KUTE.fromTo(  16  "#icon",  17  { draw: "0% 100%" },  18  { draw: "0% 0%" },  19  { duration: 5000}  20 ); 

As you can see in the example below, you don't need to worry about multiple subpaths inside a path. KUTE.js animates all of these subpaths individually without any issues. The animation duration is used to determine the time for the animation of the longest path. The stroke duration for the rest of the subpaths is then determined based on their length.

## Animating SVG Transforms

We have already learned how to animate CSS transform values in the second tutorial of the series. The KUTE.js SVG plugin also allows you to use the svgTransform attribute in order to rotate, translate, scale, or skew different SVG elements on a webpage.

The rotate attribute accepts a single value that determines the angle of rotation. By default, the rotation happens around the center point of the element, but you can specify a new center of rotation using the transformOrigin attribute.

The translate attribute accepts the values in the format translate: [x, y] or translate: x. When provided with a single value, the value of y is assumed to be zero.

When skewing elements, you will have to use skewX and skewY. There is no support for skew[x, y] in SVG. Similarly, the scale attribute also accepts only one value. The same value is used to scale the elements in both x and y directions.

Here is a code snippet that applies all these transformations on a rectangle and a circle.

 1 var rotation = KUTE.allTo(  2  "rect, circle",  3  { svgTransform: { rotate: 360 } },  4  { repeat: 1, yoyo: true }  5 );  6 7 var scaling = KUTE.allTo(  8  "rect, circle",  9  { svgTransform: { scale: 1.5 } },  10  { repeat: 1, yoyo: true }  11 );  12 13 var translation = KUTE.allTo(  14  "rect, circle",  15  { svgTransform: { translate: [100, -50] } },  16  { repeat: 1, yoyo: true }  17 );  18 19 var skewing = KUTE.allTo(  20  "rect, circle",  21  { svgTransform: { skewX: 25 } },  22  { repeat: 1, yoyo: true }  23 ); 

I have set the yoyo parameter to true so that after playing the animation in reverse, the transform properties are set to their initial value. This way, we can replay the animations again and again by clicking on the buttons.

If you press the Rotate button in the demo, you will notice that it does not seem to have any effect on the circle. To observe the rotation of circle, you will have to apply a skew transform on it in order to change its shape and then click on rotate immediately.

## Final Thoughts

We began this tutorial by covering the basics of SVG morphing and stroke animations. You learned how to properly morph complex paths that have subpaths and how we can create an erasing stroke effect instead of a drawing one by choosing the right values for the draw attribute. After that, we discussed how we can use the svgTransform attribute in order to animate different transforms.

In various tutorials, we've seen just how powerful JavaScript has become. It’s not without its learning curves, and there are plenty of frameworks and libraries to keep you busy, as well. If you’re looking for additional resources to study or to use in your work, check out what we have available on Envato Market.

The tutorial was meant to introduce you to all the features of the KUTE.js SVG plugin and help you get started quickly. You can learn more about the SVG plugin by reading the documentation.