GithubHelp home page GithubHelp logo

animateplus's Introduction

Animate Plus

Animate Plus is a JavaScript animation library focusing on performance and authoring flexibility. It aims to deliver a steady 60 FPS and weighs less than 3 KB (minified and compressed), making it particularly well-suited for mobile.

Getting started

npm install animateplus or download animateplus.js and start animating things:

import animate from "/animateplus.js";

animate({
  elements: "div",
  duration: 2000,
  delay: index => index * 100,
  transform: ["scale(0)", "scale(1)"]
})
.then(options => animate({
  ...options,
  transform: ["translate(0%)", "translate(500%)"]
}));

Preview this example →

Options

elements

Default Type
null String | Element | NodeList | Array

Determines the DOM elements to animate. You can either pass it a CSS selector or DOM elements.

animate({
  elements: document.body.children,
  transform: ["rotate(0turn)", "rotate(1turn)"]
});

easing

Default Type
out-elastic String

Determines the acceleration curve of your animation.

constant accelerate decelerate accelerate-decelerate
linear in-cubic out-cubic in-out-cubic
in-quartic out-quartic in-out-quartic
in-quintic out-quintic in-out-quintic
in-exponential out-exponential in-out-exponential
in-circular out-circular in-out-circular
in-elastic out-elastic in-out-elastic

The amplitude and period of elastic easings can be configured by providing space-separated values. Amplitude defaults to 1, period to 0.4.

// Increase elasticity
animate({
  elements: "span",
  easing: "out-elastic 1.4 0.2",
  transform: ["translate(0px)", "translate(500px)"]
});

duration

Default Type
1000 Number | Function

Determines the duration of your animation in milliseconds. By passing it a callback, you can define a different duration for each element. The callback takes the index of each element as its argument and returns a number.

// First element fades out in 1s, second element in 2s, etc.
animate({
  elements: "span",
  easing: "linear",
  duration: index => (index + 1) * 1000,
  opacity: [1, 0]
});

delay

Default Type
0 Number | Function

Determines the delay of your animation in milliseconds. By passing it a callback, you can define a different delay for each element. The callback takes the index of each element as its argument and returns a number.

// First element fades out after 1s, second element after 2s, etc.
animate({
  elements: "span",
  easing: "linear",
  delay: index => (index + 1) * 1000,
  opacity: [1, 0]
});

loop

Default Type
false Boolean

Determines if the animation should repeat.

direction

Default Type
normal String

Determines the direction of the animation. reverse runs the animation backwards, alternate switches direction after each iteration if the animation loops.

speed

Default Type
1 Number

Determines the animation playback rate. Useful in the authoring process to speed up some parts of a long sequence (value above 1) or slow down a specific animation to observe it (value below 1).

optimize

Default Type
false Boolean

Forces hardware acceleration during an animation if set to true. Unless you experience performance issues, it's recommended to leave it off as hardware acceleration comes with potentially harmful side-effects.

blur

Default Type
null Object | Function

Simulates a motion blur effect. Takes an object or a function returning an object that specifies the strength of the directional blur on the x and y axes. A missing axis defaults to 0, which disables the blur on that axis.

animate({
  elements: "circle",
  easing: "out-exponential",
  duration: 2500,
  loop: true,
  direction: "alternate",
  blur: {x: 20, y: 2},
  transform: ["translate(0%)", "translate(80%)"]
});

Preview this example →

change

Default Type
null Function

Defines a callback invoked on every frame of the animation. The callback takes as its argument the animation progress (between 0 and 1) and can be used on its own without being tied to elements.

// Linearly outputs the percentage increase during 5s
animate({
  duration: 5000,
  easing: "linear",
  change: progress =>
    document.body.textContent = `${Math.round(progress * 100)}%`
});

Animations

Animate Plus lets you animate HTML and SVG elements with any property that takes numeric values, including hexadecimal colors.

// Animate the radius and fill color of an SVG circle
animate({
  elements: "circle",
  r: [0, 50],
  fill: ["#80f", "#fc0"]
});

Each property you animate needs an array defining the start and end values. For convenience, you can omit everything but the numbers in the end values.

// Same as ["translate(0px)", "translate(100px)"]
animate({
  elements: "span",
  transform: ["translate(0px)", 100]
});

These arrays can optionally be returned by a callback that takes the index of each element, just like with duration and delay.

// First element translates by 100px, second element by 200px, etc.
animate({
  elements: "span",
  transform: index => ["translate(0px)", (index + 1) * 100]
});

Promise

animate() returns a promise which resolves once the animation finishes. The promise resolves to the object initially passed to animate(), making animation chaining straightforward and convenient. The Getting started section gives you a basic promise example.

Since Animate Plus relies on native promises, you can benefit from all the usual features promises provide, such as Promise.all, Promise.race, and especially async/await which makes animation timelines easy to set up.

const play = async () => {
  const options = await animate({
    elements: "span",
    duration: 3000,
    transform: ["translateY(-100vh)", 0]
  });

  await animate({
    ...options,
    transform: ["rotate(0turn)", 1]
  });

  await animate({
    ...options,
    duration: 800,
    easing: "in-quintic",
    transform: ["scale(1)", 0]
  });
};

play();

Preview this example →

Additional functions

stop

Stops the animations on the elements passed as the argument.

import {stop} from "/animateplus.js";

animate({
  elements: "span",
  easing: "linear",
  duration: index => 8000 + index * 200,
  loop: true,
  transform: ["rotate(0deg)", 360]
});

document.addEventListener("click", ({target}) => stop(target));

Preview this example →

delay

Sets a timer in milliseconds. It differentiates from setTimeout() by returning a promise and being more accurate, consistent and battery-friendly. The delay option relies internally on this method.

import {delay} from "/animateplus.js";

delay(500).then(time => console.log(`${time}ms elapsed`));

Browser support

Animate Plus is provided as a native ES2015 module, which means you may need to transpile it depending on your browser support policy. The library works as is using <script type=module> in the following browsers:

  • Chrome 61
  • Safari 11.1
  • Firefox 60

Content delivery networks

Animate Plus is available on CDNJS and jsDelivr.

import animate from "https://cdn.jsdelivr.net/npm/animateplus@2/animateplus.js";

animate({
  elements: "div",
  transform: ["translate(0%)", 100]
});

Best practices

Animations play a major role in the design of good user interfaces. They help connecting actions to consequences, make the flow of interactions manifest, and greatly improve the polish and perception of a product. However, animations can be damaging and detrimental to the user experience if they get in the way. Here are a few best practices to keep your animations effective and enjoyable:

  • Speed: Keep your animations fast. A quick animation makes a software feel more productive and responsive. The optimal duration depends on the effect and animation curve, but in most cases you should likely stay under 500 milliseconds.
  • Easing: The animation curve contributes greatly to a well-crafted animation. The ease-out options are usually a safe bet as animations kick off promptly, making them react to user interactions instantaneously.
  • Performance: Having no animation is better than animations that stutter. When animating HTML elements, aim for using exclusively transform and opacity as these are the only properties browsers can animate cheaply.
  • Restraint: Tone down your animations and respect user preferences. Animations can rapidly feel overwhelming and cause motion sickness, so it's important to keep them subtle and to attenuate them even more for users who need reduced motion, for example by using matchMedia("(prefers-reduced-motion)") in JavaScript.

Examples

  • Stress test: 500 elements animated concurrently.
  • Burst: Intensive burst animation based on mousemove/touchmove.
  • Accordion: Animated accordion.
  • Morphing: CSS polygon morphing using clip-path.
  • Motion path: Animation along a custom path.
  • Line drawing: SVG line drawing animation.
  • Elasticity: SVG circles following your clicks.
  • External SVG: Animating paths from an external SVG file.
  • Anchors: Anchor scrolling animation using change().
  • Progress: Animation progress using change().
  • Text: Text splitting animation.

animateplus's People

Contributors

bendc avatar callmecavs avatar jbpros avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

animateplus's Issues

Animating breaks css padding?

I'm using animate translate x to move an element 100 to the right. Then after that I do the same thing but -100 in an attempt to return it to the original position.

But the final position of the card is off because the original css padding is not acknowledged.

Code:


function drawCard() {
  animate({
    el: "#card",
    translateX: 100,
    opacity: 0,
    duration: 500,
    complete: animateCard
  }); 
}

function animateCard() {
  animate({
    el: "#card",
    translateX: -100,
    opacity: 1,
    duration: 500 
  }); 
}

use pseudo-elements

Hello, master, how do I use pseudo-elements with animateplus ?
For example, using a pseudo-element to achieve sweeping animation effects

Unexpected token export

I am trying to use this in a simple static HTML website. I've imported the raw animateplus.js, however, in chrome it is showing me a JS error "Unexpected token export". What is the best way to resolve this?

async/await not supported by preact-cli

Hey Benjamin,
first of all thx for this great + to my tool-lib. ;-)
As with all of my chosen libs I really appreciate the small footprint and ease of use.
I really would stick with it.

To my problem:
For my webdev I'm working with preact-cli which is currently not supporting async/await, unfortunately see #17 there.
As I understand, this is because the overhead of runtime-transform is too high.

As I dive in animateplus.js I see exactly
1 x async
1 x await

Do you think it is possible to replace these with promise-then (not for your release, just for my preact-problem). Or hopefully you can just give me a hint on how to accomplish it.
I'm really new to async/await-promises, so I didn't get it working until now by myself.

I totally understand if you say: 'not my biz', but I hope you can give me a push in the right direction.
Or you say 'forget it Dude, no way to get this working'.

++++ for animate+
thx again

Misinforming project description

"Animate Plus is a CSS and SVG animation library for modern browsers."

While this technically is true, this description is misinforming in term of animation mechanism - I was surprised when I found out that animateplus use neither css transitions nor css keyframe animations.

Maybe: "Animate Plus is a HTML5 and SVG Javascript-powered animation library for modern browsers." or something similar.

Example Repo

Hi @bendc, thank you for creating this library! Your examples were super inspiring, and I was wondering if there was a way to look at the code to help understand how the library works?

Comparison with other modules?

How would this work in comparison with Greensock or Animejs? I'm considering this one and Animejs (which is slightly bigger) for use in various projects.

Returning a Promise

Hi,

first thank you first this jewel, really a saviour!

Could you consider returning a Promise from animate call?

Would solve #6 and allow use of future async / await out of the box.

Selecting pseudo elements (before/after)

Can pseudo elements be selected ? I am planning to animate bacground image.I have something like this

.container:before {
    background-image: url("xyz.png");
}

How can i select .container:before ?

Thanks !

Map in animate.min.js

How do you compile animate.min.js? It looks like it is compiling some ES6 stuff like const, but not Map, which is causing some sad browsers to be sad.

common.js module not work

Hi,

After install animateplus from npm, this module doesn't support common.js module.export.
Is it possible to include common.js supports? Thanks.

Delay animation

How can I delay animation after finish (inside the loop), before the animation start again?

Thanks,
Rizqi

Parse Error: Unexpected token

Hi there, just wanted to give animateplus a try, but I keep getting this error when importing it into my app.js:

.../node_modules/animateplus/animateplus.js:217
    ...rest
    ^
ParseError: Unexpected token

When using the spread operator directly in my main app.js, it works fine (using Babel)

Cannot call function as a class

Hi there!

I'm very excited to try this out, but I've been trying to import the library in my react project and I cannot get it working unfortunately.

I keep getting the error TypeError: Cannot call a class as a function.

I'm importing as : import animate from 'lib/animateplus'

Any help would be much appreciated!

Best

Blur issues

Hi @bendc,

I noticed a few quirks when previewing your "blur" example.

In Safari (version 11.1), the shape is completely blurred until it fully stops. I mean, blur seems to be applied on both axes while the motion happens on the x axis only. And it's very noticeable. The attached capture shows how it looks when it goes back to the left (snapshot taken just before it pauses).

In Chrome (version 66.0), it is not smooth at all until the shape had gone back and forth 3-4 times.

Maybe these issues are tight to the lack of performance of my mid-2012 MacBook Air (and I can't test on my 5K iMac for now).

capture

Bower

Hi Benjamin,

Would it be possible to push animateplus to the Bower package manager on top of your NPM one?
Great plugin by the way!

Cheers,

Youri

Clarify browser support

Hi,

Wondering if it would be possible to clarify the current browser support in the README? E.g. adding a "Browser Support" section at the end.

Cool project btw, thanks for sharing!

Animate SVG path d attribute

Animate Plus lets you animate HTML and SVG elements with any property that takes numeric values, including hexadecimal colors.

I assume this library can't be used to animate paths like the following?

        <path id="path" d="M0 0 L 300 0 L 300 300.4 L 0 300 Z" fill="#ccc"></path>

Unlike TweenLite or Anime.js?
https://jsfiddle.net/alvarotrigo/6yev2wc0/18/

$('button').click(function() {
    
    TweenLite.to('#path', 1, {
        attr:{d: 'M0 100 L 300 0 L 300 300.4 L 0 300 Z'}
    });
    
    TweenLite.to('#path', 1, {
        attr:{d: 'M50 50 L 300 0 L 300 300.4 L 0 300 Z'}
    }).delay(0.3);

   
});

Add function on each iteration

You can add a step callback function like $ does, A function to be called for each animated property of each animated element.

Cannot call JS method at the end of animation

I want to call the JS method after the animation is finished. It seems that this operation is not supported now, only simple operation can be performed.
Can you answer it? Thank you.

Issue with IE/Edge

I am using this library with vue-cli and got a problem running on IE/Edge. To fix that, I had to transpile with Babel and import the transpilled version instead of the package version.
Basically, what I've done was that:

babel transform-object-rest-spread node_modules/animateplus/animateplus.js --out-file animate.js

and on import part:

import animate from "./animate.js"

Animating percentages from/to px

Seems to be a bug at first:

animate({
  el: 'div',
  translateX: ['100%', 0]
})

or

animate({
  el: 'div',
  translateX: '100%',
  direction: 'reverse'
})

I expect an animation from 100% to 0, but got from 100px to 0. See: http://jsbin.com/fitezotivo/edit?js,output

It seems to occur when animating percentages from/to px (as no unit is converted to px). Using translateX: ['100%', '0%'] fix the first case, but we're still facing the issue when using direction: reverse

Examples not working

None of the examples are currently working. There doesn't appear to be any content inside of the <body>

glitch in webkit browsers on mobile devices

I've noticed that before animation starts (fadeInUp-example) element is visible for less than a 1 sec then animation starts, i'ts really annoying because it ruins the effect. I've tried many things but nothing seems to work, any ideas how to fix this? THIS IS HAPPENING ONLY ON MOBILE DEVICES

is this also suited for 3d transform animations?

I noticed that all of your animation examples are 2d and there isn't any tilt or flip or anything that looks like 3d. I really the simplicity of your syntax but am wondering if this is also suited for mixing 3d and 2d animations together?

Invalid value for path d errors in Chrome and Safari

Hi, @bendc! I ran into a quirk using this (otherwise awesome) library, I'm not sure how to troubleshoot further and figured it might be time to create an issue for it.

I have an SVG illustration of my face (my avatar, actually), and I'm animating its d attribute so that one of the eyes morphs from an open eye to a closed eye.

I can get the animation working using SMIL in Chrome, Firefox and Safari just fine. When I try to do the same animation using animateplus, it works great, but Chrome and Safari report console errors when the animation completes.

Error in Chrome:

animate.min.js:17
Error: Invalid value for <path> attribute d="M103.5,82.4c0,2-3.8,3.9-7.6,3.7c-4.6-0.2-6.4-2-6.4-4.1c0-1.6,1.62.3,72.3C100.3,84.3,103.5,81.3,103.5,82.4z"

Error in Safari:

animate.min.js:17
Error: Problem parsing d="M103.5,82.4c0,2-3.8,3.9-7.6,3.7c-4.6-0.2-6.4-2-6.4-4.1c0-1.6,1.62.3,72.3C100.3,84.3,103.5,81.3,103.5,82.4z"

You can reproduce the problem in this pen I've created: http://codepen.io/tylersticka/pen/b2f6b448692ed74d9d6565ea49ff6849

My first instinct was that my coordinates must not match up... maybe there are odd numbers or something. But I created the second by duplicating the first shape and moving its points around, and a visual inspection of the d attribute seems to support that the points are equal.

So otherwise, I'm stumped! In order of likelihood, I imagine the problem might be...

  1. I did something stupid that you'll identify.
  2. Blink and Webkit are doing something stupid.
  3. There's a legitimate issue with the library.

Thanks in advance for your help! 😬

IE8,IE9 support

Hi, this is a perfect library for creating HTML5 hand-coded banners without using any software (GWD, Adobe Animate). Output is perfect small (lot of ad servers have limits up to 50kB for an HTML5 banner) and does all the animations needed in banners.

Do you plan IE8 and IE9 support ?

How can we easily achieve it when no support is planned, please ?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.