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之一
Apr 27 Javascript
document.body.scrollTop 值总为0的解决方法 比较常见的标准问题
Nov 30 Javascript
jQuery写fadeTo示例代码
Feb 21 Javascript
多种方法实现360浏览器下禁止自动填写用户名密码
Jun 16 Javascript
JS实现文字放大效果的方法
Mar 03 Javascript
跟我学习javascript的for循环和for...in循环
Nov 18 Javascript
jQuery使用contains过滤器实现精确匹配方法详解
Feb 25 Javascript
解决微信内置浏览器返回上一页强制刷新问题方法
Feb 05 Javascript
vue axios登录请求拦截器
Apr 02 Javascript
在Vue项目中使用d3.js的实例代码
May 01 Javascript
Node.js中Koa2在控制台输出请求日志的方法示例
May 02 Javascript
JS实现简单九宫格抽奖
Jun 28 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新手上路(四)
2006/10/09 PHP
IP攻击升级,程序改进以对付新的攻击
2010/11/23 PHP
PHP类的特性实例分析
2016/09/28 PHP
php使用goto实现自动重启swoole、reactphp、workerman服务的代码
2020/04/13 PHP
一个加密JavaScript的开源工具PACKER2.0.2
2006/11/04 Javascript
漂亮的widgets,支持换肤和后期开发新皮肤(2007-4-27已更新1.7alpha)
2007/04/27 Javascript
javascript让setInteval里的函数参数中的this指向特定的对象
2010/01/31 Javascript
javascript 鼠标拖动图标技术
2010/02/07 Javascript
始终在屏幕中间显示Div的代码(css+js)
2011/03/10 Javascript
JavaScript中几个重要的属性(this、constructor、prototype)介绍
2013/05/19 Javascript
js 文本滚动效果的实例代码
2013/08/17 Javascript
jQuery Real Person验证码插件防止表单自动提交
2015/11/06 Javascript
JavaScript+html5 canvas制作色彩斑斓的正方形效果
2016/01/27 Javascript
JavaScript判断数组重复内容的两种方法(推荐)
2016/06/06 Javascript
浅谈React碰到v-if
2018/11/04 Javascript
在Vuex中Mutations修改状态操作
2020/07/24 Javascript
JavaScript实现缓动动画
2020/11/25 Javascript
在Python中用keys()方法返回字典键的教程
2015/05/21 Python
python 全文检索引擎详解
2017/04/25 Python
Python使用zip合并相邻列表项的方法示例
2018/03/17 Python
python 执行shell命令并将结果保存的实例
2018/05/11 Python
Python实现决策树C4.5算法的示例
2018/05/30 Python
python实现转圈打印矩阵
2019/03/02 Python
Django实现单用户登录的方法示例
2019/03/28 Python
如何使用pyinstaller打包32位的exe程序
2019/05/26 Python
利用python计算时间差(返回天数)
2019/09/07 Python
python为什么会环境变量设置不成功
2020/06/23 Python
详解matplotlib绘图样式(style)初探
2021/02/03 Python
将一个文本文件的内容按倒序打印出来
2015/01/05 面试题
小学教师事迹材料
2014/01/13 职场文书
世界水日宣传活动总结
2015/02/09 职场文书
护士年终个人总结
2015/02/13 职场文书
司法廉洁教育心得体会
2016/01/20 职场文书
利用python做表格数据处理
2021/04/13 Python
Oracle 临时表空间SQL语句的实现
2021/09/25 Oracle
nginx location 带斜杠【 / 】与不带的区别
2022/04/13 Servers