组件动画

更新时间:

除了提供常规的 CSS 样式动画,蓝河系统还具备 JS 组件动画的方法。相比于 CSS 样式动画,这种动画方式拥有更为灵活、个性化的逻辑控制能力,可以轻松实现各种精彩、生动的元素动态效果,丰富页面交互和用户体验。此外,我们的 JS 组件动画对于响应式界面设计也提供了更佳的支持,将会为您的项目开发带来更大的便捷和效率。

Element.animate()

这是一个创建新 Animation 的便捷方法,将它应用于元素,会返回一个新建的 Animation 对象实例;调用其 play 方法,即可执行动画,表现为一系列简单的变换 (位置、大小、旋转角度、背景颜色和不透明度)。

语法

const element = this.$element('elementIdName')
const animation = element.animate(keyframes, options)
animation.play()
复制代码

参数

keyframes 关键帧

代表关键帧的一个数组集合。目前支持的属性有:

名称 类型 默认值 描述
width <number> - 动画执行后应用到组件上的宽度值。
height <number> - 动画执行后应用到组件上的高度值。
opacity <number> 1 动画执行后应用到组件上的不透明度值介于 01 间的数值。
transformOrigin <String> '50% 50%' 定义变化过程的中心点。
第一个参数代表 x 轴,第二个参数代表 y 轴,单位 px 或百分比值;
transform <object> - 定义应用在元素上的变换类型,支持下表列出的属性。

如上 transform 参数说明如下:

参数名 类型 默认值 描述
translate/translateX/translateY <length> - 指定元素要移动到的位置,例如: translate: 10px 10px, translateX: 10px,translateY: 10px
scale/scaleX/scaleY Number - 按比例放大或缩小元素,例如:scale: 1.5, scale: 1.5 2, scaleX: 2, scaleY: 2
rotate <deg> - 指定元素将被旋转的角度,例如: rotate: 45deg
const keyframes = [
  {
    transform: '{scaleX:1, scaleY:1}',
  },
  {
    transform: '{scaleX:2, scaleY:2}',
  },
]
复制代码

options 可选项

名称 类型 默认值 描述
id <string> 从'0'开始自减的 string 动画 id。为减小内存消耗,请开发者尽可能使用该字段复用动画。注:1. 复用动画后,被复用的前一个动画的 onfinish 等实例事件将被清除,不被触发; 2. 请勿使用从'0'开始自减的 string 作为 id,以免与引擎内部 id 重复。
delay <number> 0 延迟动画开始的毫秒数。
fill "forwards" | "none" "none" 在动画完成播放("forwards")之后保留,"none" 重复动画播放
duration <number> 0 每次迭代动画完成所需的毫秒数。如果此值为 0,则不会运行动画。
easing linear | ease | ease-in | ease-out | ease-in-out | 自定义 cubic-bezier,例如cubic-bezier(0.42, 0, 0.58, 1) linear 动画的变化率,随着时间的推移而变化。

实例方法

方法 参数 描述
play - 开始执行动画
finish - 结束动画
pause - 暂停动画
cancel - 取消动画
reverse - 反转动画执行方向

实例事件

事件 描述 示例
cancel 动画被取消 animation.oncancel = () => { //do something }
finish 动画执行结束 animation.onfinish = () => { //do something }

示例 Demo

<template>
  <div class="page-wrapper">
    <input type="button" class="button" onclick="onCallAnimationClick" value="Animation 动画" />
    <text id="animation">{{ mTextState }}</text>
  </div>
</template>

<script>
  let $animation = null
  export default {
    data: {
      mTextState: 'Init',
    },

    onCallAnimationClick() {
      const keyframes = [
        {
          transform: {
            translateX: 0,
            translateY: 0,
          },
        },
        {
          transform: {
            translateX: '100px',
            translateY: '100px',
          },
        },
      ]
      const options = {
        duration: 1000,
        easing: 'linear',
        delay: 0,
      }
      const cAnimationNode = this.$element('animation')
      $animation = cAnimationNode.animate(keyframes, options)
      // 将会延迟至 (delay + startTime) ms 后执行动画;
      $animation.startTime = 1000
      this.mTextState = $animation.playState
      $animation.oncancel = () => {
        this.mTextState = $animation.playState
      }
      $animation.onfinish = () => {
        this.mTextState = $animation.playState
      }
      $animation.play()
    },
  }
</script>

<style>
  .page-wrapper {
    flex-direction: column;
    justify-content: center;
    align-items: center;
  }
  .button {
    color: #20a0ff;
    background-color: #ffffff;
    padding: 10px 20px;
    border: 1px solid #20a0ff;
    border-radius: 40px;
  }
</style>
复制代码
以上内容对您是否有帮助?
  • 毫无帮助
  • 帮助不大
  • 一般
  • 很好
  • 非常好
意见反馈