uni-app 横向滚动抽奖插件需求

发布于 1周前 作者 yibo5220 来自 Uni-App

uni-app 横向滚动抽奖插件需求

横向一排数据 自动滚动到奖品的位置

2 回复

针对你提到的uni-app横向滚动抽奖插件需求,以下是一个简化的代码案例,展示了如何实现一个基本的横向滚动抽奖功能。这个示例将使用uni-app的组件和API来实现。

首先,确保你的uni-app项目已经创建并配置好。然后,你可以按照以下步骤实现横向滚动抽奖插件。

  1. 创建页面组件

pages目录下创建一个新的页面,比如lottery,并在该页面下创建lottery.vue文件。

<template>
  <view class="container">
    <scroll-view scroll-x="true" class="scroll-view">
      <view class="item" v-for="(item, index) in items" :key="index" :style="{ transform: `translateX(${currentPosition - index * itemWidth}px)` }">
        {{ item }}
      </view>
    </scroll-view>
    <button @click="startLottery">开始抽奖</button>
  </view>
</template>

<script>
export default {
  data() {
    return {
      items: ['奖品1', '奖品2', '奖品3', '奖品4', '奖品5'],
      currentPosition: 0,
      itemWidth: 200, // 根据实际设计调整宽度
      animationFrameId: null,
    };
  },
  methods: {
    startLottery() {
      this.stopLottery(); // 如果已经在滚动,先停止
      let startPosition = this.items.length * this.itemWidth / 2; // 从中间开始
      this.currentPosition = startPosition;
      let targetPosition = Math.floor(Math.random() * this.items.length) * this.itemWidth;
      let startTime = Date.now();
      const animate = () => {
        let currentTime = Date.now();
        let elapsed = currentTime - startTime;
        let progress = Math.min(elapsed / 2000, 1); // 2秒内完成滚动
        this.currentPosition = startPosition + (targetPosition - startPosition) * easeInOutQuad(progress);
        if (progress < 1) {
          this.animationFrameId = requestAnimationFrame(animate);
        } else {
          this.currentPosition = targetPosition;
          console.log('中奖:', this.items[Math.floor(targetPosition / this.itemWidth)]);
        }
      };
      animate();
    },
    stopLottery() {
      if (this.animationFrameId) {
        cancelAnimationFrame(this.animationFrameId);
        this.animationFrameId = null;
      }
    },
  },
};

// 缓动函数
function easeInOutQuad(t) {
  return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;
}
</script>

<style>
.container {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  height: 100vh;
}
.scroll-view {
  width: 80%;
  height: 100px;
  display: flex;
  overflow: hidden;
}
.item {
  flex-shrink: 0;
  width: 200px; /* 与itemWidth保持一致 */
  height: 100px;
  display: flex;
  align-items: center;
  justify-content: center;
  background-color: #f0f0f0;
  margin: 0 5px;
}
</style>

这个代码案例展示了一个基本的横向滚动抽奖功能,包括一个可滚动的视图容器、一个开始抽奖的按钮以及相应的逻辑处理。你可以根据实际需求进一步调整和优化这个插件。

回到顶部