Skip to content

Anime.js 简介

一个轻量级的 JavaScript 动画库,使用简单且功能强大的 API。

alt text

alt text

Anime.js 的核心功能包括:

  • CSS 属性动画:支持对 CSS 属性进行动画处理,如颜色、位置、大小等。
  • SVG 动画:能够对 SVG 元素进行动画处理,支持路径动画、形状变换等。
  • DOM 属性动画:可以对 DOM 元素的属性进行动画处理,如文本内容、类名等。
  • JavaScript 对象动画:支持对 JavaScript 对象的属性进行动画处理,适用于更复杂的动画需求。
  • 时间轴控制:提供时间轴功能,允许用户创建复杂的动画序列,并进行精细的控制。
  • 回调和Promise:支持动画运动过程的回调函数,以及基于Promise的动画控制。
html
<!-- 安装依赖包 V4版本 -->
$ npm install animejs --save

<!-- 或者引入js包 -->
<script src="anime.min.js"></script>

Anime.js 使用

js
<div class="selector">anime 动画节点</div>
<div class="selector">anime 动画节点</div>

// V4版本支持按需引入
import {
  animate,
  createTimer,
  createTimeline,
  engine,
  eases,
  spring,
  defaults,
  stagger,
  utils,
  svg,
} from "animejs";

const { x, y, angle } = svg.createMotionPath('path');

// 支持 CSS 选择器、DOM 元素、JavaScript 对象等。
animate(".selector", {
  // 对分配给目标的 CSS 变量进行动画处理
  "--radius": "20px",
  // 动画化多种属性,包括 CSS 属性、SVG 属性、DOM 属性等。
  // 对象语法创建动画几乎就像用简单的英语描述动作一样
  translateX: stagger('1rem', { reversed: true }),
  // 4rem, 3rem, 2rem, 1rem, 0rem
  translateY: { to: 50, duration: 800, ease: "outExpo" },

  translateX: x,
  translateY: y,
  rotate: angle,
  rotate: "1turn",

  // 使用关键帧
  opacity: [
    {from: 0, to: 0.5,duration: 300,ease: "inQuad",},
    {to: 1,duration: 300,ease: "outQuad",},
  ],
  backgroundColor: "#FFF",
  // 画线
  strokeDashoffset: [
    // drawLine:定义线条绘制动画方向
    { to: svg.drawLine('in') },
    { to: svg.drawLine('out') },
  ],

  // 设置动画的持续时间、延迟、方向等参数。
  alternate: true,
  reversed: true,
  ease: "outQuad",
  ease: spring(1, 10, .5, 0),
  // 每秒帧数 (fps)
  frameRate:60,
  // 加快或减慢速度
  playbackRate,
  duration: 1500,
  // 开始之前的延迟时间(以毫秒为单位)
  beginDelay:200,
  delay: function (el, i) {
    return i * 250;
  },
  endDelay: 1000,
  loop: true,

  // 动画是否可以重叠,默认replace:正在运行的动画被剪切,新的动画接管。
  composition: 'replace'|'none'|'add',
  // 允许自定义函数,以便在渲染之前修改动画的数值
  modifier: utils.round(2),
  modifier: v => v % 10

  // 回调函数和 Promise,方便某时刻执行其他操作。
  onBegin: () => {},
  onUpdate: () => {},
  onRender: () => {},
  onLoop: () => {},
  onComplete: function (anim) {
    console.log("Animation completed");
  },

  // 在两个形状之间进行变形,即使它们具有不同的点数:
  points: svg.morphTo(shapeTarget, precision);
});

var easingNames = [
  // in
  'easeInQuad',
  'easeInCubic',
  'easeInQuart',
  'easeInQuint',
  'easeInSine',
  'easeInExpo',
  'easeInCirc',
  'easeInBack',
  'easeInBounce',
// out
  'easeOutQuad',
  'easeOutCubic',
  'easeOutQuart',
  'easeOutQuint',
  'easeOutSine',
  'easeOutExpo',
  'easeOutCirc',
  'easeOutBack',
  'easeOutBounce',
//  inOut
  'easeInOutQuad',
  'easeInOutCubic',
  'easeInOutQuart',
  'easeInOutQuint',
  'easeInOutSine',
  'easeInOutExpo',
  'easeInOutCirc',
  'easeInOutBack',
  'easeInOutBounce',
// OutIn
  'easeOutInQuad',
  'easeOutInCubic',
  'easeOutInQuart',
  'easeOutInQuint',
  'easeOutInSine',
  'easeOutInExpo',
  'easeOutInCirc',
  'easeOutInBack',
  'easeOutInBounce',
]

// 定时器
const mainLoop = createTimer({
  frameRate: 60,
  onUpdate: () => {
    // do something on every frame at 60 fps
  }
});

mainLoop.cancel(); // 完全取消动画并释放内存。
// 取消动画并还原它所做的所有更改,甚至删除内联样式。
mainLoop.revert();

mainLoop.pause(); // Pause the timer
mainLoop.play(); // Play the timer
mainLoop.restart();
mainLoop.reverse();

// 可以定义默认的子项播放参数,同时还可以配置时间轴的播放。
const tl = createTimeline({
  defaults: {
    ease: 'inOutQuad',
    duration: 800
  },
  loop: 2 // 时间线循环两次
});

tl.add('#target', {
  translateX: 100,
  loop: 3, // 每个时间线循环中,循环三次
  alternate: true
})
.add({ duration: 100, onUpdate: () => {} }, '-=200')
.add(() => { /* 使用函数形式 */ }, '-=200')
.set('#target', { translateX: 0 })

// V4 引入了指定时间轴子项时间位置的新方法:
// '<=':在最后一个子动画的结尾处
// '<-=100':最后一个孩子结束前 100ms
// '<=+100':最后一个孩子结束后 100ms
// '<<':在最后一个子项的开头
// '<<-=100':最后一个孩子开始前 100ms
// '<<+=100':最后一个孩子开始后 100ms
// 'LABEL_NAME-=100':标签时间位置前 100ms
// 'LABEL_NAME+=100':标签时间位置后 100 毫秒

tl.play();
tl.pause();
tl.restart();
tl.seek(timeStamp);

// 实用函数utils模块:utils.get(目标、属性、单位)
const widthInEm = utils.get('#target', 'width', 'em'); // '5em'
const widthNumber = utils.get('#target', 'width', false); // 80

utils.set('#set .demo .square', {
  width: 80, // Will set the value in px
  height: '1rem', // Specify unit
  translateX: stagger('3rem', { start: 5, reversed: true, ease: 'in' }),
  color: 'var(--hex-red)', // Non-numeric values allowed
});

// 指定要从中删除目标的 Animation 或 Timeline
utils.remove(targets, Animation | Timeline);

// 删除 Animation 或 Timeline 添加的所有内联样式。
utils.cleanInlineStyles(Animation | Timeline);

// 启用功能promisify: utils.promisify()
utils.promisify(animate(target, { prop: x })).then(doSomething);

// 指定返回值的小数位数。
utils.random(0, 100); // 45
utils.random(0, 100, 2); // 45.39

// 选取随机项
utils.randomPick(Array | NodeList | String);

utils.round(value, decimalLength);
utils.clamp(value, min, max);

// 将Number 捕捉到最接近的指定增量。
utils.snap(value, increment);

// 在定义的 min 和 max 范围之间包装
utils.wrap(value, min, max);

// 将Number 从一个范围映射到另一个范围。
utils.map(value, fromLow, fromHigh, toLow, toHigh);

// 根据给定的进度在两个数字之间进行插值。
utils.interpolate(start, end, progress);

// 将值四舍五入到指定的十进制长度,并在需要时用零填充。
utils.roundPad(value, decimalLength);

// 从一开始就用字符串填充,直到它达到给定的长度。
utils.padStart(value, totalLength, padString);
utils.padEnd(value, totalLength, padString);

// 在两个值之间执行线性插值。
utils.lerp(start, end, amount);


// engine是 Anime.js 的核心。它控制所有 Timers、Animation 和 Timelines 的播放。

// 阻止animation .js使用其内置循环
engine.useDefaultMainLoop = false;
// 防止引擎在隐藏浏览器选项卡时自动暂停
engine.pauseWhenHidden = false
// 获取并设置动画的全局帧速率
engine.frameRate
// 控制所有正在运行的动画的全局播放速率
engine.playbackRate
// 通过停止内置 main 循环来暂停所有正在运行的动画
engine.suspend()
// 恢复内置主循环,并相应地调整所有暂停动画的当前时间
engine.resume()

const render = () => {
  engine.tick(); // 手动推进Anime.js engine引擎
  renderer.render(scene, camera); // Render the Three.js scene
};

// Invoke Three.js built-in animation loop
renderer.setAnimationLoop(render); 

// 通过覆盖defaults对象的属性来修改默认参数
defaults.playbackRate = 1;
defaults.frameRate = 120;
defaults.loop = 0;
defaults.reversed = false;
defaults.alternate = false;
defaults.autoplay = true;
defaults.beginDelay = 0;
defaults.duration = 1000;
defaults.delay = 0;
defaults.endDelay = 0;
defaults.ease = 'outQuad';
defaults.composition = 0;
defaults.modifier = v => v;
defaults.onBegin = () => {};
defaults.onUpdate = () => {};
defaults.onRender = () => {};
defaults.onLoop = () => {};
defaults.onComplete = () => {};

参考:https://github.com/juliangarnier/anime/wiki/What's-new-in-Anime.js-V4

根据 MIT 许可证发布