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 相关文章推荐
一些常用的JavaScript函数(json)附详细说明
May 25 Javascript
用RadioButten或CheckBox实现div的显示与隐藏
Sep 21 Javascript
jQuery队列操作方法实例
Jun 11 Javascript
深入理解JavaScript系列(31):设计模式之代理模式详解
Mar 03 Javascript
js 实现数值的千分位及保存小数方法(推荐)
Aug 01 Javascript
JS实现旋转木马式图片轮播效果
Jan 18 Javascript
Node.js 实现简单的接口服务器的实例代码
May 23 Javascript
JS二分查找算法详解
Nov 01 Javascript
详解vue-cli3使用
Aug 14 Javascript
jQuery实现合并表格单元格中相同行操作示例
Jan 28 jQuery
使用node.JS中的url模块解析URL信息
Feb 06 Javascript
vue使用v-model进行跨组件绑定的基本实现方法
Apr 28 Vue.js
微信小程序的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使用mb_check_encoding检查字符串在指定的编码里是否有效
2013/11/07 PHP
php中文字符串截取方法实例总结
2014/09/30 PHP
PHP中is_dir()函数使用指南
2015/05/08 PHP
php文档工具PHP Documentor安装与使用方法
2016/01/25 PHP
Firefox outerHTML实现代码
2009/06/04 Javascript
JavaScript Chart 插件整理
2010/06/18 Javascript
extjs render 用法介绍
2013/09/11 Javascript
javascript的alert box在java中如何显示多行
2014/05/18 Javascript
javascript实现点击后变换按钮显示文字的方法
2015/05/13 Javascript
JS表格组件BootstrapTable行内编辑解决方案x-editable
2016/09/01 Javascript
前端自动化开发之Node.js的环境搭建教程
2017/04/01 Javascript
angularJs的ng-class切换class
2017/06/23 Javascript
Javascript中的作用域及块级作用域
2017/12/08 Javascript
vue项目中mock.js的使用及基本用法
2019/05/22 Javascript
layui 选择列表,打勾,点击确定返回数据的例子
2019/09/02 Javascript
vue实现商城秒杀倒计时功能
2019/12/12 Javascript
uniapp,微信小程序中使用 MQTT的问题
2020/07/11 Javascript
[03:21]辉夜杯主赛事 12月25日TOP5
2015/12/26 DOTA
[02:37]2018DOTA2亚洲邀请赛赛前采访-EG篇
2018/04/03 DOTA
Python的装饰器模式与面向切面编程详解
2015/06/21 Python
python实现txt文件格式转换为arff格式
2018/05/31 Python
Python最小二乘法矩阵
2019/01/02 Python
在python中利用dict转json按输入顺序输出内容方式
2020/02/27 Python
python shell命令行中import多层目录下的模块操作
2020/03/09 Python
Python使用socket_TCP实现小文件下载功能
2020/10/09 Python
加拿大女装网上购物:Reitmans
2016/10/20 全球购物
与世界上最好的跑步专业品牌合作:Fleet Feet
2019/03/22 全球购物
丽笙酒店官方网站:Radisson Hotels
2019/05/07 全球购物
给排水专业应届生求职信
2013/10/12 职场文书
眼镜促销方案
2014/03/15 职场文书
高三家长寄语
2014/04/03 职场文书
《周恩来的四个昼夜》观后思想汇报范文两篇
2014/09/10 职场文书
素质拓展训练感想
2015/08/07 职场文书
《烈火英雄》观后感:致敬和平时代的英雄
2019/11/11 职场文书
MySQL命令行操作时的编码问题详解
2021/04/14 MySQL
opencv用VS2013调试时用Image Watch插件查看图片
2021/07/26 Python