JavaScript library to make drawing animation on SVG

Overview

vivus.js

Demo available on http://maxwellito.github.io/vivus

Play with it on Vivus Instant

Vivus is a lightweight JavaScript class (with no dependencies) that allows you to animate SVGs, giving them the appearance of being drawn. There are a variety of different animations available, as well as the option to create a custom script to draw your SVG in whatever way you like.

Available via:

Join the conversation on Gitter

Try Vivus with your SVG on Vivus Instant. If you plan to use the library to animate a single SVG without callback or controls, this will allow you to download your animated SVG, powered by CSS, JavaScript free.

Animations

On the following images, the pink color represents the duration value, and the blue one is for delay value.

Delayed

Timeline for delayed animation

Every path element is drawn at the same time with a small delay at the start. This is currently the default animation.

Sync

Timeline for sync animation

Each line is drawn synchronously. They all start and finish at the same time, hence the name sync.

OneByOne

Timeline for oneByOne animation

Each path element is drawn one after the other. This animation gives the best impression of live drawing. The duration for each line depends on their length to make a constant drawing speed.

Principles

To get this effect, the script uses the CSS property strokeDashoffset. This property manages the stroke offset on every line of the SVG. Now, all we have to do is add some JavaScript to update this value progressively and the magic begins.

However, there's a problem with this. The strokeDashoffset property is only available on the path elements. This is an issue because in an SVG there are a lot of elements such as circle, rect, line and polyline which will break the animation. So to fix this, there is another class available in the repo called pathformer. It's made for transforming all objects of your SVG into path elements to be able to use strokeDashoffset and animate your SVGs.

The animation always draws elements in the same order as they are defined in the SVG tag.

There are few conditions that your SVG must meet:

  • All elements must have a stroke property and cannot be filled. This is because the animation only looks to progressively draw strokes and will not check for filled colours. For example: fill: "none"; stroke: "#FFF";

  • You should avoid creating any hidden path elements in your SVG. Vivus considers them all eligible to be animated, so it is advised to remove them before playing with it. If they are not removed the animation might not achieve the desired effect, with blank areas and gaps appearing.

  • text elements aren't allowed, they cannot be transformed into path elements. See #22 for more details.

The code is inspired from other repositories. The drawer is inspired from the excellent Codrops about the post SVG Drawing Animation (if you don't know this website, get ready to have your mind blown). Then for the pathformer, there is a lot of work from SVGPathConverter by Waest.

Usage

As I said, no dependencies here. All you need to do is include the scripts.

Inline SVG

<svg id="my-svg">
  <path...>
  <path...>
  <path...>
</svg>

<script>
  new Vivus('my-svg', {duration: 200}, myCallback);
</script>

Dynamic load

<object id="my-svg" type="image/svg+xml" data="link/to/my.svg"></object>

<script>
  new Vivus('my-svg', { duration: 200 }, myCallback);
</script>

or

<div id="my-div"></div>

<script>
  new Vivus('my-div', { duration: 200, file: 'link/to/my.svg' }, myCallback);
</script>

By default the object created will take the size of the parent element, this one must have a height and width or your SVG might not appear.

If you need to edit this object, it is accessible in the onReady callback:

new Vivus('my-div-id', {
  file: 'link/to/my.svg',
  onReady: function (myVivus) {
    // `el` property is the SVG element
    myVivus.el.setAttribute('height', 'auto');
  }
});

Check out the hacks page for more tricks.

Constructor

The Vivus constructor asks for 3 parameters:

  • ID (or object) of DOM element to interact with.
    It can be an inline SVG or a wrapper element to append an object tag from the option file
  • Option object (described in the following |
  • Callback to call at the end of the animation (optional)

Option list

Name Type Description
type string Defines what kind of animation will be used: delayed, sync, oneByOne, script, scenario or scenario-sync. [Default: delayed]
file string Link to the SVG to animate. If set, Vivus will create an object tag and append it to the DOM element given to the constructor. Be careful, use the onReady callback before playing with the Vivus instance.
start string Defines how to trigger the animation (inViewport once the SVG is in the viewport, manual gives you the freedom to call draw method to start, autostart makes it start right now). [Default: inViewport]
duration integer Animation duration, in frames. [Default: 200]
delay integer Time between the drawing of first and last path, in frames (only for delayed animations).
onReady function Function called when the instance is ready to play.
pathTimingFunction function Timing animation function for each path element of the SVG. Check the timing function part.
animTimingFunction function Timing animation function for the complete SVG. Check the timing function part.
dashGap integer Whitespace extra margin between dashes. Increase it in case of glitches at the initial state of the animation. [Default: 2]
forceRender boolean Force the browser to re-render all updated path items. By default, the value is true on IE only. (check the 'troubleshoot' section for more details).
reverseStack boolean Reverse the order of execution. The default behaviour is to render from the first 'path' in the SVG to the last one. This option allow you to reverse the order. [Default: false]
selfDestroy boolean Removes all extra styling on the SVG, and leaves it as original.

Methods

Name Description
play(speed, callback) Plays the animation with the speed given in parameter. This value can be negative to go backward, between 0 and 1 to go slowly, >1 to go faster, or <0 to go in reverse from current state. [Default: 1]. Callback executed after the animation is finished (optional)
stop() Stops the animation.
reset() Reinitialises the SVG to the original state: undrawn.
finish() Set the SVG to the final state: drawn.
setFrameProgress(progress) Set the progress of the animation. Progress must be a number between 0 and 1.
getStatus() Get the status of the animation between start, progress, end
destroy() Reset the SVG but make the instance out of order.

These methods return the object so you can chain the actions.

const myVivus = new Vivus('my-svg-id');
myVivus.stop().reset().play(2);

Play method callback

Instead of using the global constructor callback when you create the Vivus object, you can add callbacks to be executed for specific play method calls.

const myVivus = new Vivus('my-svg-id');
myVivus.play(1, function () {
  // called after the animation completes
});

// alternativly if you leave the speed param blank and use the default, you
// can pass the callback as the first parameter like so.
myVivus.play(function () {
  // called after the animation completes
});

Timing function

To give more freedom, it's possible to override the animation of each path and/or the entire SVG. It works a bit like the CSS animation timing function. But instead of using a cubic-bezier function, it use a simple JavaScript function. It must accept a number as parameter (between 0 to 1), then return a number (also between 0 and 1). It's a hook.

If you don't want to create your own, timing methods are available via the constructor object: EASE, EASE_IN, EASE_OUT and EASE_OUT_BOUNCE. Then set it in the option object to enjoy them.

// Here, the ease animation will be use for the global drawing.
new Vivus(
  'my-svg-id',
  {
    type: 'delayed',
    duration: 200,
    animTimingFunction: Vivus.EASE
  },
  myCallback
);

WARNING: animTimingFunction is called at every frame of the animation, and pathTimingFunction is also called at every frame for each path of your SVG. So be careful about them. Keep it simple, or it can affect the performance.

Extra attributes

The attribute data-ignore allows you to ignore path tags from the vivus animation.

<svg id="my-svg">
  <path...>
  <path data-ignore="true" ...>
  <path...>
</svg>

In this case, the second path won't be part of the animation.

Scenarize

This feature allows you to script the animation of your SVG. For this, the custom values will be set directly in the DOM of the SVG.

scenario

This type is easier to understand, but longer to implement. You just have to define the start and duration of each element with data-start and data-duration attributes. If it is missing, it will use the default value given to the constructor. The best part of this type is the flexibility it provides. You don't have to respect the order/stack of the SVG and you can start with the last element, then continue with the first to finish with all the rest at the same time.

You will then have to define custom rules for each element in your SVG via extra attributes in your SVG DOM :

  • data-start (integer) time when the animation must start, in frames
  • data-duration (integer) animation duration of this path, in frames
<svg>
  <path data-start="0" data-duration="10" ... />
  <path data-start="20" data-duration="10" ... />
  <path data-start="20" data-duration="20" ... />
  <path data-start="0" data-duration="30" ... />
</svg>

scenario-sync

It's not the sexiest code ever, but it's quite flexible. In addition to this, the behaviour is fairly different. By using this animation type, the default behaviour is the same as oneByOne. However, you can define some properties on a specific path item such as the duration, the delay to start (from the end of the previous path) and if it should be played synchronously.

  • data-delay (integer) time between the end of the animation of the previous path and the start of the current path, in frames
  • data-duration (integer) duration of this path animation, in frames
  • data-async (no value required) make the drawing of this path asynchronous. It means the next path will start at the same time. If a path does not have an attribute for duration or delay then the default values, set in the options, will be used.

Example: here is a simple SVG containing 5 elements. With the following options {duration: 20, delay: 0}, we should get this timeline

Timeline for script animation by default

This looks like 'oneByOne' animation, synchronous mode. But to make it a bit custom, here is what I can do:

<svg>
  <path data-duration="10" ... />
  <path data-delay="10" data-async ... />
  <path data-delay="15" ... />
  <path data-duration="10" data-delay="45" data-async ... />
  <path data-duration="50" data-delay="5" ... />
</svg>

This scenario should give us

Timeline for this custom script animation

I'm sorry if it does not look very sexy, and it's not really easy to use. I'm happy to make any changes, as long as the idea sounds interesting. Post an issue and I'll be very happy to talk about it!

Non Scaling

Some SVG elements might use non scaling properties such as vector-effect="non-scaling-stroke", which requires some additional custom logic. On instance construction Vivus will map all the child elements in the SVG and calculate their line length. If the element is resized during the animation, the calculated stroke style properties become invalid and the SVG will display incorrectly.

To keep animation consistency, the method recalc should be called when the SVG is resized. It will re-calculate the line length on affected child elements on the next frame calculation.

Code example:

// Create your Vivus instance
const vivusObject = new Vivus('my-div', {
  duration: 200,
  file: 'link/to/my.svg',
});

// Create your observer and set up a callback on resize
const resizeObserver = new ResizeObserver((entries) => {
  // Recalculate the line lengths
  vivusObject.recalc();
});

resizeObserver.observe(vivusObject.el);

Vivus will provide a warning in the console when it detects stroke scaling.

Development

To make it simpler a gulp file is set up to automise minifying, JShint and tests. If you have never used Gulp before this is a good opportunity. To use it, you need to install NodeJS first then run sudo npm install -g gulp.

To start, you will need to install the repo dependencies:

$ npm install

Then you can use NPM scripts to run the following tasks:

  • build make the build (generate dist/vivus.js and dist/vivus.min.js)
  • lint run ESlint on the source files
  • test run Karma

Troubleshoot

Internet Explorer

Some SVG weren't working at all. The only solution found was to clone and replace each updated path element. Of course this solution requires more resources and a lot of DOM manipulation, but it will give a smooth animation like other browsers. This fallback is only applied on Internet Explorer (all versions), and can be disabled via the option forceRender.

Replacing each updated path by a clone was the only way to force IE to re-render the SVG. On some SVGs this trick is not necessary, but IE can be a bit tricky with this. If you're worried about performance, I would recommend checking if your SVG works correctly by disabling the forceRender option. If it works correctly on IE, then keep it like this.

By default, forceRender is true on Internet Explorer only.

Firefox

For Firefox users, you might encounter some glitches depending on your SVG and browser version. On versions before 36, there is a problem retrieving path length via getTotalLength method. Returning 174321516544 instead of 209 (I'm not exaggerating, this comes from a real case), messing up the entire animation treatment. Unfortunately, there's nothing that this library can do, this is due to Firefox. I hope to find a workaround, but at the moment I can only recommend that you test your animation on previous versions of Firefox.

Debug

For an easier debug have a look to the attribute map of your Vivus object. This contains the mapping of your animation. If you're using a modern browser, I recommend console.table to get a nice output of the array which will make your debug easier.

const logo = new Vivus('myLogo', { type: 'scenario-sync' });

// The property 'map' contain all the SVG mapping
console.table(logo.map);

Special thanks!

Thanks to all contributors! Also users who pushed me to improve the library by publishing it on NPM, or browser compatibility or features. Also thanks for fixing my awful english :)

and many others...

Comments
  • Embed into object tag

    Embed into object tag

    Hey @jolic I continue the topic here. I wanted to implement your idea but after looking at your code, can you tell me why you need this:

    var _checkElm = function(elm){
        if (elm.constructor === SVGSVGElement) {
            return true;
        }
        if ( typeof elm === 'object' && typeof elm.nodeName !== 'undefined' && elm.nodeName.toLowerCase() === 'svg') {
            return true;
        }
        return false;
    };
    

    Because when I look at the way you implement it, you still provide an SVG object to Vivus. I tried your fork with the unpatched version and it works fine.

    Can you give me more details about it please? Thanks :)

    opened by maxwellito 38
  • Adode Muce

    Adode Muce

    Hello,

    Please advise how that guy did this https://www.youtube.com/watch?v=JbdILohIK90 I used this code in http://prntscr.com/7y628b

    where {param_img1} help to add image from the program. what should be in html sourse in order to animate SVG.

    I hope you can understand the issue. thanks in advance

    opened by termoplus 21
  • Not working in Opera

    Not working in Opera

    Hi,

    very nice plugin, thanks for sharing!

    Not sure why, but Opera is throwing this error (also when visiting the demo site): Uncaught exception: Error: Vivus [constructor]: "element" parameter must be a string or a SVGelement

    Any ideas?

    Thanks

    opened by jordif 18
  • start: 'manual' not working for 'scenario' type

    start: 'manual' not working for 'scenario' type

    Thanks for the library!

    I've got a cool animation going with scenario, but if i try to change start to 'manual' and then call .play(), the callback is called immediately, and the animation doesn't start.

    vivusLogo = new Vivus('logo', {start: 'manual', type: 'scenario', file: 'logo-wordmark3.svg?'+Math.random()})
    
    vivusLogo.play(0.5, function(){ console.log('logo completed') })
    

    The timing directives are explicit in my svg file, and it works with inViewport and autostart.

    opened by sbastias 16
  • Choppy animation in IE Edge

    Choppy animation in IE Edge

    Hello. Any idea why animations look so choppy in IE?

    This is the code I have for each of these icons (there are no more than 4 running at any given time): coursesIcon1 = new Vivus('coursesIcon1', {type: 'delayed', animTimingFunction: Vivus.EASE, animTimingFunction: Vivus.EASE_OUT, duration: 100, start: 'manual', dashGap: 10, forceRender: true});

    vivus-ie

    Thank you in advance.

    opened by ghost 16
  • Add a link

    Add a link

    Hi,

    Could you please help me to add a link to an animated SVG file? Is it possible to add url parameter in this code?

    new Vivus('my-svg-id', { type: 'delayed', duration: 200, animTimingFunction: Vivus.EASE },);

    Thanks

    opened by termoplus 16
  • Converting fill to stroke

    Converting fill to stroke

    Hi, this isn't really an issue with vivus.js itself. I'm just looking for anyone who has advice on what I'm trying to do. If this is not the right place to post this, I apologise.

    Currently new to svg and tried to animate an icon. (http://www.flaticon.com/free-icon/piece-of-cheese_69671) But it hit me that vivus works on svg with paths that are strokes, or shapes, with no fill. However, most outline icons I find are filled.

    I'm wondering if anyone knows a quick way to convert these filled paths into strokes. Or, if you know of a good stroke svg icon resource online that works with vivus. I have tried googling but found no answer. If you can offer any advice I will be very grateful :) Would love very much to explore svgs more!

    opened by mushopea 15
  • Add support for non-scaling-stroke vector effect.

    Add support for non-scaling-stroke vector effect.

    Hey!

    I've added new scaling support for path lengths and included a test with two different kinds of path (identical other than this attribute).

    Fixes https://github.com/maxwellito/vivus/issues/112

    Would love someone to test a bunch of SVGs manually to prove this, but I've tested with my own line graph and it works.

    opened by alexgurr 14
  • Massive Performance Drop With Firefox

    Massive Performance Drop With Firefox

    Version: 0.4.2

    Browser: Firefox (v. 55 64bit)

    I'm getting serious performance issues only on Firefox when using a lot of vivus instances. See the following codepen:

    https://codepen.io/rontdq/pen/RLoBKZ

    Basically I have 38 separate svg's that use vivus to animate a bunch of roads made out of lines. For triggering each road I use jquery waypoints.

    On chrome, Edge and even IE performance is smooth, but on firefox the fps tanks to single digits. If you open the codepen in chrome and firefox you should see the difference. I'm running this all through Windows 10. Is this a browser issue or am I missing something on my end with the js code that I wrote?

    Thanks!

    opened by ghost 14
  • Strange behavior according to browser aspect ratio.

    Strange behavior according to browser aspect ratio.

    I discovered a strange behavior according to browser aspect ratio (width x height). I am testing on MBP 15 inch (Chrome last version). On full screen mode all callbacks fires, console shows no errors, but nothing happens. SVG disappears as it should be, but drawing does not start. Doing absolutely nothing but decrease browser width (with the same height), drawing starts as it should. I completely remove all my media queries in css (for a rock solid tests), it does not help.

    bug 
    opened by sergeyMelentyev 12
  • Miter Join fails on

    Miter Join fails on "closepath" in Google Chrome.

    The following in-lined SVG path works in Chrome, FireFox, IE (svg tags removed github strips svg code) directly from in-lined HTML page:

    path id="A_inner_stroke_red" fill="none" stroke="#FF0E00" stroke-width="5.0233" stroke-linejoin="miter" stroke-miterlimit="10" d="M374.639,119.635 362.166,87.396 349.541,119.635z"/

    However feed it into vivus and ONLY in Chrome:

    The stroke-linejoin = "miter" fails on the "closepath" vertex. It treats the close/start vertex like a "manually" closed subpath (eg instead of closing with 'z' behaviour, it acts like 'lineto' fist vertex 374.639,119.635 behaviour,) applying the ‘stroke-linecap’ value instead?

    FireFox, IE vivus.js performs properly.

    opened by SmartArtsStudio 11
  • Move a pencil while drawing ?

    Move a pencil while drawing ?

    Hello,

    Your work is really great, thank you for this !

    Would it be possible to move a pencil (or another object) along the edge of the drawing ?

    Or is there a callback or a function that could be used to move a specific object from the start to the end of a path, to simulate a moving pencil with some coordinates (e.g. the path's start/end coordinates) ?

    The purpose would be to have a hand writing effect while the SVG paths are appearing one by one

    opened by lauhub 1
  • No

    No "ease-in-out" timing function?

    Hello and thanks for this great little plugin!

    Is there no way do declare a Vivus.EASE_IN_OUT to use the native ease-in-out timing-function? If I enter it, it falls back to linear (as Vivus can't interpret it obviously).

    As Vivus Instant has it, I wonder why the JS translation can't refer to that native function?

    opened by tsawitzki 3
  • Text is drawing immediately

    Text is drawing immediately

    Hi, because this library doesn't support animating text, I converted my text into paths. However, the text is being drawn immediately in a oneByOne animation, before the elements defined before it. Here is a small reproducible example:

    <svg viewBox="0 0 500 500" xmlns="http://www.w3.org/2000/svg">
      <polygon style="fill: rgb(216, 216, 216); stroke: rgb(0, 0, 0);" points="98.095 186.856 217.405 127.227 361.845 99.665 445.304 191.492 422.342 319.34 295.69 428.629 154.023 417.35 38.107 379.199 51.071 272.96 80.155 224.015"/>
      <path d="M 87.154 132.196 L 84.447 131.964 Q 84.911 130.591 86.067 129.817 Q 87.222 129.044 89.127 129.044 Q 91.108 129.044 92.056 129.842 Q 93.003 130.639 93.003 131.79 Q 93.003 132.254 92.921 132.776 Q 92.839 133.298 92.346 135.521 Q 91.94 137.358 91.94 138.093 Q 91.94 138.751 92.172 139.553 L 89.475 139.553 Q 89.31 138.992 89.272 138.393 Q 88.663 139.07 87.87 139.432 Q 87.077 139.795 86.275 139.795 Q 84.998 139.795 84.167 138.958 Q 83.335 138.122 83.335 136.807 Q 83.335 135.338 84.249 134.458 Q 85.163 133.578 87.512 133.394 Q 89.494 133.23 90.161 132.998 Q 90.335 132.418 90.335 132.07 Q 90.335 131.625 89.977 131.326 Q 89.62 131.026 88.914 131.026 Q 88.169 131.026 87.739 131.33 Q 87.309 131.635 87.154 132.196 Z M 89.794 134.767 Q 89.542 134.835 89.127 134.893 Q 87.038 135.144 86.4 135.628 Q 85.946 135.976 85.946 136.566 Q 85.946 137.049 86.294 137.383 Q 86.642 137.716 87.212 137.716 Q 87.841 137.716 88.397 137.412 Q 88.953 137.107 89.228 136.628 Q 89.504 136.15 89.716 135.135 Z" style="white-space: pre;"/>
    </svg>
    

    new Vivus('example', { type: 'oneByOne', duration: 1000 })

    Do you know why it's drawing out of order? Thanks for this library!

    opened by saewitz 0
  • Is there any rewind too?

    Is there any rewind too?

    Thank you for this beauty and creative code; there is a rewind sample in https://maxwellito.github.io/vivus/ would you please add it to https://maxwellito.github.io/vivus-instant/ or there is it and I dont see (at the end the animation will rewind)? I really enjoy it thank you again

    opened by smmsamm 0
  • Problem using stroke based mask using multiple time the same SVG file

    Problem using stroke based mask using multiple time the same SVG file

    Hi !

    I want to mention a problem I've found using masks as paths.

    In my project, I want to achieve a calligraphic effect. To be able to do that, I use a fill-based SVG as the base object then I apply a stroke based white mask on the object. With that, the desired effect is achieved.

    However, if I call 2 times the file like that:

    <div id="svg-a"></div>
    <div id="svg-b"></div>
    
    <script>
    let vivusA = new Vivus("svg-a", {
      duration: 1000,
      type: "oneByOne",
      file: "./path/to/my-file.svg",
    });
    let vivusB = new Vivus("svg-b", {
      duration: 500,
      type: "oneByOne",
      file: "./path/to/my-file.svg",
    });
    </script>
    

    then only vivusA is applied. The same append with inline <svg> tags but not with <object>.

    The problem is due to the fact that the masks have their own ids. So when vivusA is executed, then the first mask, let say it's called "mask1", is executed in both "svg-a" and "svg-b". The problem doesn't append in <object> because it is sandboxed.

    The solution I have is to duplicate the file and to change the ids in the second file.

    Et voilà, I don't know if it is useful or not but at least the information is here if someone wants to use the same trick.

    Have a nice day ! 👋

    opened by Haxos 0
Releases(v0.4.6)
  • v0.4.6(Apr 17, 2021)

  • v0.4.4(Jun 13, 2018)

  • v0.4.3(Nov 8, 2017)

    Implement rounded corners to rect element on Pathformer class. Big thanks to @codebymikey for opening the issue and helping to provide a snippet of code.

    Source code(tar.gz)
    Source code(zip)
  • v0.4.2(Aug 14, 2017)

  • v0.4.1(Jun 7, 2017)

  • v0.4.0(Oct 24, 2016)

    Add callback function on .play(), special thanks to @jsimnz Add reverseStack option. Finally kill the incorrect animation name. async is now sync (but remain retro-compatible to avoid conflicts).

    Source code(tar.gz)
    Source code(zip)
  • v0.3.2(Oct 7, 2016)

    Bug fixes:

    • #118 by @villevuor : patch for Vivus instances from empty SVGs
    • #128 by @tiborsaas : fix path transformation when a position property in a SVG element is missing. (#128)
    Source code(tar.gz)
    Source code(zip)
  • v0.3.1(May 29, 2016)

    Bug fixes, thanks to @schnerd and @jimshell

    #100 : Fix issue with callback executing after destroy #106 : Fix predictable crash while using data-ignore on scenario (and scenario-sync) animations.

    Source code(tar.gz)
    Source code(zip)
  • v0.3.0(Jan 21, 2016)

    Load and insert SVG without object wrapper Fix glitches from Chrome 47 Add manual test pages Add missing methods in the doc Add a 'Thanks' section Clean up demo page Update License

    Source code(tar.gz)
    Source code(zip)
  • 0.2.3(Sep 21, 2015)

    Bug fixes and new features

    Re-apply IE 11 & 12 detection Pathformer bugs about ellipse (typo) and polygon/polyline (trimming) by @TranscendOfSypherus Objects dynamically loaded are now taking the size of the parent element. Might cause some issue if you already use this feature.

    Add data-ignore attribute support to ignore path tags from the animation.

    Add ignoreInvisible option to ignore invisible paths. This is beta feature, by default the value is disabled.

    Source code(tar.gz)
    Source code(zip)
  • v0.2.2(Jul 9, 2015)

  • v0.2.1(Mar 29, 2015)

  • v0.2.0(Mar 8, 2015)

  • v0.1.2(Nov 21, 2014)

    Internet Explorer compatibility Fix glitches Update the API to can chain control methods on Vivus instance Pathformer improved Better documentation and demo page.

    About dev: JShint configuration Lib version in distribution files

    Source code(tar.gz)
    Source code(zip)
Owner
maxwellito
Maker of the useless
maxwellito
A Javascript library to export svg charts from the DOM and download them as an SVG file, PDF, or raster image (JPEG, PNG) format. Can be done all in client-side.

svg-exportJS An easy-to-use client-side Javascript library to export SVG graphics from web pages and download them as an SVG file, PDF, or raster imag

null 23 Oct 5, 2022
Animation library build on top of web animation API (WAAPI)

unanime.js Javascript animation library build on top of web animation API (WAAPI). Learn more about WAAPI: Web animation API Documentation Blog Daniel

Clément Laval 3 Jun 21, 2022
A JavaScript animation plugin for menus. It creates a div that moves when you mouse over an element, giving it an elastic animation.

Lava-Lamp Description: A JavaScript animation plugin for menus. It creates a div that moves when you mouse over an element, giving it an elastic anima

Richard Hung 38 Jun 4, 2022
JustGage is a handy JavaScript plugin for generating and animating nice & clean dashboard gauges. It is based on Raphaël library for vector drawing.

JustGage JustGage is a handy JavaScript plugin for generating and animating nice & clean dashboard gauges. It is based on Raphaël library for vector d

Bojan Djuricic 1.8k Jan 3, 2023
A JavaScript library for drawing network graphs.

Gnet.js Gnet is a JavaScript library for network graph visualization, developed by Goutham. First I want to thank D3.js developers for creating such a

Goutham S 1 May 9, 2021
I made countdown birthday and fireworks animation using HTML Canvas, CSS, JS. The fireworks animation gonna come out once the countdown is finished or in other words, "Birthday Time".

Countdown-Birthday-Fireworks-Animation I made countdown birthday and fireworks animation using HTML Canvas, CSS, JS. The fireworks animation gonna com

Mahardika Bayu S.B 19 Dec 31, 2022
Cross provider map drawing library, supporting Mapbox, Google Maps and Leaflet out the box

Terra Draw Frictionless map drawing across mapping providers. TerraDraw centralises map drawing logic and provides a host of out the box drawing modes

James Milner 106 Dec 31, 2022
a JavaScript library that allows you to make a mouse interaction animation easily.

Cotton.JS is a JavaScript library that allows you to make a mouse interaction animation easily. Getting Started Download npm install cottonjs Manual

Wilson Wu 20 Dec 27, 2022
🍎Transform an SVG icon into multiple themes, and generate React icons,Vue icons,svg icons

IconPark English | 简体中文 Introduction IconPark gives access to more than 2000 high-quality icons, and introduces an interface for customizing your icon

Bytedance Inc. 6.8k Jan 5, 2023
Drawing Newton's fractal using pure js, rust-wasm, SIMDs, threads and GPU

Newton's fractal Runtime Newton's fractal renderer. >>Click<< to open in your browser Inspired by 3blue1brown's video about Newton's fractal. Drawing

Aleksei 86 Nov 17, 2022
A web app demonstrating how the Fourier series can be used to approximate user-inputted line drawing

Fourier Series Animation An interactive React web app that demonstrates how an arbitrary user-inputted line drawing can be approximated using the Four

Jason Wang 31 Dec 22, 2022
A library for boolean aliases to help you make your code more confusing and make your coworkers hate you.

yup-nope A library for boolean aliases to help you make your code more confusing and make your coworkers hate you. Installation Using npm: npm install

Bence A. Tóth 4 Dec 10, 2022
Javascript library for typing animation

typebot Javascript library for typing animation Usage: include <script src="typebot.js"></script> And in js new typebot(element,speed,delay,text,blink

Akshay 17 Oct 18, 2022
A simple but powerful tweening / animation library for Javascript. Part of the CreateJS suite of libraries.

TweenJS TweenJS is a simple tweening library for use in Javascript. It was developed to integrate well with the EaselJS library, but is not dependent

CreateJS 3.5k Jan 3, 2023
A compact JavaScript animation library with a GUI timeline for fast editing.

Timeline.js A compact JavaScript animation library with a GUI timeline for fast editing. Check it out in this example: http://vorg.github.io/timeline.

Marcin Ignac 516 Nov 26, 2022
A flexible and extensible javascript library for letters animation simulations.

LetterLoading LetterLoading js is a javascript library for making awesome letter simulations. It default simulation is a letter loading simulation. Co

kelvinsekx 5 Mar 22, 2022
An easy-to-use JavaScript library aimed at making it easier to draw on SVG elements.

svg-pen-sketch An easy-to-use JavaScript library aimed at making it easier to draw on SVG elements when using a digital pen (such as the Surface Pen).

Kevin Desousa 8 Jul 27, 2022
An animation library, built on the Web Animations API for the smallest filesize and the fastest performance

motion-signals A wrapper over Motion One, An animation library, built on the Web Animations API for the smallest filesize and the fastest performance.

Tanvesh Sarve 48 Dec 27, 2022