vue3实现列表随机抽奖功能,循环滚动最后减速停在选中项上。

vue3实现列表随机抽奖功能,循环滚动最后减速停在选中项上


代码如下:

<template>
  <div>
    <div class="slot-machine" ref="slotMachine" style="height: 40px; overflow: hidden;">
      <ul ref="list" class="options" :style="{ transform: `translateY(${position}px)` }">
        <li v-for="(option, index) in options" :key="index">{{ option }}</li>
      </ul>
    </div>
    <button @click="startSlotMachine">开始抽奖</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      options: [
      '选项1', 
      '选项2', 
      '选项3', 
      '选项4', 
      '选项5',
      '选项6',
      '选项7',
      '选项8',
      '选项9',
      '选项10',
      '选项11',
      ], // 你的选项列表
      position: 0,
      duration: 5000, // 抽奖持续时间
      speed: 10,
      isSpinning: false
    };
  },
  methods: {
    startSlotMachine() {
      if (!this.isSpinning) {
        this.isSpinning = true;
        const targetIndex = Math.floor(Math.random() * this.options.length); // 随机选择一个索引作为停止点
        const itemHeight = this.$refs.list.querySelectorAll('li')[0].offsetHeight;
        const distanceToTravel = itemHeight * (this.options.length * 10000); // 滚动距离,可根据需要调整
        const acceleration = 1; // 减速度,可根据需要调整

        this.speed = 10;
        let currentTime = 0;
        const easeOut = (t) => t * (2 - t);

        const animate = () => {
          if (currentTime < this.duration) {
            requestAnimationFrame(animate);
          }

          currentTime += 10; // 动画每帧持续时间

          const distance = easeOut(currentTime / this.duration) * distanceToTravel;
          this.speed = acceleration * distance / this.duration;
          this.position -= this.speed;

          if (this.position <= -targetIndex * itemHeight) {
            this.position = -targetIndex * itemHeight;
            this.isSpinning = false;
          }
        };

        animate();
      }
    }
  }
};
</script>

<style>
.slot-machine {
  border: 1px solid #ccc;
  width: 200px;
  margin: 20px 0;
  position: relative;
}

.options {
  list-style: none;
  padding: 0;
  margin: 0;
  transition: transform 1s ease-out;
}

.options li {
  height: 40px;
  line-height: 40px;
}
</style>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝with黑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值