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验证(图片/文件的扩展名)
Apr 25 Javascript
js用typeof方法判断undefined类型
Jul 15 Javascript
JavaScript严格模式禁用With语句的原因
Oct 20 Javascript
禁止按回车键提交表单的方法
Jun 11 Javascript
js+canvas绘制矩形的方法
Jan 28 Javascript
jQuery搜索框效果实现代码(百度关键词联想)
Feb 25 Javascript
AngularJS实现标签页的两种方式
Sep 05 Javascript
BootStrap Datepicker 插件修改为默认中文的实现方法
Feb 10 Javascript
JS实现移动端实时监听输入框变化的实例代码
Apr 12 Javascript
es6学习之解构时应该注意的点
Aug 29 Javascript
vue列表数据发生变化指令没有更新问题及解决方法
Jan 16 Javascript
JS数组Reduce方法功能与用法实例详解
Apr 29 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正则的Unknown Modifier错误解决方法
2010/03/02 PHP
PHP中最容易忘记的一些知识点总结
2013/04/28 PHP
php使用百度天气接口示例
2014/04/22 PHP
PHP实现数字补零功能的2个函数介绍
2014/05/12 PHP
PHP模板引擎Smarty中变量的使用方法示例
2016/04/11 PHP
PHP生成短网址方法汇总
2016/07/12 PHP
5款JavaScript代码压缩工具推荐
2014/07/07 Javascript
JQuery限制复选框checkbox可选中个数的方法
2015/04/20 Javascript
js实现文本框选中的方法
2015/05/26 Javascript
jQuery Easyui实现左右布局
2016/01/26 Javascript
基于BootStrap的Metronic框架实现页面链接收藏夹功能按钮移动收藏记录(使用Sortable进行拖动排序)
2016/08/29 Javascript
AngularJS 中使用Swiper制作滚动图不能滑动的解决方法
2016/11/15 Javascript
JavaScript实现倒计时跳转页面功能【实用】
2016/12/13 Javascript
JavaScript实现瀑布流以及加载效果
2017/02/11 Javascript
jQuery实现ajax的嵌套请求案例分析
2019/02/16 jQuery
小程序click-scroll组件设计
2019/06/18 Javascript
Vue分页器实现原理详解
2019/06/28 Javascript
微信小程序实现左侧滑栏过程解析
2019/08/26 Javascript
vue路由缓存的几种实现方式小结
2020/02/02 Javascript
viewer.js一个强大的基于jQuery的图像查看插件(支持旋转、缩放)
2020/04/01 jQuery
介绍Python中内置的itertools模块
2015/04/29 Python
Python对文件操作知识汇总
2016/05/15 Python
Python使用lxml模块和Requests模块抓取HTML页面的教程
2016/05/16 Python
Python 删除连续出现的指定字符的实例
2018/06/29 Python
pytorch 可视化feature map的示例代码
2019/08/20 Python
wxPython实现列表增删改查功能
2019/11/19 Python
Python run()函数和start()函数的比较和差别介绍
2020/05/03 Python
Django中ORM找出内容不为空的数据实例
2020/05/20 Python
PyQt5实现仿QQ贴边隐藏功能的实例代码
2020/05/24 Python
python 高阶函数简单介绍
2021/02/19 Python
css3实现小箭头各种图形效果
2020/07/08 HTML / CSS
教师业务培训方案
2014/05/01 职场文书
垂直极限观后感
2015/06/08 职场文书
详解Java ES多节点任务的高效分发与收集实现
2021/06/30 Java/Android
mysql定时自动备份数据库的方法步骤
2021/07/07 MySQL
据Python爬虫不靠谱预测可知今年双十一销售额将超过6000亿元
2021/11/11 Python