vue3实现抽奖模板设置

本文实例为大家分享了vue3实现抽奖模板设置的具体方法,供大家参考,具体内容如下

效果图

代码

<template>
  <div>
    <h4>抽奖模板设置</h4>

    <div class="container">
      <ul class="ul-box">
        <li
          v-for="(item,index) in list"
          :key="item.id"
          @click.stop="handleClickItem(item,index)"
        >
          {{item.id}}-{{item.title}}
        </li>
      </ul>

      <div
        class="pop-box"
        v-show="visible"
      >
        <div
          class="popup"
          :style="{left:clickIndexList[0]+'px',top:clickIndexList[1]+'px'}"
        >
          <span><em></em></span>
          <div>
            <p
              class="p-title"
              v-for="(item) in selectList"
              :key="item.id"
              @click.stop="handleChoose(item)"
            >{{item.title}}</p>
          </div>
        </div>
      </div>
    </div>

  </div>

</template>
<script lang="ts">
import { defineComponent, reactive, toRefs, onMounted } from 'vue';
const WIDTH = 100;
export default defineComponent({
  name: 'test',
  components: {},
  setup() {
    const state = reactive({
      list: [
        { id: 1 },
        { id: 2 },
        { id: 3 },
        { id: 4 },
        { id: 5, title: '抽奖' },
        { id: 6 },
        { id: 7 },
        { id: 8 },
        { id: 9 },
      ],
      selectList: [
        { id: 1, title: '谢谢参与' },
        { id: 2, title: 'iphone13' },
        { id: 3, title: '领克06' },
        { id: 4, title: '华为p40' },
      ],
      visible: false,
      clickIndexList: [],
      clickIndex: 0,
    });

    const xyList = [
      [0, 0],
      [WIDTH, 0],
      [WIDTH * 2, 0],
      [0, WIDTH],
      [WIDTH, WIDTH],
      [WIDTH * 2, WIDTH],
      [0, WIDTH * 2],
      [WIDTH, WIDTH * 2],
      [WIDTH * 2, WIDTH * 2],
    ];

    const hide = () => {
      state.visible = false;
    };

    onMounted(() => {
      document.addEventListener('click', hide);
    });

    const handleClickItem = (item, index) => {
      if (index === 4) {
        return;
      }
      state.clickIndexList = xyList[index];
      state.clickIndex = index;
      state.visible = true;
    };

    const handleChoose = (item) => {
      state.list[state.clickIndex].title = item.title;
      hide();
    };

    return {
      handleClickItem,
      hide,
      handleChoose,
      ...toRefs(state),
    };
  },
});
</script>
<style lang="less" scoped>
.container {
  position: relative;

  .ul-box {
    display: flex;
    flex-wrap: wrap;
    width: 300px;
    li {
      width: 100px;
      height: 100px;
      background: pink;
      border: 1px solid #fff;
      display: flex;
      justify-content: center;
      align-items: center;
      cursor: pointer;
    }
  }
  .p-title {
    margin: 0;
    min-width: 150px;
    font-size: 14px;
    line-height: 1.4;
    padding: 10px 20px;
    cursor: pointer;
  }
  .p-title:hover {
    background: #e6ebf5;
  }

  .pop-box .popup {
    width: 200px;
    background: #fff;
    color: #333;
    border-radius: 4px;
    position: absolute;
    top: 30px;
    left: 30px;
    border: 1px solid #e6ebf5;
    margin-left: -50px;
    margin-top: 60px;
    z-index: 9999;
    animation: left 1s;
  }
  .pop-box .popup span {
    display: block;
    width: 0;
    height: 0;
    border-width: 0 10px 10px;
    border-style: solid;
    border-color: transparent transparent #e6ebf5;
    position: absolute;
    top: -10px;
    left: 50%; /* 三角形居中显示 */
    margin-left: -10px; /* 三角形居中显示 */
  }
  .pop-box .popup em {
    display: block;
    width: 0;
    height: 0;
    border-width: 0 10px 10px;
    border-style: solid;
    border-color: transparent transparent #fff;
    position: absolute;
    top: 1px;
    left: -10px;
  }
}
</style>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 基于VUE实现的九宫格抽奖功能

    先给大家展示下效果图: HTML代码: <template> <div class="luckDraw"> <title-bar :title="title"></title-bar> <div class="container"> <div class="turntable-wrapper"> <div class="luck-wrapp

  • Vue组件实现数字滚动抽奖效果

    本文实例为大家分享了Vue组件实现数字滚动抽奖效果的具体代码,供大家参考,具体内容如下 可调整数字滚动速度,可指定开奖延迟时间,可指定开奖数字,按个人需求自行改动(录了个效果供参考,临时找的录屏,表介意)不一一精简了 组件代码 <template>     <div class="info-span04" style="color: #333333;">         中奖号码:         <div style="ve

  • vue实现简单转盘抽奖功能

    本文实例为大家分享了vue实现简单转盘抽奖的具体代码,供大家参考,具体内容如下 样式请大家忽略(自己调),主要看JS代码实现,点击按钮后调用start方法,判断是否在转动状态,如果没转动则调用go方法,go方法主要封装了一次性定时器,是个递归函数,调用go函数后即可实现抽奖转盘的效果了,详细代码如下: 注释清晰哦 <template>   <div class="home">     <button @click="start">

  • vue组件实现移动端九宫格转盘抽奖

    本文实例为大家分享了vue组件实现移动端九宫格转盘抽奖的具体代码,供大家参考,具体内容如下 vue-lucky-draw 移动端九宫格转盘抽奖vue组件,中奖的奖品数据由接口决定. 效果图 抽奖 因为中奖的结果是后台返回的,所以要考虑转盘的最终停下来的位置必须是在对应后台返回结果的奖品的位置,也就是要模拟出这个中奖的过程(所以所谓的抽奖都是骗人的,嘿嘿).先要写出移动的背景框对应的各个位置的css,然后动态切换class来使其呈现出转动效果.明白了过程就好写了. 中间的按钮用的是css3的ani

  • vue实现大转盘抽奖功能

    本文实例为大家分享了vue实现大转盘抽奖的具体代码,供大家参考,具体内容如下 效果图如下 中奖提示 代码如下 <template>   <div class="dial" v-wechat-title="$route.meta.title">     <div class="times">抽奖次数{{LuckyClick}}</div>     <!-- 转盘包裹 -->     <

  • vue实现手机号码抽奖上下滚动动画示例

    本文介绍了vue实现手机号码抽奖上下滚动动画示例,分享给大家.具体如下: <!DOCTYPE> <html> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <title>Document</title> <meta name="viewport" content=

  • VUE实现大转盘抽奖

    UI 老规矩,先看下静态UI,以便于有个图像概念 初始参考各值参考图 方案分析-参数配置 核心思路: 将指针和中奖区域划分两部分,目前常规的效果,控制中奖区域旋转,然后停在指针处,当然控制指针也可以,一套思路,dom结构也比较简单,唯一算是复杂点的就是中奖区域,但是如果你足够懒,像我一样,你可以传递一张图也可以,完全依赖远端数据: 关于旋转位置 每个移动位置应均分,360/个数 === 每个奖品所占据的位置,以本文为例8个奖品位置,每个区域应为45deg,每个指针中心位置应为±22.5deg(±

  • vue简单实现转盘抽奖

    本文实例为大家分享了vue简单实现转盘抽奖的具体代码,供大家参考,具体内容如下 1.0 思路整理 转盘抽奖很常见,之前也没写过,现在有空来写写,分析如下: 1.1 转盘旋转 ----- 可以用 transform 的 rotate 来解决 1.2 旋转动画 ----- transition 过渡来处理 1.3 停留目标位置及中奖提示 ? ------ 通过控制旋转角度控制停留位置,中奖提示,考虑添加回调 1.1 开始行动 上面的思考,我们知道了大概要实现的步骤,首先我们搞张图片 这个圆盘有 10

  • vue实现宫格轮转抽奖

    vue实现宫格轮转抽奖(类似穿越火线的xx轮回),供大家参考,具体内容如下 不做过多的解说,直接上代码啦.关键的代码都写了注释,很容易理解.直接复制即可使用! 另外css部分依赖 node-sass.sass-loader,没有安装的安装一下,已有的小伙伴直接跳过~~ "node-sass": "^4.12.0", "sass-loader": "^8.0.2", <template> <div class=

  • Vue.js实现大转盘抽奖总结及实现思路

    大家好!先上图看看本次案例的整体效果. 实现思路: Vue component实现大转盘组件,可以嵌套到任意要使用的页面. css3 transform控制大转盘抽奖过程的动画效果. 抽奖组件内使用钩子函数watch监听抽奖结果的返回情况播放大转盘动画并给用户弹出中奖提示. 中奖结果弹窗,为抽奖组件服务. 实现步骤如下: 构建api奖品配置信息和抽奖接口,vuex全局存放奖品配置和中奖结果数据信息. api: export default { getPrizeList () { let priz

随机推荐