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 新浪的一个图片播放图片轮换效果代码
Jul 15 Javascript
Div自动滚动到末尾的代码
Oct 26 Javascript
js中复制行和删除行的操作实例
Jun 25 Javascript
AspNet中使用JQuery上传插件Uploadify详解
May 20 Javascript
javascript html5摇一摇功能的实现
Apr 19 Javascript
基于BootStrap Metronic开发框架经验小结【九】实现Web页面内容的打印预览和保存操作
May 12 Javascript
浅谈js中的in-for循环
Jun 28 Javascript
js格式化时间的简单实例
Nov 27 Javascript
JavaScript模板引擎Template.js使用详解
Dec 15 Javascript
angularjs路由传值$routeParams详解
Sep 05 Javascript
template.js前端模板引擎使用详解
Oct 10 Javascript
vue路由跳转传递参数的方式总结
May 10 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
一个程序下载的管理程序(一)
2006/10/09 PHP
ThinkPHP中调用PHPExcel的实现代码
2017/04/08 PHP
php进行md5加密简单实例方法
2019/09/19 PHP
jquery 锁定弹出层实现代码
2010/02/23 Javascript
用jquery实现的模拟QQ邮箱里的收件人选取及其他效果(一)
2011/01/06 Javascript
JS实现清除指定cookies的方法
2014/09/20 Javascript
JS+CSS实现弹出全屏灰黑色透明遮罩效果的方法
2014/12/20 Javascript
javascript实现获取服务器时间
2015/05/19 Javascript
深入浅析JavaScript面向对象和原型函数
2016/02/06 Javascript
NodeJS的Promise的用法解析
2016/05/05 NodeJs
jQuery Ajax全解析
2017/02/13 Javascript
jQuery实现的背景颜色渐变动画效果示例
2017/03/24 jQuery
AngularJS 购物车全选/取消全选功能的实现方法
2017/08/14 Javascript
React应用中使用Bootstrap的方法
2017/08/15 Javascript
js实现轮播图的完整代码
2020/10/26 Javascript
利用Webpack实现小程序多项目管理的方法
2019/02/25 Javascript
js继承的这6种方式!(上)
2019/04/23 Javascript
nodejs通过钉钉群机器人推送消息的实现代码
2019/05/05 NodeJs
JS array数组检测方式解析
2020/05/19 Javascript
vue select 获取value和lable操作
2020/08/28 Javascript
EXTJS7实现点击拖拉选择文本
2020/12/17 Javascript
python常用函数详解
2016/09/13 Python
Python装饰器原理与用法分析
2018/04/30 Python
Python 中判断列表是否为空的方法
2019/11/24 Python
Django 再谈一谈json序列化
2020/03/16 Python
python suds访问webservice服务实现
2020/06/26 Python
基于Python+QT的gui程序开发实现
2020/07/03 Python
PyQt5-QDateEdit的简单使用操作
2020/07/12 Python
python opencv图像处理(素描、怀旧、光照、流年、滤镜 原理及实现)
2020/12/10 Python
阿迪达斯英国官方网站:adidas英国
2019/08/13 全球购物
端口镜像是怎么实现的
2014/03/25 面试题
毕业自我鉴定
2013/11/05 职场文书
《要下雨了》教学反思
2014/02/17 职场文书
创建学习型党组织实施方案
2014/03/29 职场文书
工资收入证明
2014/10/07 职场文书
工作简历的自我评价
2019/05/16 职场文书