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 相关文章推荐
js和jquery批量绑定事件传参数一(新猪猪原创)
Jun 23 Javascript
javascript中类的定义及其方式(《javascript高级程序设计》学习笔记)
Jul 04 Javascript
为JS扩展Array.prototype.indexOf引发的问题探讨及解决
Apr 24 Javascript
纯Javascript实现Windows 8 Metro风格实现
Oct 15 Javascript
JS实现跟随鼠标立体翻转图片的方法
May 04 Javascript
Node.js与Sails redis组件的使用教程
Feb 14 Javascript
详解vue跨组件通信的几种方法
Jun 15 Javascript
JS实现获取汉字首字母拼音、全拼音及混拼音的方法
Nov 14 Javascript
详解Vue开发微信H5微信分享签名失败问题解决方案
Aug 09 Javascript
JS返回页面时自动回滚到历史浏览位置
Sep 26 Javascript
jQuery中each和js中forEach的区别分析
Feb 27 jQuery
解决elementui表格操作列自适应列宽
Dec 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
生成sessionid和随机密码的例子
2006/10/09 PHP
php 智能404跳转代码,适合换域名没改变目录的网站
2010/06/04 PHP
基于JQuery+PHP编写砸金蛋中奖程序
2015/09/08 PHP
php实现的xml操作类
2016/01/15 PHP
PHP7扩展开发教程之Hello World实现方法示例
2017/08/03 PHP
Avengerls vs KG BO3 第二场2.18
2021/03/10 DOTA
一个JavaScript继承的实现
2006/10/24 Javascript
JS中的数组的sort方法使用示例
2014/01/22 Javascript
jquery解析xml字符串示例分享
2014/03/25 Javascript
javascript自定义函数参数传递为字符串格式
2014/07/29 Javascript
JavaScript运算符小结
2015/06/03 Javascript
javascript 作用于作用域链的详解
2017/09/27 Javascript
ReactNative中使用Redux架构总结
2017/12/15 Javascript
解决vue的过渡动画无法正常实现问题
2019/10/31 Javascript
Layer UI表格列日期格式化及取消自动填充日期的实现方法
2020/05/10 Javascript
vue动态设置页面title的方法实例
2020/08/23 Javascript
c++生成dll使用python调用dll的方法
2014/01/20 Python
Python采集腾讯新闻实例
2014/07/10 Python
浅要分析Python程序与C程序的结合使用
2015/04/07 Python
使用Python脚本来控制Windows Azure的简单教程
2015/04/16 Python
python模拟Django框架实例
2016/05/17 Python
在python中按照特定顺序访问字典的方法详解
2018/12/14 Python
Python3实现的判断回文链表算法示例
2019/03/08 Python
Python终端输出彩色字符方法详解
2020/02/11 Python
Centos7下源码安装Python3 及shell 脚本自动安装Python3的教程
2020/03/07 Python
css3 实现元素弧线运动的示例代码
2020/04/24 HTML / CSS
Charlotte Tilbury英国官网:英国彩妆品牌
2017/05/26 全球购物
小米俄罗斯授权商店:Xiaomi俄罗斯
2019/12/08 全球购物
linux面试题参考答案(10)
2013/11/04 面试题
报效祖国演讲稿
2014/09/15 职场文书
导游词之丹东鸭绿江
2019/10/24 职场文书
看看如何用Python绘制小米新版天价logo
2021/04/20 Python
TypeScript中条件类型精读与实践记录
2021/10/05 Javascript
详解MySql中InnoDB存储引擎中的各种锁
2022/02/12 MySQL
如何开启Apache,Nginx和IIS服务器的GZIP压缩功能
2022/04/29 Servers
WIN10使用IIS部署ftp服务器详细教程
2022/08/05 Servers