更新记录

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() 重置转盘角度

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议

暂无用户评论。