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入门之对象与JSON详解
Oct 21 Javascript
学习javascript的闭包,原型,和匿名函数之旅
Oct 18 Javascript
js实现简单计算器
Nov 22 Javascript
学习javascript面向对象 理解javascript原型和原型链
Jan 04 Javascript
jquery实现页面常用的返回顶部效果
Mar 04 Javascript
node.js cookie-parser 中间件介绍
Jun 06 Javascript
vue.js实现含搜索的多种复选框(附源码)
Mar 23 Javascript
JS实现数组按升序及降序排列的方法
Apr 26 Javascript
使用Angular CLI从蓝本生成代码详解
Mar 24 Javascript
详解超简单的react服务器渲染(ssr)入坑指南
Feb 28 Javascript
通过实例解析js简易模块加载器
Jun 17 Javascript
vue基于Teleport实现Modal组件
May 31 Vue.js
微信小程序的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
生成sessionid和随机密码的例子
2006/10/09 PHP
php中switch与ifelse的效率区别及适用情况分析
2015/02/12 PHP
php实现的美国50个州选择列表实例
2015/04/20 PHP
示例详解Laravel的注册重构
2016/08/14 PHP
php正则修正符用法实例详解
2016/12/29 PHP
PHP中让json_encode不自动转义斜杠“/”的方法
2017/02/28 PHP
不提示直接关闭网页窗口的JS示例代码
2013/12/17 Javascript
jQuery的animate函数学习记录
2014/08/08 Javascript
text-align:justify实现文本两端对齐 兼容IE
2015/08/19 Javascript
Bootstrap每天必学之简单入门
2015/11/19 Javascript
获取JavaScript异步函数的返回值
2016/12/21 Javascript
vue.js实现点击后动态添加class及删除同级class的实现代码
2018/04/04 Javascript
微信小程序--获取用户地理位置名称(无须用户授权)的方法
2019/04/29 Javascript
Vue CLI3基础学习之pages构建多页应用
2019/06/02 Javascript
关于ckeditor在bootstrap中modal中弹框无法输入的解决方法
2019/09/11 Javascript
node.js使用zlib模块进行数据压缩和解压操作示例
2020/02/12 Javascript
[03:04]DOTA2超级联赛专访ZSMJ “莫名其妙”的逆袭
2013/05/23 DOTA
[52:57]2014 DOTA2国际邀请赛中国区预选赛 LGD-CDEC VS HGT
2014/05/21 DOTA
python发送HTTP请求的方法小结
2015/07/08 Python
python简单分割文件的方法
2015/07/30 Python
Python简单格式化时间的方法【strftime函数】
2016/09/18 Python
Pycharm学习教程(1) 定制外观
2017/05/02 Python
浅谈配置OpenCV3 + Python3的简易方法(macOS)
2018/04/02 Python
淘宝秒杀python脚本 扫码登录版
2019/09/19 Python
Python进阶之迭代器与迭代器切片教程
2020/01/29 Python
Python3-异步进程回调函数(callback())介绍
2020/05/02 Python
Python descriptor(描述符)的实现
2020/11/15 Python
CSS3之边框多颜色Border-color属性使用示例
2013/10/11 HTML / CSS
html5 分层屏幕适配的方法
2018/03/16 HTML / CSS
html5通过postMessage进行跨域通信的方法
2017/12/04 HTML / CSS
Russell Stover巧克力官方网站:美国领先的精美巧克力制造商
2016/11/27 全球购物
英国马莎百货印度官网:Marks & Spencer印度
2020/10/08 全球购物
跟单业务员岗位职责
2014/03/08 职场文书
团党委领导干部党的群众路线教育实践活动个人对照检查材料思想汇
2014/10/05 职场文书
小学运动会宣传稿
2015/07/23 职场文书
2019已经过半,你知道年中工作总结该怎么写吗?
2019/07/03 职场文书