Vue笔记_插件组件_lucky-canvas抽奖转盘

11 篇文章 0 订阅


lucky-canvas 是一个基于 Js + Canvas 的抽奖 web 前端组件,提供 大转盘九宫格两种抽奖界面,UI 精美,功能强大且专业可靠,只需要通过简单配置即可实现自由定制,快速完成产品需求。

官网

lucky-canvas官网

lucky-canvas可以在vue、react、微信小程序…中使用,在此以vue2.x作为示例进行说明。

使用(vue2.x)
[1] 下载
npm install @lucky-canvas/vue@latest
[2] 引入
// 完整加载---引入+全局注册
import VueLuckyCanvas from '@lucky-canvas/vue'
Vue.use(VueLuckyCanvas)
[3] 使用
<template>
  <LuckyWheel
    width='转盘宽度'
    height='转盘高度'
    prizes="奖品"
    blocks="背景"
    :buttons="开始按钮"
    @start="点击开始按钮触发start"
    @end="抽奖结束触发end"
  />
</template>
配置项-width/height

width: ‘300px’ // 默认300px
height: ‘300px’ // 默认300px

在进行渲染时,为了使页面能够等比放大/缩小,会进行配置将所有单位为px的值自动转换为rem单位。

但是canvas中值的单位是不自动进行转换的

<LuckyWheel
  ref="myLucky"
  width="345px"
  height="345px"
/>
// 无论手机屏幕宽高为多少,转盘都是直径为375px的圆

因此 若是想要转盘随着页面等比缩放 => 在给配置项设置数据时单位需要设置为rem或百分比其他配置项中的设置与此相同

<LuckyWheel
  ref="myLucky"
  width="9.2rem"
  height="9.2rem"
/>
// 若是手机屏幕宽度为375px则转盘为直径为345px的圆;若是手机屏幕宽度为414px则转盘为直径为380.8px的圆。

注:若是宽高不一致,则直径为min[width, height]。

配置项-blocks

blocks用于背景设置
在这里插入图片描述

<template>
  <div class="test">
    <LuckyWheel
      ref="myLucky"
      class="test-myLucky"
      :width="width"
      :height="width"
      :blocks="blocks"
    />
  </div>
</template>
this.blocks = [{
  padding: '0.46rem',
  imgs:[{
    src:'https://img.iwave.net.cn/jeep/51c95637a377c3a12d09abe8b0f975e6.png',
    width: this.width,
    height: this.width,
    rotate: true
  }] 
}]

在这里插入图片描述

配置项-prizes

在这里插入图片描述

<template>
  <div class="test">
    <LuckyWheel
      ref="myLucky"
      class="test-myLucky"
      :width="width"
      :height="width"
      :blocks="blocks"
      :prizes="prizes"
    />
  </div>
</template>
const prizes = [
  {
    id: 1,
    icon: "https://img.iwave.net.cn/bmw/b365029b17e0e1fc972b52080f58cc80.png",
    title: "iphone15 Pro"
  },
  {
      id: 2,
      icon: "https://img.iwave.net.cn/bmw/bbb9c678305a2f55ce7b285561744596.png",
      title: "普通红包"
  },
  {
      id: 3,
      icon: "https://img.iwave.net.cn/bmw/9b03fe2dcbb6be8c02ac63ff0927c92f.png",
      title: "5元话费券"
  },
  {
      id: 4,
      icon: "https://img.iwave.net.cn/bmw/7cffe2c789279a83ef577283535a2c1b.png",
      title: "每日红包"
  },
  {
      id: 5,
      icon: "https://img.iwave.net.cn/bmw/a3731dd942951974b9be1da171735d82.png",
      title: "幸运红包"
  },
  {
      id: 6,
      icon: "https://img.iwave.net.cn/bmw/dc3c6e7624f6b8291c82a36b552785f6.png",
      title: "10元话费券"
  },
  {
      id: 7,
      icon: "https://img.iwave.net.cn/bmw/a6b978fd0064a45ebcd6b649d49714ea.png",
      title: "惊喜福袋"
  },
  {
      id: 8,
      icon: "https://img.iwave.net.cn/bmw/873a940855c837b4d6622fe8da442b8b.png",
      title: "谢谢参与"
  }
]
this.prizes = prizes.map(item=>({
  fonts: [{text: item.title, top: '10%', fontColor: '#FF7002', fontSize: '0.426rem', fontWeight: 600, wordWrap: false, lineHeight: '0.613rem'}],
  imgs: [{src: item.icon, top: '1.38rem', width: '1.3rem', height: '1.4rem' }]
}))

在这里插入图片描述

配置项-buttons

在这里插入图片描述

<template>
  <div class="test">
    <LuckyWheel
      ref="myLucky"
      class="test-myLucky"
      :width="width"
      :height="width"
      :blocks="blocks"
      :prizes="prizes"
      :buttons="buttons"
    />
  </div>
</template>
this.buttons = [{
  radius: '32.8%',
  imgs:[{
    src: 'https://img.iwave.net.cn/jeep/8e38bb871f79ef8950da8697603cde94.png',
    top: '-1.7rem',
    width: '3.02rem',
    height: '3.02rem'
  }]
}] 

在这里插入图片描述

此时点击 “点击领取” 按钮转盘无任何反应,因为我们还没有设置事件进行抽奖。

<template>
  <div class="test">
    <LuckyWheel
      ref="myLucky"
      class="test-myLucky"
      :width="width"
      :height="width"
      :blocks="blocks"
      :prizes="prizes"
      :buttons="buttons"
      @start="startCallback"
      @end="endCallback"
    />
  </div>
</template>
methods:{
  startCallback () {
    console.log('#@@@@@')
    // 调用抽奖组件的play方法开始游戏
    this.$refs.myLucky.play()
    // 模拟调用接口异步抽奖
    setTimeout(() => {
      // 假设后端返回的中奖索引是0
      const index = 0
      // 调用stop停止旋转并传递中奖索引
      this.$refs.myLucky.stop(index)
    }, 3000)
  },
  // 抽奖结束会触发end回调
  endCallback (prize) {
    console.log(prize)
  }
},

此时抽奖转盘就大致完成了。

优化

此处还做了一些小优化

  • [1] 在不抽奖时转盘默认是静止不动的,但是我希望在没有抽奖时转盘可以慢慢旋转。
    在这里插入图片描述
    现在可以缓慢转动了,但是出现了一个新的问题----> 整个转盘是一起转动的包括按钮
    在这里插入图片描述

当旋转岛将近180deg时,按钮倒置,用户体验非常不好

  • [2] 按钮抽离
    于是我先不设置按钮,最后将按钮定位在转盘上
    在这里插入图片描述
案例
<template>
  <div class="test">
    <LuckyWheel
      ref="myLucky"
      class="test-myLucky"
      :width="width"
      :height="width"
      :blocks="blocks"
      :prizes="prizes"
      @end="endCallback"
    />
    <div class="startbtn" @click="startCallback"></div>
  </div>
</template>
<script>
export default{
  created(){
    this.blocks = [{
      padding: '0.46rem',
      imgs:[{
        src:'https://img.iwave.net.cn/jeep/51c95637a377c3a12d09abe8b0f975e6.png',
        width: this.width,
        height: this.width,
        rotate: true
      }] 
    }]
    const prizes = [
      {
        id: 1,
        icon: "https://img.iwave.net.cn/bmw/b365029b17e0e1fc972b52080f58cc80.png",
        title: "iphone15 Pro"
      },
      {
          id: 2,
          icon: "https://img.iwave.net.cn/bmw/bbb9c678305a2f55ce7b285561744596.png",
          title: "普通红包"
      },
      {
          id: 3,
          icon: "https://img.iwave.net.cn/bmw/9b03fe2dcbb6be8c02ac63ff0927c92f.png",
          title: "5元话费券"
      },
      {
          id: 4,
          icon: "https://img.iwave.net.cn/bmw/7cffe2c789279a83ef577283535a2c1b.png",
          title: "每日红包"
      },
      {
          id: 5,
          icon: "https://img.iwave.net.cn/bmw/a3731dd942951974b9be1da171735d82.png",
          title: "幸运红包"
      },
      {
          id: 6,
          icon: "https://img.iwave.net.cn/bmw/dc3c6e7624f6b8291c82a36b552785f6.png",
          title: "10元话费券"
      },
      {
          id: 7,
          icon: "https://img.iwave.net.cn/bmw/a6b978fd0064a45ebcd6b649d49714ea.png",
          title: "惊喜福袋"
      },
      {
          id: 8,
          icon: "https://img.iwave.net.cn/bmw/873a940855c837b4d6622fe8da442b8b.png",
          title: "谢谢参与"
      }
    ]
    this.prizes = prizes.map(item=>({
      fonts: [{text: item.title, top: '0.4rem', fontColor: '#FF7002', fontSize: '0.426rem', fontWeight: 600, wordWrap: false, lineHeight: '0.613rem'}],
      imgs: [{src: item.icon, top: '1.38rem', width: '1.3rem', height: '1.4rem' }]
    }))
  },
methods:{
  startCallback () {
    console.log('#@@@@@')
    // 调用抽奖组件的play方法开始游戏
    this.$refs.myLucky.play()
    // 模拟调用接口异步抽奖
    setTimeout(() => {
      // 假设后端返回的中奖索引是0
      const index = 0
      // 调用stop停止旋转并传递中奖索引
      this.$refs.myLucky.stop(index)
    }, 3000)
  },
  // 抽奖结束会触发end回调
  endCallback (prize) {
    console.log(prize)
  },
},
  computed:{
    width(){
      return '9.2rem'
    }
  }
}
</script>
<style lang="less" scoped>
@keyframes rotato{
  0%{
    transform: rotate(0deg);
  }
  100%{
    transform: rotate(360deg);
  }
}
.test{
  position: relative;
  &-myLucky{
    margin: auto;
    animation: rotato 20s linear infinite forwards;
  }
  .startbtn{
    position: absolute;
    background: url('https://img.iwave.net.cn/jeep/8e38bb871f79ef8950da8697603cde94.png');
    width: 114px;
    height: 114px;
    background-size: 100%;
    top: 108px;
    left: 130px;
    z-index: 100;
  }
}
</style>
配置项-defaultConfig

在这里插入图片描述
在默认情况下转盘的偏移角度为0deg, 如下

在这里插入图片描述
沿着x轴,y轴进行分割,“子”作为第一份奖品。

若是希望第一份奖品处于正中间的位置,可以设置转盘的偏移角度,如下

<!--便宜一份奖品的一半-->
:defaultConfig="{offsetDegree: -15}"

在这里插入图片描述

测算案例

八字测算案例

  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
根据提供的引用内容,'C:\\Users\\chris\\AppData\\Roaming\\Python\\Python37\\site-packages' 是第一个引用,'C:\\Users\\chris\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages' 是第二个引用,'C:\\Users\\chris\\AppData\\Local\\Programs\\Python\\Python37\\lib' 是第三个引用。 根据你的问题,资源繁忙或锁定,重命名 'C:\Users\王 羊\Desktop\ttskinsvue\node_modules\@lucky-canvas\vue\node_modules\vue-demi' 的具体步骤如下: 1. 确保你有足够的权限来操作文件和文件夹。 2. 检查文件或文件夹是否当前正在被其他程序占用或使用。你可以尝试关闭与该文件或文件夹相关的其他程序,以确保资源不再繁忙或锁定。 3. 如果该文件或文件夹仍然被其他程序锁定,你可以尝试重新启动计算机以解决该问题。重新启动可以清除任何冲突或占用该资源的进程。 4. 如果问题仍然存在,你可以尝试更改文件或文件夹的名称,以便为其提供一个唯一且可用的名称。 请注意,重命名文件或文件夹可能会导致其他程序或代码无法访问它们。因此,在执行重命名操作之前,请确保你了解所有可能的影响并做好备份。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [python笔记](https://blog.csdn.net/qq_36774734/article/details/129894732)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值