大转盘组件

<template>
  <view>
    <view class="turntable_wp sol-class">
      <image class="turntableImg" src="@/static/images/home/turntable/bgp.png"></image>
      <view
        :style="'-webkit-transform:rotate(' + deg + 'deg) translateZ(0);transform:rotate(' + deg + 'deg) translateZ(0)'"
        class="turntable_pointer"
        @tap="start"
      >
        <image src="@/static/images/home/turntable/btn.png"></image>
      </view>
    </view>
  </view>
</template>

<script lang="ts" setup>
import { ref, onBeforeMount, onMounted, unref } from 'vue'
import { turntable } from '../pages/home/pages/turntable/turntable'
const { getNewGiftlist } = turntable()
onMounted(async () => {
  await getNewGiftlist()
})
const deg = ref(0)
const singleAngle = ref()
const isStart = ref(false)

const emits = defineEmits(['start', 'success'])
const props = defineProps({
  // 划分区域
  areaNumber: {
    type: Number,
    default: 7,
  },
  // 速度
  speed: {
    type: Number,
    default: 16,
  },
})

onBeforeMount(() => {
  init()
})

function init() {
  const { areaNumber } = props
  const singleAngleData = 360 / areaNumber
  singleAngle.value = singleAngleData
}

// 点击开始抽奖
function start() {
  emits('start')
}

function begin(awardNumer: number) {
  let degData = deg.value
  const singleAngleData = singleAngle.value
  const speed = props.speed
  const isStartData = isStart.value
  if (isStartData) return
  isStart.value = true
  let endAddAngle = 0
  endAddAngle = 360 - ((awardNumer - 1) * singleAngleData + singleAngleData / 2) // 中奖角度

  const rangeAngle = (Math.floor(Math.random() * 4) + 4) * 360 // 随机旋转几圈再停止

  // console.log(endAddAngle)
  let cAngle
  degData = 0
  const timer = setInterval(() => {
    if (degData < rangeAngle) {
      degData += speed
    } else {
      cAngle = (endAddAngle + rangeAngle - degData) / speed
      cAngle = cAngle > speed ? speed : cAngle < 1 ? 1 : cAngle
      degData += cAngle

      if (degData >= endAddAngle + rangeAngle) {
        degData = endAddAngle + rangeAngle
        isStart.value = false
        clearInterval(timer)
        emits('success')
      }
    }

    deg.value = degData
  }, 1000 / 60)
}

defineExpose({
  begin,
})
</script>
<style lang="scss" scoped>
.turntable_wp {
  width: 578.27rpx;
  height: 748.88rpx;
  position: relative;
}

.turntable_wp .turntable_pointer {
  position: absolute;
  width: 240rpx;
  height: 240rpx;
  top: 41%;
  left: 50%;
  margin: 0 0 0 -30rpx;
  z-index: 9;

  image {
    width: 240rpx;
    height: 240rpx;
    position: absolute;
    transform: rotate(-33deg);
  }
}

// .TsTurntable {
//   position: absolute;
//   top: 195rpx;
//   left: calc((750rpx - 470rpx) / 2);
//   z-index: 8;
// }

.turntableImg {
  width: 596rpx;
  height: 781rpx;
  position: absolute;
  // z-index: 8;
  top: 150rpx;
  left: calc((750rpx - 596rpx) / 2);
}
</style>

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值