Anime.js 是一个快速、多用途且轻量的 JavaScript 动画库,拥有简单但强大的 API。
它可以用于 CSS 属性、SVG、DOM 属性和 JavaScript 对象。

使用方法

Anime.js V4 通过引入 ES modules 的方式使用:

javascript import { animate, stagger, } from 'animejs'; animate('.square', { x: 320, rotate: { from: -180 }, duration: 1250, delay: stagger(65, { from: 'center' }), ease: 'inOutQuint', loop: true, alternate: true }); Anime.js 代码示例

V4 文档

完整英文文档请查看 这里

NPM 开发脚本

首先运行 npm i 来安装所有必要的依赖包。
然后通过 npm run <script> 执行以下脚本。

script 功能
dev 监听 src/ 中的改动并将 esm 版本编译到 lib/anime.esm.js
dev-types dev 一样,但还会运行 TypeScript 并生成 types/index.d.ts 文件
build 生成类型定义并将 ESM / UMD / IIFE 版本编译到 lib/
test-browser 启动本地服务器并运行所有浏览器相关的测试
test-node 运行所有 Node 相关的测试
open-examples 启动本地服务器以便本地浏览示例

V4 API 不兼容变更概览

动画

  1. - import anime from 'animejs';
  2. + import { animate, createSpring, utils } from 'animejs';
  3. - anime({
  4. - targets: 'div',
  5. + animate('div', {
  6. translateX: 100,
  7. rotate: {
  8. - value: 360,
  9. + to: 360,
  10. - easing: 'spring(.7, 80, 10, .5)',
  11. + ease: createSpring({ mass: .7, damping: 80, stiffness: 10, velocity: .5}),
  12. },
  13. - easing: 'easeinOutExpo',
  14. + ease: 'inOutExpo',
  15. - easing: () => t => Math.cos(t),
  16. + ease: t => Math.cos(t),
  17. - direction: 'reverse',
  18. + reversed: true,
  19. - direction: 'alternate',
  20. + alternate: true,
  21. - loop: 1,
  22. + loop: 0,
  23. - round: 100,
  24. + modifier: utils.round(2),
  25. - begin: () => {},
  26. + onBegin: () => {},
  27. - update: () => {},
  28. + onUpdate: () => {},
  29. - change: () => {},
  30. + onRender: () => {},
  31. - changeBegin: () => {},
  32. - changeComplete: () => {},
  33. - loopBegin: () => {},
  34. - loopComplete: () => {},
  35. + onLoop: () => {},
  36. - complete: () => {},
  37. + onComplete: () => {},
  38. });

Promise

  1. - import anime from 'animejs';
  2. + import { animate, utils } from 'animejs';
  3. - anime({ targets: target, prop: x }).finished.then(() => {});
  4. + animate(target, { prop: x }).then(() => {});

定时器

  1. - import anime from 'animejs';
  2. + import { createTimer } from 'animejs';
  3. - anime({
  4. + createTimer({
  5. - duration: Infinity,
  6. - update: () => {},
  7. + onUpdate: () => {},
  8. });

时间轴

  1. - import anime from 'animejs';
  2. + import { createTimeline, stagger } from 'animejs';
  3. - anime.timeline({
  4. + createTimeline({
  5. - duration: 500,
  6. - easing: 'easeInOutQuad',
  7. + defaults: {
  8. + duration: 500,
  9. + ease: 'inOutQuad',
  10. + }
  11. - loop: 2,
  12. + loop: 1,
  13. - }).add({
  14. - targets: 'div',
  15. + }).add('div', {
  16. rotate: 90,
  17. })
  18. - .add('.target:nth-child(1)', { opacity: 0, onComplete }, 0)
  19. - .add('.target:nth-child(2)', { opacity: 0, onComplete }, 100)
  20. - .add('.target:nth-child(3)', { opacity: 0, onComplete }, 200)
  21. - .add('.target:nth-child(4)', { opacity: 0, onComplete }, 300)
  22. + .add('.target', { opacity: 0, onComplete }, stagger(100))

stagger(错位动画)

  1. - import anime from 'animejs';
  2. + import { animate, stagger } from 'animejs';
  3. - anime({
  4. - targets: 'div',
  5. + animate('div', {
  6. - translateX: anime.stagger(100),
  7. + translateX: stagger(100),
  8. - delay: anime.stagger(100, { direction: 'reversed' }),
  9. + translateX: stagger(100, { reversed: true }),
  10. });

SVG

  1. - import anime from 'animejs';
  2. + import { animate, svg } from 'animejs';
  3. - const path = anime.path('path');
  4. + const { x, y, angle } = svg.createMotionPath('path');
  5. - anime({
  6. - targets: '#shape1',
  7. + animate('#shape1', {
  8. - points: '70 41 118.574 59.369 111.145 132.631 60.855 84.631 20.426 60.369',
  9. + points: svg.morphTo('#shape2'),
  10. - strokeDashoffset: [anime.setDashoffset, 0],
  11. + strokeDashoffset: svg.drawLine(),
  12. - translateX: path('x'),
  13. - translateY: path('y'),
  14. - rotate: path('angle'),
  15. + translateX: x,
  16. + translateY: y,
  17. + rotate: angle,
  18. });

工具函数(Utils)

  1. - import anime from 'animejs';
  2. + import { utils } from 'animejs';
  3. - const value = anime.get('#target1', 'translateX');
  4. + const value = utils.get('#target1', 'translateX');
  5. - anime.set('#target1', { translateX: 100 });
  6. + utils.set('#target1', { translateX: 100 });
  7. - anime.remove('#target1');
  8. + utils.remove('#target1');
  9. - const rounded = anime.round(value);
  10. + const rounded = utils.round(value, 0);

引擎

  1. - import anime from 'animejs';
  2. + import { engine } from 'animejs';
  3. - anime.suspendWhenDocumentHidden = false;
  4. + engine.pauseWhenHidden = false;
  5. - anime.speed = .5;
  6. + engine.playbackRate = .5;