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 相关文章推荐
点击广告后才能获得下载地址
Oct 26 Javascript
setTimeout和setInterval的浏览器兼容性分析
Feb 27 Javascript
javascript Excel操作知识点
Apr 24 Javascript
JSON JQUERY模板实现说明
Jul 03 Javascript
easyui datagrid 键盘上下控制选中行示例
Mar 31 Javascript
输入框过滤非数字的js代码
Sep 18 Javascript
javascript面向对象之this关键词用法分析
Jan 13 Javascript
js实现select二级联动下拉菜单
Apr 17 Javascript
关于JavaScript和jQuery的类型判断详解
Oct 08 Javascript
JS鼠标3次点击事件实现代码及扩展思路
Sep 12 Javascript
vue使用mint-ui实现下拉刷新和无限滚动的示例代码
Nov 06 Javascript
vue-cli3项目展示本地Markdown文件的方法
Jun 07 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
DOTA2游戏同人动画《龙之血》导演接受采访
2021/03/05 欧美动漫
利用php来自动调用不同服务器上的flash
2006/10/09 PHP
php如何实现只替换一次或N次
2015/10/29 PHP
Laravel项目中timeAgo字段语言转换的改善方法示例
2019/09/16 PHP
js脚本学习 比较实用的基础
2006/09/07 Javascript
javascript与有限状态机详解
2014/05/08 Javascript
json中换行符的处理方法示例介绍
2014/06/10 Javascript
jQuery检查元素存在性(推荐)
2016/09/17 Javascript
js本地图片预览实现代码
2016/10/09 Javascript
vue2.0中goods选购栏滚动算法的实现代码
2017/05/17 Javascript
js自定义弹框插件的封装
2020/08/24 Javascript
Angular实现的敏感文字自动过滤与提示功能示例
2017/12/29 Javascript
浅谈目前可以使用ES10的5个新特性
2019/06/25 Javascript
TensorFlow.js 微信小程序插件开始支持模型缓存的方法
2020/02/21 Javascript
Angular短信模板校验代码
2020/09/23 Javascript
vue项目页面嵌入代码块vue-prism-editor的实现
2020/10/30 Javascript
[04:45]DOTA2-DPC中国联赛正赛 iG vs LBZS 赛后选手采访
2021/03/11 DOTA
Python内置函数reversed()用法分析
2018/03/20 Python
Numpy数组转置的两种实现方法
2018/04/17 Python
Python语言快速上手学习方法
2018/12/14 Python
Python 实现两个服务器之间文件的上传方法
2019/02/13 Python
python的turtle库使用详解
2019/05/10 Python
浅谈Python协程
2020/06/17 Python
Django-silk性能测试工具安装及使用解析
2020/11/28 Python
Django中如何用xlwt生成表格的方法步骤
2021/01/31 Python
美国在线自行车商店:Jenson USA
2018/05/22 全球购物
应届大专毕业生自我鉴定
2014/04/08 职场文书
社会学专业求职信
2014/07/17 职场文书
学校联谊协议书
2014/09/16 职场文书
2014乡镇机关党员个人对照检查材料思想汇报
2014/10/09 职场文书
2014幼儿园教育教学工作总结
2014/12/17 职场文书
2015年银行大堂经理工作总结
2015/04/24 职场文书
中国梦党课学习心得体会
2016/01/05 职场文书
idea 在springboot中使用lombok插件的方法
2021/08/02 Java/Android
一行Python命令实现批量加水印
2022/04/07 Python
Linux中一对多配置日志服务器的详细步骤
2022/07/23 Servers