【愚公系列】《微信小程序与云开发从入门到实践》035-在小程序中使用动画

举报
愚公搬代码 发表于 2024/12/29 11:46:37 2024/12/29
【摘要】 标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主等。博客内容.NET、...
标题 详情
作者简介 愚公搬代码
头衔 华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。
近期荣誉 2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主等。
博客内容 .NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
欢迎 👍点赞、✍评论、⭐收藏

🚀前言

随着移动互联网的快速发展,小程序以其轻便、便捷的特性,受到了越来越多用户的青睐。而在用户体验日益重要的今天,动画作为增强交互效果和视觉吸引力的重要手段,正逐渐成为小程序开发中的关键元素。

动画不仅能够让小程序的界面更加生动有趣,还可以有效引导用户的注意力,提升整体使用体验。无论是页面切换时的流畅过渡,还是按钮点击时的细腻反馈,巧妙运用动画都能为用户留下一种愉悦的感觉。

🚀一、在小程序中使用动画

🔎1.使用 WXSS 实现动画效果

在微信小程序中,组件的样式可能会随着时间变化而动态调整,例如尺寸、形状、背景色或旋转角度等。当样式发生变化时,直接替换 WXSS 样式表,变化会立即生效,但这可能导致用户体验变得突兀。为了改善这种体验,可以使用渐变动画效果,使样式的变化过程更平滑。

🦋1.1 使用 transition 实现渐变动画

通过使用 transition,可以让样式的变化过程变得平滑,产生渐变效果。下面是一个简单的例子。

☀️1.1.1 示例:使用 transition 实现渐变动画

HTML 代码(animationDemo.wxml):

<!-- pages/animationDemo/animationDemo.wxml -->
<view class="box"></view>

WXSS 代码(animationDemo.wxss):

/* pages/animationDemo/animationDemo.wxss */
.box {
  border-style: solid;
  border-width: 1px;
  display: block;
  width: 100px;
  height: 100px;
  background-color: #0000FF;
  transition: width 2s, height 2s, background-color 2s, transform 2s;
}

.box:hover {
  background-color: #ffcccc;
  width: 200px;
  height: 200px;
  transform: rotate(180deg);
}

解释:

  • transition 属性用于定义渐变动画。此处设置了四个样式变化的渐变效果:
    • width 2s:宽度变化用时2秒
    • height 2s:高度变化用时2秒
    • background-color 2s:背景色变化用时2秒
    • transform 2s:旋转效果用时2秒
  • :hover 伪类:当用户悬停在组件上时,会触发样式变化。此时,色块的宽高、背景色和旋转效果都会进行渐变。

效果:

  • 当用户悬停在色块上时,会看到色块逐渐变大、颜色渐变,并且旋转180度。

🦋1.2 使用 @keyframes 定义关键帧动画

使用 @keyframes 可以创建更复杂的动画效果,支持多个动画阶段,不同于 transition 只定义开始与结束的状态。

☀️1.2.1 示例:使用 @keyframes 实现关键帧动画

WXSS 代码(animationDemo.wxss):

/* pages/animationDemo/animationDemo.wxss */
@keyframes move {
  from {
    margin-top: 0px;
    margin-left: 0px;
    width: 100px;
  }
  50% {
    margin-top: 0px;
    margin-left: 200px;
    width: 50px;
  }
  75% {
    margin-top: 200px;
    margin-left: 200px;
    width: 50px;
  }
  to {
    margin-left: 0px;
    width: 100px;
  }
}

.box {
  border-style: solid;
  border-width: 1px;
  display: block;
  width: 100px;
  height: 100px;
  background-color: #0000FF;
  animation-duration: 3s;
  animation-name: move;
  animation-iteration-count: infinite;
}

解释:

  • @keyframes move 定义了一个名为 move 的关键帧动画:
    • from:动画开始时的样式。
    • 50%:动画进行到一半时的样式。
    • 75%:动画进行到四分之三时的样式。
    • to:动画结束时的样式。
  • animation-duration: 3s:动画持续时间为3秒。
  • animation-name: move:指定使用的关键帧动画名称。
  • animation-iteration-count: infinite:动画将无限循环播放。

效果:

  • 页面上的色块将按照设置的关键帧路径进行循环动画。

🦋1.3 动画控制属性

在 WXSS 中,可以使用以下属性来控制动画的行为:

属性名 描述
animation-name 设置要使用的关键帧动画名称
animation-delay 设置动画延迟多久开始播放
animation-direction 设置动画播放方向,取值:normal(正向播放),alternate(正反循环),reverse(逆向播放),alternate-reverse(逆向首次播放,之后交替播放)
animation-iteration-count 设置动画播放次数,infinite 表示无限循环
animation-play-state 设置动画播放状态,取值:running(播放中),paused(暂停)
animation-timing-function 设置动画的时序函数(例如:ease-inlinear 等)
animation-fill-mode 设置动画结束后的状态,取值:forwards(保持结束状态),backwards(保持开始状态),both(两者都应用)

🦋1.4 事件监听动画过程

你可以为动画添加事件监听器,以便在动画的不同阶段执行相应的操作。下面是一些常用的动画事件:

  • bindtransitionend:当 transition 动画结束时触发。
  • bindanimationstart:当关键帧动画开始时触发。
  • bindanimationiteration:当关键帧动画的某一循环结束时触发。
  • bindanimationend:当关键帧动画结束时触发。

☀️1.4.2 示例:绑定动画事件

HTML 代码(animationDemo.wxml):

<!-- pages/animationDemo/animationDemo.wxml -->
<view class="box" bindtransitionend="transitionend"
      bindanimationstart="animationstart"
      bindanimationiteration="animationiteration"
      bindanimationend="animationend"></view>

JavaScript 代码(animationDemo.js):

// pages/animationDemo/animationDemo.js
Page({
  transitionend: function () {
    console.log("transition 渐变动画执行结束");
  },
  animationstart: function () {
    console.log("关键帧动画开始");
  },
  animationiteration: function () {
    console.log("关键帧阶段完成");
  },
  animationend: function () {
    console.log("关键帧动画结束");
  }
});

效果:

  • 在动画的不同阶段,控制台会输出相应的日志,帮助你调试和控制动画过程。

🔎2.使用小程序框架接口创建动画效果

在微信小程序中,除了通过 WXSS 来定义样式和动画外,还可以利用小程序提供的动画 API 来创建动态效果。使用这些 API,可以更加灵活地控制动画,并且可以不依赖于 WXSS 文件来实现关键帧动画。

🦋2.1 使用 animate 方法创建动画

通过小程序的 animate 方法,可以在页面元素上应用动画效果。这个方法接受四个参数:

  • 元素选择器:选择需要执行动画的元素。
  • 动画关键帧列表:定义动画的关键帧,即动画过程中各个时间点的样式。
  • 动画时长:设置动画执行的时间(以毫秒为单位)。
  • 回调函数:动画结束后执行的回调函数,可以在其中处理动画结束后的清理工作。

☀️2.1.1 示例:点击事件触发动画

JavaScript 代码(animationDemo.js):

// pages/animationDemo/animationDemo.js
Page({
  tapEvent: function() {
    this.animate(".box", [
      { width: '100px', height: '100px', backgroundColor: '#0000FF' },
      { backgroundColor: '#ffcccc', width: '200px', height: '200px', transform: 'rotate(180deg)' }
    ], 500, () => {
      this.clearAnimation(".box");
    });
  }
});

解释:

  • .box:选择器,指定要应用动画的元素。
  • 动画关键帧:通过数组定义关键帧,其中每个对象包含了要应用的样式。
    • 第一个关键帧:定义初始状态,width: '100px', height: '100px', backgroundColor: '#0000FF'
    • 第二个关键帧:定义动画结束时的样式,backgroundColor: '#ffcccc', width: '200px', height: '200px', transform: 'rotate(180deg)'
  • 500:动画时长为500毫秒。
  • 回调函数:在动画完成后,调用 clearAnimation 方法来清除动画效果。

运行效果:

点击页面中的色块时,色块将会执行一个渐变动画,宽高变化、背景色变化,并旋转180度。

🦋2.2 animate 方法的关键帧属性

animate 方法中的关键帧数组对象支持许多不同的属性,类似于 CSS 样式,下面是一些常用的动画属性:

属性名 类型 描述
offset 数字(0~1) 设置关键帧的位置,范围从 0 到 1
backgroundColor 字符串 设置背景颜色
width 字符串 设置宽度
height 字符串 设置高度
top 字符串 设置顶部位置
left 字符串 设置左边位置
opacity 字符串 设置不透明度
transform 字符串 设置变换样式,如 rotate, scale
translate3d 字符串 设置 3D 平移
rotate 字符串 设置旋转角度
scale 字符串 设置缩放比例
skewX/skewY 字符串 设置倾斜角度
matrix 字符串 设置变换矩阵

这些属性可以组合使用,创建复杂的动画效果。

🦋2.3 clearAnimation 方法

clearAnimation 方法用于清除已应用的动画效果,可以在动画执行完毕后调用。它接受三个参数:

  • 选择器:指定要清除动画的元素。
  • 清除选项(可选):一个对象,用于指定要清除的特定动画属性。如果不传递该参数,则会清除所有动画属性。
  • 回调函数(可选):清除动画后的回调函数。

☀️2.3.1 示例:清除动画效果

this.clearAnimation(".box", {}, () => {
  console.log("动画已清除");
});

此时,clearAnimation 会清除 .box 元素上的所有动画效果,且在清除完毕后执行回调函数。

🔎3.交互式动画

大多数动画效果是独立于用户交互的,即动画的执行不会受到用户操作的直接影响。然而,在一些场景中,基于用户交互的动画非常重要。例如,可以根据用户对页面的滚动行为来控制动画的执行。

在小程序开发框架中,animate 方法提供了一个功能,可以在用户滚动时驱动动画的执行。通过将 animate 方法的第四个参数配置为一个对象,你可以实现这种基于滚动交互的动画效果。

🦋3.1 实现滚动驱动的动画

为了实现滚动驱动的动画,需要使用 scroll-view 组件并为其设置一个固定的高度。在用户滚动 scroll-view 时,页面元素的动画效果会根据滚动的进度变化。

☀️3.1.1 示例:实现滚动驱动的动画

animationDemo.wxml 文件:

<!-- pages/animationDemo/animationDemo.wxml -->
<view class="box"></view>
<scroll-view scroll-y="{{true}}" class="scroll">
  <view style="margin-top: 20px; font-size: 60px;">占位数据</view>
  <view style="margin-top: 20px; font-size: 60px;">占位数据</view>
  <view style="margin-top: 20px; font-size: 60px;">占位数据</view>
  <view style="margin-top: 20px; font-size: 60px;">占位数据</view>
  <view style="margin-top: 20px; font-size: 60px;">占位数据</view>
  <view style="margin-top: 20px; font-size: 60px;">占位数据</view>
  <view style="margin-top: 20px; font-size: 60px;">占位数据</view>
  <view style="margin-top: 20px; font-size: 60px;">占位数据</view>
</scroll-view>

解释:

  • scroll-view 组件用于创建一个可以滚动的区域,必须为其设置固定的高度(例如 300px)。
  • 页面中添加了一些占位数据,模拟内容的滚动。

animationDemo.wxss 文件:

/* pages/animationDemo/animationDemo.wxss */
.box {
  border-style: solid;
  border-width: 1px;
  display: block;
  width: 100px;
  height: 100px;
  background-color: #0000FF;
}

.scroll {
  height: 300px;
}

解释:

  • .box 是动画的目标元素,初始状态为宽高 100px,背景色为蓝色。
  • .scrollscroll-view 组件,设置了一个固定的高度 300px。

🦋3.2 在 onReady 生命周期方法中添加动画

在页面的 onReady 生命周期方法中,通过 animate 方法为 .box 元素设置基于滚动驱动的动画。

animationDemo.js 文件:

// pages/animationDemo/animationDemo.js
Page({
  onReady: function() {
    this.animate(".box", [
      { width: '100px', height: '100px', backgroundColor: '#0000FF' },
      { backgroundColor: '#FFCCCC', width: '200px', height: '200px', transform: 'rotate(180deg)' }
    ], 500, {
      scrollSource: '.scroll',             // 绑定交互动画的 scroll-view 组件
      timeRange: 1000,                     // 起始和结束滚动范围映射的时间长度
      startScrollOffset: 0,                // 滚动偏移量的起点
      endScrollOffset: 400,                // 滚动偏移量的终点
      orientation: 'vertical'              // 设置滚动方向,'vertical' 为竖直方向
    });
  }
});

解释:

  • scrollSource: '.scroll':指定滚动视图 (scroll-view) 作为动画触发的源。
  • orientation: 'vertical':设置滚动方向为垂直(竖直方向)。如果要使用水平滚动,可以设置为 'horizontal'
  • startScrollOffset: 0:滚动的起始偏移量,单位为像素,这里设置为 0。
  • endScrollOffset: 400:滚动的结束偏移量,单位为像素,这里设置为 400。
  • timeRange: 1000:设置滚动偏移量的映射时间长度,单位为毫秒,即动画执行的时间。

🦋3.3 滚动驱动的动画效果

当用户滚动 scroll-view 时,.box 元素的宽度、背景色、旋转角度等会根据滚动进度逐渐发生变化。例如,在滚动开始时,.box 的宽度为 100px,背景色为蓝色,随着滚动的进行,.box 的宽度会变为 200px,背景色变为粉红色,且旋转 180 度。

在设置滚动驱动的动画时,可以配置以下属性:

属性名 类型 描述
scrollSource 字符串 选择器,指定要绑定交互动画的 scroll-view 组件
orientation 字符串 设置滚动的方向,可选值为:horizontal(水平方向)、vertical(竖直方向)
startScrollOffset 数值 设置滚动偏移量的起点,单位为像素
endScrollOffset 数值 设置滚动偏移量的终点,单位为像素
timeRange 数值 起始和结束滚动范围映射的时间长度,单位为毫秒

在这里插入图片描述

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。