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 相关文章推荐
jQuery探测位置的提示弹窗(toolTip box)详细解析
Nov 14 Javascript
解析Javascript中中括号“[]”的多义性
Dec 03 Javascript
Node.js开发者必须了解的4个JS要点
Feb 21 Javascript
jQuery页面加载初始化的3种方法(推荐)
Jun 02 Javascript
jQuery动态添加可拖动元素完整实例(附demo源码下载)
Jun 21 Javascript
D3.js封装文本实现自动换行和旋转平移等功能
Oct 14 Javascript
vue.js指令v-model实现方法
Dec 05 Javascript
vue项目开发中setTimeout等定时器的管理问题
Sep 13 Javascript
vue轻量级框架无法获取到vue对象解决方法
May 12 Javascript
微信小程序非跳转式组件授权登录的方法示例
May 22 Javascript
Vue中实现回车键切换焦点的方法
Feb 19 Javascript
解决Vue 移动端点击出现300毫秒延迟的问题
Jul 21 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
Thinkphp 框架扩展之行为扩展原理与实现方法分析
2020/04/23 PHP
父窗口获取弹出子窗口文本框的值
2006/06/27 Javascript
html+css+js实现xp window界面及有关功能
2013/03/26 Javascript
jcrop基本参数一览
2013/07/16 Javascript
jquery学习总结(超级详细)
2014/09/04 Javascript
JS弹出可拖拽可关闭的div层完整实例
2015/02/13 Javascript
Javascript数组Array方法解读
2016/03/13 Javascript
js判断复选框是否选中及选中个数的实现代码
2016/05/30 Javascript
JavaScript reduce和reduceRight详解
2016/10/24 Javascript
基于NodeJS+MongoDB+AngularJS+Bootstrap开发书店案例分析
2017/01/12 NodeJs
如何获取元素的最终background-color
2017/02/06 Javascript
jQuery快速实现商品数量加减的方法
2017/02/06 Javascript
vue基础之v-bind属性、class和style用法分析
2019/03/11 Javascript
vue实现二级导航栏效果
2019/10/19 Javascript
vue项目如何监听localStorage或sessionStorage的变化
2021/01/04 Vue.js
[42:52]IG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python获取文件后缀名及批量更新目录下文件后缀名的方法
2014/11/11 Python
Django教程笔记之中间件middleware详解
2018/08/01 Python
Python 通过调用接口获取公交信息的实例
2018/12/17 Python
numpy和pandas中数组的合并、拉直和重塑实例
2019/06/28 Python
python3字符串操作总结
2019/07/24 Python
python抓取多种类型的页面方法实例
2019/11/20 Python
Python selenium 自动化脚本打包成一个exe文件(推荐)
2020/01/14 Python
python range实例用法分享
2020/02/06 Python
Python转换itertools.chain对象为数组的方法
2020/02/07 Python
jupyter notebook 多环境conda kernel配置方式
2020/04/10 Python
详解pyqt5的UI中嵌入matplotlib图形并实时刷新(挖坑和填坑)
2020/08/07 Python
amazeui时间组件的实现示例
2020/08/18 HTML / CSS
英语师范专业毕业生自荐信
2013/09/21 职场文书
考博自荐信
2013/10/25 职场文书
会计助理的岗位职责
2013/11/29 职场文书
实习生求职自荐信
2014/02/07 职场文书
大学课外活动总结
2014/07/09 职场文书
管理岗位竞聘演讲稿
2014/08/18 职场文书
2014年学习全国道德模范事迹思想汇报
2014/09/15 职场文书
Python集合的基础操作
2021/11/01 Python