首页 > 其他分享 >vue 大转盘旋转效果

vue 大转盘旋转效果

时间:2023-09-13 17:31:52浏览次数:27  
标签:vue rotateState 旋转 大转盘 角度 停止 rotateStep 步进

场景如下:

用户点击抽奖,转盘立刻线性提速转动,同时请求抽奖接口,旋转过程中等待接口返回抽奖信息

接口返回信息后,转盘减速至停转

网上找到animejs动画框架,想钻研的同学可以看一下,我没有用此框架实现,是手写的

这个demo没有实现停在指定奖品上

也没有实现完全停止后,正好停在0°

<template>
  <div class="hello">
    <!-- 图片自己可以随便找一个 -->
    <img src="@/assets/zhuanpan.png" :style='{"transform":"rotate("+rotate+"deg)"}' class="shunhua">
    <button @click="startRotate">开始</button>
    <button @click="stopRotate">停止</button>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  data () {
    return {
      //元素当前角度
      rotate:0,
      //定时器对象
      interverObj:null,
      //启动旋转步进角度,就是每阶段提速多少
      rotateStep:1,
      //停止旋转步进角度,每阶段降速多少
      rotateStepStop:1,
      //最大步进角度,就是最高速度
      rotateStepMax:10,
      //每多少毫秒累加一次步进角度,就是多久提速一次
      rotateAddTime:100,
      //每多少毫秒运行一次,定时器的执行间隔时间
      rotateRunTimeOut:10,
      //当前运行毫秒数,累加的毫秒数,用来判断是否达到提速要求
      nowRunTime:0,
      //旋转状态0停止中 1旋转中 2停止中
      rotateState:0,
    }
  },
  mounted(){
    // this.startRotate()
  },
  methods:{
    //重置相关参数
    resetData(){
      //元素角度
      // this.rotate = 0
      //定时器对象
      clearInterval(this.interverObj)
      this.interverObj = null
      //步进角度
      this.rotateStep = 1
      //当前运行毫秒数
      this.nowRunTime = 0
      //旋转状态0停止中 1旋转中 2停止中
      this.rotateState = 0
    },
    //启动旋转
    startRotate(){
      let that = this
      that.rotateState = 1
      that.interverObj = setInterval(function(){that.rotateLogo()},that.rotateRunTimeOut)
    },
    //停止旋转
    stopRotate(){
      this.rotateState = 2
    },
    //控制旋转步进角度
    handleRotate(){      
      if(this.rotateState == 1){//如果当前为旋转中
        //步进角度小于最大步进角度
        if(this.rotateStep < this.rotateStepMax){
          if(this.nowRunTime % this.rotateAddTime == 0){
            //继续累加步进角度
            this.rotateStep += this.rotateStep
          }          
        }
      }else if(this.rotateState == 2){//如果当前为停止中
        if(this.nowRunTime % this.rotateAddTime == 0){
          //减少步进角度
          if((this.rotateStep - this.rotateStepStop)>0){//如果减少之后,步进角度大于0,就继续减少
            this.rotateStep -= this.rotateStepStop
          }else{//否则就是要停止了
            //计算距离12点方向差多少度
            // let cha = 360 - this.rotate % 360
            this.rotateStep = 0
            this.resetData()            
          }          
        }
      }else{//静止状态

      }      
    },
    //停止旋转的函数
    // handleStop(){
    //   //计算完全停止需要多少度
    //   let a = 720 - this.rotate % 360
    //   //
    // },
    //执行旋转
    rotateLogo(){
      //累加运行毫秒数
      this.nowRunTime += this.rotateRunTimeOut
      //累加旋转角度
      this.rotate += this.rotateStep
      //调用控制旋转步进角度函数
      this.handleRotate()
    }    
  }
}
</script>

<style scoped>
.shunhua{
  transition: 0.1s;
}
</style>

标签:vue,rotateState,旋转,大转盘,角度,停止,rotateStep,步进
From: https://blog.51cto.com/u_15668841/7462795

相关文章

  • 记录--用 Vue 实现原神官网的角色切换效果
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助前言为了更好的了解原神角色,我模仿官网做了一个角色切换效果,在做的过程当中也总结了一些技术点。为了让大家更好的体验,我兼容了PC端和移动端,建议在PC端查看效果更佳。接下来就为大家简单的分享一下!话不多说,......
  • 《VUE》走马灯组件
    <template><!--走马灯--><divclass="box"><divclass="carousel"><divclass="item"v-for="(v,i)inlist":key="i"@click="open(v)"><img:sr......
  • application 'vueApp' died in status NOT_MOUNTED: [qiankun]: Target container wit
    这是第一次微前端很常见的提示,尤其是第一次写前端的时候碰到的解决1:主应用的 App.vue标签上的id="app"去掉,这是报错的根本解决2://在子应用挂在的时候处理functionrender(props={}){const{container}=props;instance=newVue({render:h=>h......
  • 【Vue】带你进入七彩缤纷的世界
    hello,我是小索奇,Vue.js精心准备撰写了文章,其中进行多次修改给读者更好的学习进程,涵盖Vue2和Vue3,让大家用最通俗的方式来学会Vue,本系列会考虑到新手,将由浅入深进行讲解,即使你是老玩家,也可以收藏备用,其中有很多已经踩过的坑为大家铺垫平滑的道路~若您有任何问题,欢迎沟通,共同进......
  • nvm、node、vue安装、vue项目创建打包
    nvm、node、vue安装、创建vue项目nvm作用:可以管理多个版本的node,切换node版本,下载node。前情提要参考:https://zhuanlan.zhihu.com/p/519270555下载地址:https://github.com/coreybutler/nvm-windows/releases一、常用命令1、nvm查看安装了的nodenvmlsnvml......
  • vue导出带样式的excel
    示例说明实现导出excel不同块的颜色templatea标签仅做文件名称调整,默认为隐藏状态;<template><div><button@click="exportExcel">导出</button><aref="export_a"/></div></template>scriptexportdefault{name......
  • Vue3语法基本使用
    1、watch使用watch(监听数据源,执行函数,[配置参数])//配置参数:立即执行深度监听{immediate:true,deep:true}1.1监听基本数据类型单一数据源<scriptsetup>import{ref,watch}from'vue'letname=ref('张麻子')//监听器watch(name,(new......
  • 解决vue中watch监听对象变化获取不到旧数据的问题
    解决vue中watch监听对象变化获取不到旧数据的问题1.问题代码watch:{pageInfo:{handler(newVal,oldVal){console.log(newVal,oldVal);},}}结果:打印出来newVal和oldVal输出内容一样console.log(newVal===oldVal)//true发现这......
  • Vue.set和splice方法有什么区别?
    Vue.set方法和splice方法在Vue中用于修改数组的行为有一些区别。一:Vue.set(obj,key,value):用途:Vue.set是Vue提供的全局方法,用于向响应式对象中添加新的响应式属性,并确保这个新属性是响应式的。参数:obj:要修改的目标对象。key:要添加的属性键名。value:要添加的属性值。示......
  • 从零开始使用vue2+element搭建后台管理系统(实现导出excel表格的功能)
    首先参阅了以下文档:https://panjiachen.gitee.io/vue-element-admin-site/zh/feature/component/excel.html#excel-%E5%AF%BC%E5%87%BAhttps://blog.csdn.net/weixin_42028153/article/details/124804841核心思想:抄一下vue-element-admin这个很棒的开源集成后台管理系统中所提......