更新记录
1.0.0(2026-07-08)
下载此版本
- 初始版本发布
- Canvas 绘制转盘,支持自定义颜色、文字、分隔线
- 支持自定义转盘图、背景图、指针图
- 内置默认指针样式和装饰灯环动画
- CSS transition 缓出旋转动画
- 支持外部调用 startSpin() 和 reset()
平台兼容性
uni-app(5.14)
| Vue2 |
Vue3 |
Chrome |
Safari |
app-vue |
app-nvue |
Android |
iOS |
鸿蒙 |
| √ |
√ |
√ |
- |
√ |
- |
- |
- |
- |
| 微信小程序 |
支付宝小程序 |
抖音小程序 |
百度小程序 |
快手小程序 |
京东小程序 |
鸿蒙元服务 |
QQ小程序 |
飞书小程序 |
小红书小程序 |
快应用-华为 |
快应用-联盟 |
| - |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
long-turntable 长转盘组件
可定制的抽奖转盘组件,转盘旋转、指针静止,纯 CSS 扇形绘制,支持图片、权重概率等。
特性
- 🎯 转盘旋转:转盘转动选奖,指针固定在顶部
- 🎨 CSS 扇形:纯 CSS
conic-gradient 绘制,无 Canvas 依赖
- 🖼️ 奖品图片:支持在每个扇区文字下方显示图片
- ⚖️ 权重概率:每项
weight 控制中奖概率,设为 0 则该奖项永不中
- 🎪 流畅动画:CSS transition 缓出动画
- 💡 跑马灯环:可开关的装饰灯效,灯点颜色可自定义
- 📱 多端兼容:H5 / App / 微信小程序等
基础用法
<template>
<long-turntable
:prize-list="prizes"
@finish="onFinish"
/>
</template>
<script>
export default {
data() {
return {
prizes: [
{ name: '谢谢参与', color: '#8B8B8B', weight: 30 },
{ name: '8.8折', color: '#FF6B6B', weight: 20 },
{ name: '600元', color: '#FFA502', weight: 3 },
{ name: '1元', color: '#FFD93D', weight: 15 },
{ name: '首单半价', color: '#6BCB77', weight: 5 },
{ name: '400元', color: '#E056A0', weight: 0 }
]
}
},
methods: {
onFinish(e) {
uni.showToast({ title: '恭喜获得:' + e.prize.name, icon: 'none' })
}
}
}
</script>
带图片的奖品
<long-turntable
:prize-list="prizes"
:label-img-size="80"
/>
<!-- prizes 中的图片项 -->
{ name: '600元', color: '#FFA502', image: 'https://x.com/icon.png' }
自定义外观
<long-turntable
:prize-list="prizes"
:size="700"
text-color="#FFFFFF"
:font-size="28"
pointer-text="抽"
pointer-color="#FFFFFF"
center-color="linear-gradient(135deg, #FF6B6B, #EE5A24)"
center-text-color="#FFFFFF"
outer-color="linear-gradient(135deg, #5A4AD8, #8B7FE8)"
lamp-color="#FFE066"
lamp-on-color="#FFD700"
:show-lamps="true"
/>
外部控制(服务端返回中奖结果)
<template>
<long-turntable ref="tt" :prize-list="prizes" @finish="onFinish" />
<button @click="spin">抽奖</button>
</template>
<script>
export default {
methods: {
async spin() {
// 请求服务端获取中奖索引
const res = await uni.request({ url: '/api/lottery' })
this.$refs.tt.startSpin(res.data.index)
},
onFinish(e) {
console.log('中奖:', e.index, e.prize.name)
}
}
}
</script>
Props
| 属性 |
类型 |
默认值 |
说明 |
prizeList |
Array |
8个默认奖品 |
[{name, color?, image?, weight?}],weight 默认1,最小0 |
size |
Number |
700 |
转盘直径(rpx) |
duration |
Number |
4 |
旋转动画时长(秒) |
disabled |
Boolean |
false |
是否禁用抽奖 |
showLamps |
Boolean |
true |
是否显示灯环跑马灯 |
lampColor |
String |
'#FFE066' |
灯点普通态颜色 |
lampOnColor |
String |
'#FFD700' |
灯点亮起态颜色 |
colors |
Array |
12色预设 |
扇形默认配色(会被prizeList中的color覆盖) |
textColor |
String |
'#FFFFFF' |
奖品文字颜色 |
fontSize |
Number |
32 |
奖品文字大小(rpx) |
labelImgSize |
Number |
80 |
奖品图片尺寸(rpx) |
pointerText |
String |
'抽' |
中心按钮文字 |
pointerColor |
String |
'#FFFFFF' |
指针三角形颜色 |
pointerImage |
String |
'' |
中心按钮图片URL(传了则替代文字) |
centerColor |
String |
渐变色 |
中心按钮背景色,支持渐变色 |
centerTextColor |
String |
'#FFFFFF' |
中心按钮文字颜色 |
outerColor |
String |
渐变色 |
外圈背景色,支持渐变色 |
bgImage |
String |
'' |
整体背景图URL |
prizeList 字段说明
| 字段 |
类型 |
必填 |
说明 |
name |
String |
是 |
奖品名称 |
color |
String |
否 |
扇形背景色,不传则使用 colors 数组 |
image |
String |
否 |
奖品图片URL,显示在文字下方 |
weight |
Number |
否 |
中奖权重(默认1,最小0=永不中) |
Events
| 事件 |
参数 |
说明 |
@start |
{index, prize} |
开始旋转时触发 |
@finish |
{index, prize} |
旋转结束时触发 |
方法 (ref)
| 方法 |
参数 |
说明 |
startSpin(n) |
n: 目标索引 |
转到指定奖品(不受权重影响) |
reset() |
无 |
重置转盘角度 |