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数组方法汇总
Nov 21 Javascript
jQuery实现的超链接提示效果示例【附demo源码下载】
Sep 09 Javascript
JavaScript阻止表单提交方法(附代码)
Aug 15 Javascript
vue mint-ui学习笔记之picker的使用
Oct 11 Javascript
jQuery自动或手动图片切换效果
Oct 11 jQuery
Vue 兄弟组件通信的方法(不使用Vuex)
Oct 26 Javascript
vue2.5.2使用http请求获取静态json数据的实例代码
Feb 27 Javascript
JavaScript 正则命名分组【推荐】
Jun 07 Javascript
后台使用freeMarker和前端使用vue的方法及遇到的问题
Jun 13 Javascript
ES6 Class中实现私有属性的一些方法总结
Jul 08 Javascript
Vue快速实现通用表单验证的方法
Feb 24 Javascript
详解element上传组件before-remove钩子问题解决
Apr 08 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 时间转换Unix时间戳代码
2010/01/22 PHP
php Xdebug 调试扩展的安装与使用.
2010/03/13 PHP
探讨方法的重写(覆载)详解
2013/06/08 PHP
php去除字符串中空字符的常用方法小结
2015/03/17 PHP
PHP内部实现打乱字符串顺序函数str_shuffle的方法
2019/02/14 PHP
PHP使用ActiveMQ实现消息队列的方法详解
2019/05/31 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
一个js实现的所谓的滑动门
2007/05/23 Javascript
javascript的原生方法获取数组中的最大(最小)值
2012/12/19 Javascript
jquery checkbox实现单选小例
2013/11/27 Javascript
js快速排序的实现代码
2013/12/08 Javascript
jQuery图片切换插件jquery.cycle.js使用示例
2014/06/16 Javascript
jquery 为a标签绑定click事件示例代码
2014/06/23 Javascript
js实现div拖动动画运行轨迹效果代码分享
2015/08/27 Javascript
全面解析Bootstrap排版使用方法(文字样式)
2015/11/30 Javascript
Bootstrap警告框(Alert)插件使用方法
2017/03/21 Javascript
JS组件系列之MVVM组件构建自己的Vue组件
2017/04/28 Javascript
js分页之前端代码实现和请求处理
2017/08/04 Javascript
Express的HTTP重定向到HTTPS的方法
2018/06/06 Javascript
微信公众平台获取access_token的方法步骤
2019/03/29 Javascript
微信小程序tab左右滑动切换功能的实现代码
2021/02/08 Javascript
Python简单的制作图片验证码实例
2017/05/31 Python
python实现杨辉三角思路
2017/07/14 Python
OpenCV+Python--RGB转HSI的实现
2019/11/27 Python
python实现多进程按序号批量修改文件名的方法示例
2019/12/30 Python
Python pathlib模块使用方法及实例解析
2020/10/05 Python
Python实现对word文档添加密码去除密码的示例代码
2020/12/29 Python
美国职棒大联盟官方网上商店:MLBShop.com
2017/11/12 全球购物
阿联酋航空假期:Emirates Holidays
2018/03/20 全球购物
瑞士隐形眼镜和护理产品网上商店:Linsenklick
2019/10/21 全球购物
墨西哥购物网站:Elektra
2020/01/21 全球购物
早餐连锁店计划书
2014/01/08 职场文书
花木兰观后感
2015/06/10 职场文书
导游带团欢迎词
2015/09/30 职场文书
企业愿景口号
2015/12/25 职场文书
python process模块的使用简介
2021/05/14 Python