mpvue小程序循环动画开启暂停的实现方法


Posted in Javascript onMay 15, 2019

用小程序的 animation 属性实现循环动画的开启与暂停,并封装到组件。

实现一个字体图标组件的循环旋转动画开启/暂停

  1. 用于点击图标,字体颜色变换,开始循环旋转动画,并刷新内容
  2. 刷新结束,停止动画,并设置字体颜色为原来的
  3. 主要利用 setInterval 定时器循环执行动画

首先,组件写出来

添加点击事件,动画属性, style 属性(用来动态修改样式)

src/components/refresh.vue

<template>
 <div>
  <div
   class="iconfont icon-shuaxin"
   :animation='refreshA'
   @click="refresh"
   :style='style'></div>
 </div>
</template>

设置初始数据

使用一个 布尔 数据 refreshing 判断动画的状态为开启 true /暂停 false

<script>
export default {
 data () {
  return {
   refreshA: null,
   style: 'color: #eee;',
   // 用来设置存储旋转的度数
   rotate: 0,
   // 存储定时器id
   refreshI: null
  }
 },
 props: ['refreshing']
}
</script>

添加点击事件函数

<script>
export default {
 methods: {
  // 刷新按钮点击
  refresh () {
   // 正在刷新 则跳出,避免在循环动画执行时,再次出发点击刷新事件
   if (this.refreshing) return
   // 否则提交刷新事件
   this.$emit('refresh')
  },
  // 刷新动画结束
  refreshend () {
   // 当动画结束,字体颜色恢复原来
   this.style = 'color: #eee;'
  }
 }
}
</script>

监听 refreshing 状态

<script>
export default {
 watch: {
  refreshing (newV, oldV) {
   // 没有正在刷新 > 正在刷新 设置循环动画
   if (newV && !oldV) {
    this.style = 'color: #fff;'
    this.refreshI = setInterval(() => {
    // 每次 +360 实现每 300 毫秒旋转 360 度 
     this.rotate += 360
     let animation = wx.createAnimation()
     animation.rotateZ(this.rotate).step()
     this.refreshA = animation.export()
    }, 300)
    return
   }
   // 从正在刷新 > 刷新完成 清空循环定时器动画
   if (!newV && oldV) {
    clearInterval(this.refreshI)
    this.refreshA = null
   }
  }
 }
}
</script>

需要注意的是定时器时间必须和动画的过渡时间设置为相同

组件调用

src/pages/index/index.vue

<template>
 <div>
  <Refresh @refresh='refresh' :refreshing='refreshing'/>
 </div>
</template>

<script>
import Refresh from '@/components/refresh'

export default {
 data: {
  // 初始状态肯定为 false ,点击刷新组件后,在事件函数中再设置为 true
  refreshing: false
 },
 components: {
  Refresh
 },
 methods: {
  async refresh () {
  this.refreshing = true
  // 这里为一个异步请求api
  let data = await api.getData()
  // 请求完成,执行想要操作的代码后,设置动画为 false
  // this.data = data
  this.refreshing = false
  }
 }
}
</script>

<style lang="stylus" scoped>
</style>

refresh 组件完整代码

<template>
 <div>
  <div
   class="iconfont icon-shuaxin"
   :animation='refreshA'
   @click="refresh"
   :style='style'></div>
 </div>
</template>

<script>
export default {
 data () {
  return {
   refreshA: null,
   style: 'color: #eee;',
   rotate: 0,
   refreshI: null
  }
 },
 props: ['refreshing'],
 watch: {
  refreshing (newV, oldV) {
   if (newV && !oldV) {
    this.style = 'color: #fff;'
    this.refreshI = setInterval(() => {
     this.rotate += 360
     let animation = wx.createAnimation()
     animation.rotateZ(this.rotate).step()
     this.refreshA = animation.export()
    }, 300)
    return
   }
   if (!newV && oldV) {
    clearInterval(this.refreshI)
    this.refreshA = null
   }
  }
 },
 methods: {
  refresh () {
   if (this.refreshing) return
   this.$emit('refresh')
  },
  refreshend () {
   this.style = 'color: #eee;'
  }
 }
}
</script>

<style lang="stylus" scoped>
</style>

效果

正常效果,看图中右上角

mpvue小程序循环动画开启暂停的实现方法

网速太快

mpvue小程序循环动画开启暂停的实现方法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 动态调整图片尺寸实现代码
Dec 28 Javascript
深入理解JavaScript是如何实现继承的
Dec 12 Javascript
gridview生成时如何去掉style属性中的border-collapse
Sep 30 Javascript
JavaScript基础教程之alert弹出提示框实例
Oct 16 Javascript
jQuery获取浏览器类型和版本号的方法
Jul 05 Javascript
JavaScript ES6中export、import与export default的用法和区别
Mar 14 Javascript
详解vue-cli开发环境跨域问题解决方案
Jun 06 Javascript
VUE实现表单元素双向绑定(总结)
Aug 08 Javascript
详解HTML5 使用video标签实现选择摄像头功能
Oct 25 Javascript
Js判断H5上下滑动方向及滑动到顶部和底部判断的示例代码
Nov 15 Javascript
ES6 迭代器与可迭代对象的实现
Feb 11 Javascript
在vue中使用image-webpack-loader实例
Nov 12 Javascript
微信小程序的tab选项卡的实现效果
May 15 #Javascript
少女风vue组件库的制作全过程
May 15 #Javascript
vue两组件间值传递 $router.push实现方法
May 15 #Javascript
JavaScript+HTML5 canvas实现放大镜效果完整示例
May 15 #Javascript
详解微信UnionID作用
May 15 #Javascript
小程序:授权、登录、session_key、unionId的详解
May 15 #Javascript
javascript+HTML5 canvas绘制时钟功能示例
May 15 #Javascript
You might like
PHP获取MySql新增记录ID值的3种方法
2014/06/24 PHP
让ThinkPHP支持大小写url地址访问的方法
2014/10/31 PHP
thinkphp3.2同时连接两个数据库的简单方法
2019/08/13 PHP
Laravel框架查询构造器 CURD操作示例
2019/09/04 PHP
Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示例
2019/10/12 PHP
Display SQL Server Version Information
2007/06/21 Javascript
jQuery的实现原理的模拟代码 -4 重要的扩展函数 extend
2010/08/03 Javascript
jquery实现简单的拖拽效果实例兼容所有主流浏览器
2013/06/21 Javascript
js创建子窗口并且回传值示例代码
2013/07/02 Javascript
解决js中window.open弹出的是上次的缓存页面问题
2013/12/29 Javascript
jquery实现侧边弹出的垂直导航
2014/12/09 Javascript
jQuery实现拖动调整表格单元格大小的代码实例
2015/01/13 Javascript
jquery让指定的元素闪烁显示的方法
2015/03/17 Javascript
JS获取下拉框显示值和判断单选按钮的方法
2015/07/09 Javascript
Servlet3.0与纯javascript通过Ajax交互的实例详解
2018/03/18 Javascript
微信小程序实现左右联动的实战记录
2018/07/05 Javascript
玩转vue的slot内容分发
2018/09/22 Javascript
axios全局注册,设置token,以及全局设置url请求网段的方法
2018/09/25 Javascript
用Python写一个无界面的2048小游戏
2016/05/24 Python
Python入门_浅谈数据结构的4种基本类型
2017/05/16 Python
Python实现的弹球小游戏示例
2017/08/01 Python
Python使用修饰器执行函数的参数检查功能示例
2017/09/26 Python
快速解决PyCharm无法引用matplotlib的问题
2018/05/24 Python
pandas.cut具体使用总结
2019/06/24 Python
详解使用python绘制混淆矩阵(confusion_matrix)
2019/07/14 Python
Python3 venv搭建轻量级虚拟环境的步骤(图文)
2019/08/09 Python
python使用QQ邮箱实现自动发送邮件
2020/06/22 Python
商务日语专业毕业生自荐信
2014/03/27 职场文书
中秋节主持词
2014/04/02 职场文书
机电一体化应届生求职信
2014/08/09 职场文书
党校党性分析材料
2014/12/19 职场文书
安全伴我行主题班会
2015/08/13 职场文书
导游词之台湾安平古堡
2019/12/25 职场文书
Nginx动静分离配置实现与说明
2022/04/07 Servers
Java 数组的使用
2022/05/11 Java/Android
Spring中的@Transactional的工作原理
2022/06/05 Java/Android