iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue3实现九宫格抽奖的示例代码
  • 895
分享到

Vue3实现九宫格抽奖的示例代码

2024-04-02 19:04:59 895人浏览 独家记忆
摘要

目录前言前期构思具体实现1、布局2、指定奖品3、抽奖最终效果前言 对象说晚饭吃什么太难选择,问我能不能做一个九宫格抽奖来决定我们晚上吃什么,emmm。 既然对象都开口了,不做也不行啊

前言

对象说晚饭吃什么太难选择,问我能不能做一个九宫格抽奖来决定我们晚上吃什么,emmm。

既然对象都开口了,不做也不行啊,最后给大家看一个简化版的(没有美工样式、编辑奖品这些)

前期构思

首先是布局,这个比较简单,用弹性布局(flex)就足够了,抽奖盒子固定宽高,奖品项为盒子的1/3,超过换行就行,转动方向是这样的:

抽奖方式主要分为两种,一种是随机抽取(完全随机),还有一种是指定奖品抽取(瞒着女朋友加的功能?,为了以后能吃到自己喜欢的东西)

转动速度的规则是:加速 -> 匀速 -> 减速。

代码实现用了 vue3

具体实现

1、布局

布局采用弹性布局,利用 Vuev-for 动态生成九个 item ,select 样式是用来控制转动的时候当前选中的 item。

这里循环的key值,我使用的索引值,主要是为了后面添加编辑奖品的时候,id不一定能保证按顺序排列,所以用索引值比较直观。

<template>
  <div class="box">
    <div v-for="(item, index) in raffleItem" :key="index" :class="{item: true, select: selectItem === index}">{{ item.name }}</div>
  </div>
  <button @click="startRaffle">开始抽奖</button>
</template>
<script>
import { defineComponent } from 'vue';

export default defineComponent({
  setup() {
    // 奖品
    const raffleItem = [
      {name: '法拉利', id: 1},
      {name: '兰博基尼', id: 2},
      {name: '保时捷', id: 3},
      {name: '宝马', id: 4},
      {name: '悍马人', id: 5},
      {name: '红旗', id: 6},
      {name: '特斯拉', id: 7},
      {name: '比亚迪', id: 8},
      {name: '奔驰', id: 9}
    ]
    // 选中的item
    const selectItem = ref(0)
    return {
      raffleItem,
      selectItem
    }
  },
});
</script>

<style>
.box {
  width: 300px;
  height: 300px;
  display: flex;
  flex-wrap: wrap;
  justify-content: space-around;
  align-items: center;  
}
.item {
  width: 95px;
  height: 95px;
}
.box, .item {
  box-sizing: border-box;
  border: 1px solid;
  border-radius: 5px;
}
.select {
  border-color: red;
  color: red;
  background: #579393;
}
</style>

2、指定奖品

为每一个 item 添加单机事件 appoint(index),传入参数为当前的索引值。

做成点击事件指定奖品主要是为了不让对象发现

// 指定的奖品
const appointRaffle = ref(null)
// 指定奖品
const appoint = (index) => {
  appointRaffle.value = index
}

3、抽奖

抽奖的具体实现:

  • 利用定时器 setTimeout 控制转动速度speed
  • 转动速度(speed)的规则为,通过圈数跟中奖项计算出总的转动次数,然后先加速再匀速最后减速
  • 利用样式规则来控制选中的 item selectItem
  • 转动的圈数量activeTurns 通过随机数取 10~20
  • 中奖的规则:圈数跟需要转动的总圈数相同并且转到本轮中奖的位置则停止转动表示中奖
  • 每次抽奖前需要初始化各种状态值,如:选中的item(selectItem)、当前中奖(activeRaffle)...
  • 如果已经在抽奖,开始抽奖按钮就会失效
// 指定的奖品
const appointRaffle = ref(null)
// 指定奖品
const appoint = (index) => {
  appointRaffle.value = index
}
// 当前中奖
const activeRaffle = ref(null)
// 选中的item
const selectItem = ref(0)
// 定时器
const timer = ref(null)
// 圈数
const turnsNumbers = ref(0)
// 转多少圈中奖
const activeTurns = ref(0)
// 初始转动速度
const speed = ref(100)
// 剩余几个中奖
const surplusNum = computed(() => {
  // 剩余圈数 * 9 + 指定中奖的索引
  return (activeTurns.value - turnsNumbers.value) * 9 + appointRaffle.value - selectItem.value
})
// 初始化
const init = () => {
  selectItem.value = 1
  activeTurns.value = 0
  turnsNumbers.value = 0
  speed.value = 100
  activeRaffle.value = null
}
// 开始抽奖
const startRaffle = () => {
  // 如果已经存在定时器则表示已经在转动,不理会
  if(timer.value) return
  // 初始化
  init()
  // 如果没有指定奖品则随机指定一个奖品
  if(!appointRaffle.value) {
    // 取随机数0-8,数组的索引值
    appointRaffle.value = Math.round(Math.random() * 8)
  }
  // 取随机数10~20圈,id > 4时少转一圈
  const num = Math.round(Math.random()*10) + 10
  activeTurns.value = appointRaffle.value > 4 ? num - 1 : num
  // 抽奖
  handleRaffle()
}

转动的方法实现

这里需要注意的是,我们使用的是索引值,所以转动一圈为0~8,而不是1~9

// 抽奖方法
const handleRaffle = () => {
  // 每转完一圈
  if (selectItem.value === 8) {
    turnsNumbers.value ++
    selectItem.value = 0
  } else {
    selectItem.value ++
  }
  // 转动速度规则
  speed.value = speedRole()
  // 如果圈数跟需要转动的总圈数相同并且转到本轮中奖的位置则停止转动
  if (activeTurns.value === turnsNumbers.value && selectItem.value === appointRaffle.value) {
    // 中奖
    activeRaffle.value = raffleItem[appointRaffle.value].name 
    // 清除定时器
    clearTimeout(timer.value)
    timer.value = null
    // 清除指定中奖项
    appointRaffle.value = null
  } else {
    // 定时器
    timer.value = setTimeout(handleRaffle, speed.value)
  }
}

转动规则的方法

转动速度分为4个阶段

  • 前面的 1/3 加速转动
  • 中间的 1/3 是匀速转动
  • 后面的 1/3 是减速转动
  • 最后的 9 个速度降低到 300 转动

经过计算,在圈数的分为内,最后的减速转动,不能把速度减少到 300 之上,所以不会出现最后 9 个加速转动的情况

// 转动速度规则-先加速在匀速最后减速
const speedRole = () => {
  const total = activeTurns.value * 9 + appointRaffle.value
  // 剩余最后9个中奖时的时候速度降低到300
  if(surplusNum.value <= 9) return 300
  // 前3/1加速转动
  if(surplusNum.value >=  total * 2 / 3) return speed.value <= 50 ? 50 : speed.value - 2
  // 最后的3/1减速每次+1
  if(surplusNum.value <=  total / 3) return speed.value + 1
  // 剩余的中间匀速
  return speed.value
}

最终效果

以上就是Vue3实现九宫格抽奖的示例代码的详细内容,更多关于Vue九宫格抽奖的资料请关注编程网其它相关文章!

--结束END--

本文标题: Vue3实现九宫格抽奖的示例代码

本文链接: https://www.lsjlt.com/news/168804.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Vue3实现九宫格抽奖的示例代码
    目录前言前期构思具体实现1、布局2、指定奖品3、抽奖最终效果前言 对象说晚饭吃什么太难选择,问我能不能做一个九宫格抽奖来决定我们晚上吃什么,emmm。 既然对象都开口了,不做也不行啊...
    99+
    2024-04-02
  • JavaScript实现九宫格抽奖功能的示例代码
    目录效果图实现流程主要代码效果图 话不多说,直接上效果: 实现流程 主要流程为: 1. 根据效果图,构建静态页面 2. 获取元素(自带的属性) 3. 绑定事件 4. 事件触发之后 ...
    99+
    2024-04-02
  • Android实现九宫格抽奖
    本文实例为大家分享了Android实现九宫格抽奖的具体代码,供大家参考,具体内容如下 package cq.cake.luckdraw; import android.graph...
    99+
    2024-04-02
  • JavaScript实现九宫格抽奖
    本文实例为大家分享了JavaScript实现九宫格抽奖的具体代码,供大家参考,具体内容如下 看到个抽奖案例,觉得还不错。就自己做了一个简单版本。 点击中间的开始,抽奖就会跑起来,速...
    99+
    2024-04-02
  • JS实现简单九宫格抽奖
    用JavaScript写一个九宫格的抽奖盘,供大家参考,具体内容如下 点击中间的块,选中奖品的亮块会在边缘的8个块循环; 选中后,弹出选中的内容; 代码参考: HTML文件: <...
    99+
    2024-04-02
  • 原生JavaScript实现九宫格抽奖
    本文实例为大家分享了JavaScript实现九宫格抽奖 的具体代码,供大家参考,具体内容如下 思路:通过移动背景颜色实现中奖信息,每一个方形元素,需要按顺序排列,加个延时器...
    99+
    2024-04-02
  • JS实现简单的九宫格抽奖
    本文实例为大家分享了JS实现简单九宫格抽奖的具体代码,供大家参考,具体内容如下 结构 <body>     <div id="fa">         &l...
    99+
    2024-04-02
  • Android 实现九宫格抽奖功能
    目录效果展示实现步骤 1.生成抽奖矩形:2.添加奖品图片:3.实现抽奖动画:4.实现动态设置参数:5.添加抽奖结果回调效果展示 实现步骤 1.生成抽奖矩形: 其中每个矩形的宽高相...
    99+
    2024-04-02
  • jquery如何实现九宫格抽奖
    这篇文章主要介绍jquery如何实现九宫格抽奖,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!jquery实现九宫格抽奖的方法:1、创建好前端展示的代码;2、通过jquery代码“$("#lottery a&...
    99+
    2023-06-21
  • jquery+h5实现九宫格抽奖特效(前后端代码)
    前言: 前端:jq+h5 实现九宫格动效 后端:thinkphp3.2.3 实现中奖概率算法 功能:支持读取数据库预设的中奖率及奖品池,中奖率可以自定义,必须是整数 最终效果如下: ...
    99+
    2024-04-02
  • 原生JavaScript怎么实现九宫格抽奖
    本文小编为大家详细介绍“原生JavaScript怎么实现九宫格抽奖”,内容详细,步骤清晰,细节处理妥当,希望这篇“原生JavaScript怎么实现九宫格抽奖”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。思路:通过...
    99+
    2023-07-02
  • JS如何实现简单九宫格抽奖
    这篇文章主要介绍了JS如何实现简单九宫格抽奖的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JS如何实现简单九宫格抽奖文章都会有所收获,下面我们一起来看看吧。HTML文件:<body><div&...
    99+
    2023-07-02
  • JS如何实现简单的九宫格抽奖
    本篇内容介绍了“JS如何实现简单的九宫格抽奖”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!结构<body>  ...
    99+
    2023-07-02
  • jquery实现九宫格大转盘抽奖功能
    本篇内容主要讲解“jquery实现九宫格大转盘抽奖功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“jquery实现九宫格大转盘抽奖功能”吧! 一、用...
    99+
    2024-04-02
  • 原生JS怎样实现九宫格抽奖效果
    小编给大家分享一下原生JS怎样实现九宫格抽奖效果,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!效果图:代码如下:<!DOCTYPE html> <html>...
    99+
    2024-04-02
  • 微信小程序实现简单九宫格抽奖
    本文实例为大家分享了微信小程序实现简单九宫格抽奖的具体代码,供大家参考,具体内容如下 废话不多说,先上样板图 代码就先wxml文件: <view id="container"...
    99+
    2024-04-02
  • vue实现宫格轮转抽奖
    vue实现宫格轮转抽奖(类似穿越火线的xx轮回),供大家参考,具体内容如下 不做过多的解说,直接上代码啦。关键的代码都写了注释,很容易理解。直接复制即可使用! 另外css部分依赖 n...
    99+
    2024-04-02
  • 怎么用PHP+Ajax实现手机端九宫格抽奖程序
    这篇文章主要讲解了“怎么用PHP+Ajax实现手机端九宫格抽奖程序”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用PHP+Ajax实现手机端九宫格抽奖程序”吧!PHP+Ajax结合lot...
    99+
    2023-06-04
  • Java实现抽奖算法的示例代码
    目录一、题目描述二、解题思路三、代码详解四、优化抽奖算法解题思路代码详解一、题目描述 题目: 小虚竹为了给粉丝送福利,决定在参与学习打卡活动的粉丝中抽一位幸运粉丝,送份小礼物。为了公...
    99+
    2024-04-02
  • PHP实现抽奖系统的示例代码
    目录一、随机抽奖二、概率抽奖三、内定抽奖一、随机抽奖 随机抽奖当然是最公平的抽奖,就是当用户抽奖时随机返回抽奖结果 这种结果完全随机,不受人为控制,中奖全凭借运气 先定义奖池拥有的奖...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作