animate()

介绍

Elementanimate() 方法是在 JS 侧给 UI 元件设置 CSS Animation 动画的快捷方法。

  1. 使用 getElementById API, 根据 id 查找需要做动画的 Element 对象。
  2. 调用 Element 对象上的 animate API 实现动画。

语法

animate(keyframes, options);

参数

keyframes

两种不同的格式

  1. 一个由多个关键帧的属性和值组成的对象所构成的数组
element.animate(
  [
    {
      // from
      opacity: 0,
      color: '#fff',
    },
    {
      // to
      opacity: 1,
      color: '#000',
    },
  ],
  2000,
);
  1. 一个 key 是 offset,value 是关键帧组成的对象
element.animate({
  '0%': {
    // from
    opacity: 0,
    color: '#fff',
  },
  '50%': {
    // 50%
    opacity: 0.5,
    color: '#aaa',
  },
  '100%': {
    // to
    opacity: 1,
    color: '#000',
  },
});
备注

Animate API 也支持 Segment Timing Function,因此你也可以在 Animate API 中为每段 Keyframe 单独指定 Timing Function。

options

包含一个或多个属性的对象

KeyValue类型是否可选说明默认值
durationNumberoptional动画持续时间0
delayNumberoptional动画开始生效前的延迟时间0
iterationsNumberoptional动画的重复次数。可以将其设为Infinity令动画无限循环。1
directionStringoptionalWhether the animation runs forwards (normal), backwards (reverse), switches direction after each iteration (alternate), or runs backwards and switches direction after each iteration (alternate-reverse). Defaults to "normal"."normal"
easingStringoptional动画的时间函数,表示动画在时间上的变化速率。接受一个timing-function,例如"linear", "ease-in", "step-end", or "cubic-bezier(0.42, 0, 0.58, 1)""linear"
fillStringoptional表示动画在执行之前和之后如何将样式应用于其目标,接受一个animation-fill-mode,例如"backwards""forwards""both""none"
nameStringoptional动画的名字,可作为动画的唯一标识。该名字会出现在动画事件参数中,通常用于判断某个动画事件是否是你想要的。内部的unique ID
play-stateStringoptional动画的运动状态,定义一个动画是否运行或者暂停,接受一个animation-play-staterunning
备注
  1. 若没有指定 name,每次由 Lynx SDK 生成一个自增的 unique id 作为 name。
  2. 相同 name 的动画无法连续多次触发。

返回值

返回 Animation 对象。 Animation 对象上的方法:

方法名说明
Animation.cancel()取消动画的执行,会触发animation cancel事件。
Animation.pause()暂停动画的执行。
Animation.play()恢复动画的执行。

示例

let ani = lynx.getElementById('test').animate(
  [
    {
      'background-color': 'blue',
      transform: 'translateX(100px) translateY(300px) rotate(360deg)',
    },
    {
      'background-color': 'red',
      transform: 'translateX(0px) translateY(600px) rotate(0deg)',
    },
  ],
  {
    duration: 3000,
    delay: 1000,
    iterations: Infinity,
    direction: 'alternate',
    easing: 'ease-in-out',
    fill: 'both',
  },
);

// 当参数为Object时,严格要求百分比写法为带有百分号的百分数 诸如'.50','50'等值都会被除以100
let ani = lynx.getElementById('test').animate(
  {
    '0%': {
      transform: 'rotate(0deg)',
      left: '0px',
    },
    '50%': {
      // 中间帧的属性可以缺省
      left: '30px',
    },
    '100%': {
      transform: 'rotate(225deg)',
      left: '100px',
    },
  },
  {
    duration: 3000,
    delay: 1000,
    iterations: Infinity,
    direction: 'alternate',
    easing: 'ease-in-out',
    fill: 'both',
  },
);

ani.pause();
ani.play();
ani.cancel();

动画事件

Animate API 的事件和 CSS Animation 动画事件相同。

其他信息

INFO
  • Animate API 与 CSS Animation 会互相覆盖,后生效的那一方会覆盖前者。

  • 每次调用 lynx.getElementById("test").animate 都会生成一个新的 Animation 对象。

  • Animate Api 暂只支持创建一个动画,未来会支持创建多个。因此现在若对一个节点多次调用 lynx.getElementById("test").animate,最后创建的动画会覆盖前面的动画。

  • 一个 Animation 对象对应的动画结束后,若想重启一个同样的动画,需要重新调用 lynx.getElementById("test").animate 创建一个新的 Animation 对象。

  • Animate API 暂只支持 getElementById API,对 SelectQuery API 的支持还未接入。

TIP

Animate API 不生效,可能是 getElementById 未能选中节点:

  • 可能是 ID 选择器不正确
  • 可能是 ID 选择器的值依赖复杂 JS 表达式,导致 ID 选择器的值无法在首屏得到,此时若 getElementById 的时机过早 (如在 ComponentDidMount),则可能找不到节点

参见

兼容性

LCD tables only load in the browser

除非另有说明,本项目采用知识共享署名 4.0 国际许可协议进行许可,代码示例采用 Apache License 2.0 许可协议进行许可。