2 回复
https://ext.dcloud.net.cn/plugin?id=9896
看看这个是不是你想要的
针对你提到的uni-app横向滚动抽奖插件需求,以下是一个简化的代码案例,展示了如何实现一个基本的横向滚动抽奖功能。这个示例将使用uni-app的组件和API来实现。
首先,确保你的uni-app项目已经创建并配置好。然后,你可以按照以下步骤实现横向滚动抽奖插件。
- 创建页面组件
在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>
这个代码案例展示了一个基本的横向滚动抽奖功能,包括一个可滚动的视图容器、一个开始抽奖的按钮以及相应的逻辑处理。你可以根据实际需求进一步调整和优化这个插件。