vue实现简单转盘抽奖功能

下面我来详细讲解如何用vue实现简单转盘抽奖功能的完整攻略:

1. 搭建项目

首先我们需要使用vue-cli来搭建一个vue项目,输入以下命令来创建一个新的vue项目:

vue create lottery

安装依赖,进入项目目录并启动本地服务器:

cd lottery
npm install
npm run serve

2. 编写转盘组件

接下来我们需要编写转盘组件,组件分为圆盘和奖品两个子组件,在子组件中分别绘制相应的内容:

<!-- circle component -->
<template>
  <div class="circle" :style="circleStyle">
    <div class="pointer" :style="pointerStyle"></div>
    <slot></slot>
  </div>
</template>

<script>
export default {
  name: "Circle",
  props: {
    size: {
      type: Number,
      default: 300
    },
    border: {
      type: String,
      default: "10px solid #ccc"
    },
    color: {
      type: String,
      default: "#f60"
    }
  },
  computed: {
    circleStyle() {
      return {
        width: `${this.size}px`,
        height: `${this.size}px`,
        border: this.border,
        borderRadius: "50%",
        position: "relative"
      };
    },
    pointerStyle() {
      return {
        width: "0",
        height: "0",
        border: "15px solid transparent",
        borderTop: `15px solid ${this.color}`,
        position: "absolute",
        left: "50%",
        bottom: "-3px",
        transform: "translateX(-50%) rotate(-22.5deg)"
      };
    }
  }
};
</script>

<style scoped>
.circle {
  display: flex;
  justify-content: center;
  align-items: center;
  background-color: #fff;
}

.pointer {
  z-index: 1;
}
</style>
<!-- prize component -->
<template>
  <div class="prize" :style="prizeStyle">
    <div class="item" v-for="(item, index) in prizeList" :style="itemStyle(index)" :key="index">
      {{ item }}
    </div>
  </div>
</template>

<script>
export default {
  name: "Prize",
  props: {
    prizeList: {
      type: Array,
      default: () => []
    },
    color: {
      type: String,
      default: "#f60"
    }
  },
  computed: {
    prizeLength() {
      return this.prizeList.length;
    },
    prizeStyle() {
      return {
        width: "100%",
        height: "100%",
        position: "relative"
      };
    }
  },
  methods: {
    itemStyle(index) {
      const deg = (360 / this.prizeLength) * index;
      return {
        width: "100%",
        height: `${100 / this.prizeLength}%`,
        lineHeight: `${100 / this.prizeLength}%`,
        textAlign: "center",
        transformOrigin: "50% 100%",
        transform: `rotate(${deg}deg) skewY(-22.5deg)`,
        boxSizing: "border-box",
        position: "absolute",
        left: 0,
        top: 0,
        borderTop: `5px solid ${this.color}`
      };
    }
  }
};
</script>

<style scoped>
.prize {
  display: -webkit-box;
  display: flex;
  -webkit-box-pack: center;
          justify-content: center;
  -webkit-box-align: center;
          align-items: center;
}

.item {
  font-size: 18px;
  box-sizing: border-box;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  border-bottom: 5px solid #fff;
  transition: transform 3s cubic-bezier(0.27, 0.47, 0.17, 0.84);
}

.item.active {
  transform: rotate(360deg) skewY(-22.5deg);
  font-weight: bold;
}
</style>

我们的转盘组件就编写完成了,可以通过在父组件中使用<circle><prize>标签来调用两个子组件。

3. 实现抽奖功能

在父组件中,我们需要先定义一个奖品列表,然后将奖品列表传递给<prize>组件,再定义一个变量来表示当前选中的奖品下标,然后在页面中绑定一个“抽奖”按钮,当点击“抽奖”按钮时,随机生成一个奖品下标,再将这个下标传递给<circle>组件,通过修改<prize>组件中的样式来实现转盘停在指定的奖品上。

<template>
  <div>
    <circle :size="circleSize" :color="color" ref="circle">
      <prize :prizeList="prizeList" :color="color" ref="prize"></prize>
    </circle>
    <button @click="handleClick">抽 奖</button>
  </div>
</template>

<script>
import Circle from "./components/Circle.vue";
import Prize from "./components/Prize.vue";

export default {
  name: "Lottery",
  components: {
    Circle,
    Prize
  },
  data() {
    return {
      circleSize: 300,
      color: "#f60",
      prizeList: ["奖品 1", "奖品 2", "奖品 3", "奖品 4", "奖品 5"],
      activeIndex: -1
    };
  },
  methods: {
    handleClick() {
      // 生成一个随机的奖品下标
      const index = Math.floor(Math.random() * this.prizeList.length);
      this.activeIndex = index;
      this.$refs.prize.$el.querySelectorAll(".item").forEach((item, i) => {
        if (i === index) {
          item.classList.add("active");
        } else {
          item.classList.remove("active");
        }
      });
      this.$refs.circle.$el.querySelector(".pointer").style.transform = `translateX(-50%) rotate(${360 / this.prizeList.length * index + 22.5}deg)`;
    }
  }
};
</script>

<style>
button {
  margin-top: 20px;
  padding: 10px 20px;
  font-size: 16px;
  background-color: #f60;
  color: #fff;
  border: none;
  border-radius: 4px;
  cursor: pointer;
}
</style>

通过上述代码,我们实现了一个简单的转盘抽奖功能。当点击“抽奖”按钮时,转盘会随机停留在一个奖品上,同时页面中也会显示出选中的奖品。我们也可以在<circle>组件中加入多个旋转效果的动画,以增强页面的视觉效果。

示例说明

示例1

这里提供了一个基于vue开发的简单转盘抽奖功能的在线演示,你可以访问该网页体验转盘抽奖的功能。

示例2

如果你不希望使用默认的样式或者奖品列表,可以自行修改代码中的相关变量,例如,我们可以将抽奖按钮修改为一个图标,代码如下:

<button @click="handleClick">
  <svg width="20" height="20" viewBox="0 0 20 20">
    <path fill="#fff" d="M15.62 7.38a6 6 0 1 1-8.48 0A.999.999 0 1 1 7.38 4.38a8 8 0 1 0 5.66 5.66c.12-.12.21-.26.31-.39l2.37 2.37a1 1 0 0 1-1.41 1.41L14.21 9C14.37 8.88 14.49 8.71 14.62 8.54a.996.996 0 0 1 1.41 0c.37.36.37.92 0 1.28l-1.41 1.41a.998.998 0 1 1-1.41-1.41l.35-.35-2.12-2.12a2.986 2.986 0 0 1-.05 4.23 2.986 2.986 0 0 1-4.23 0 3 3 0 0 1 0-4.24c.02-.02.05-.04.07-.06L3.3 5.5c-.35.68-.54 1.44-.54 2.23a6 6 0 0 0 10.86 3.38 6.03 6.03 0 0 0-1.5-4z"></path>
  </svg>
  &nbsp;开始抽奖
</button>

你也可以自行添加其他的样式和行为来满足自己的需求。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue实现简单转盘抽奖功能 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 超简单的Vue.js环境搭建教程

    超简单的Vue.js环境搭建教程 1. 确认开发环境 在开始之前,需要确认本地电脑是否已经安装了 Node.js,如果没有,请下载并安装它。安装完成后,使用命令 node -v和npm -v 确认是否安装成功。 2. 安装Vue的脚手架 在Vue中我们可以使用脚手架工具vue-cli快速构建项目,首先需要使用npm安装vue-cli。在命令行中输入下面的命令…

    Vue 2023年5月28日
    00
  • Vue验证码60秒倒计时功能简单实例代码

    那么我们来逐步讲解如何使用Vue实现验证码60秒倒计时功能的步骤和代码实现。 步骤一:安装Vue 首先,需要安装Vue,可通过以下命令安装: npm install vue 步骤二:创建Vue实例 在HTML页面中引入Vue库后,需创建Vue实例,用于管理页面数据和操作行为: const vueApp = new Vue({ el: ‘#app’, data…

    Vue 2023年5月29日
    00
  • axios封装与传参示例详解

    针对题目“axios封装与传参示例详解”,我将分以下几个部分进行详细讲解: 什么是axios及其用途 axios的基本用法 axios的封装原理及方法 axios传参的详解及示例 1. 什么是axios及其用途 axios是一个基于Promise的HTTP请求客户端,可以用于浏览器和Node.js。它具有以下优点: 可同时在浏览器和Node.js中使用。 能…

    Vue 2023年5月28日
    00
  • vue使用moment如何将时间戳转为标准日期时间格式

    将时间戳转为标准日期时间格式是我们在日常开发中常见的需求之一。Vue.js 是一款流行的 JavaScript 框架,它提供了丰富的工具和生命周期函数,方便我们操作数据和视图。在 Vue.js 中使用 moment.js 来操作时间戳(Timestamp)也是十分常见的方法。 以下是将时间戳转为标准日期时间格式的 Vue.js 和 Moment.js 教程。…

    Vue 2023年5月29日
    00
  • vue 之 css module的使用方法

    我来给你详细讲解一下“vue之CSS Module的使用方法”的完整攻略。 1. 什么是CSS Module CSS Module是CSS的一种模块化方案,与其它CSS的模块化方案如Sass、Less等不同的是,它是由JavaScript模块化方案驱动的,而不是依赖于编译器或预处理器。CSS Module可以帮助我们解决CSS全局污染的问题,让我们的CSS样…

    Vue 2023年5月28日
    00
  • Vue自定义Form组件实现方法介绍

    下面详细讲解“Vue自定义Form组件实现方法介绍”的完整攻略。 什么是自定义Form组件? 自定义Form组件是指,开发者可以使用Vue框架中提供的组件相关API自己封装一个表单组件,以便于实现业务需求。这种自定义Form组件可以根据不同的业务需求来进行设计,而且重用率非常高,可以减少重复的代码。 实现方法 实现Vue自定义Form组件的方法如下: 1.编…

    Vue 2023年5月27日
    00
  • 通过vue-cli3构建一个SSR应用程序的方法

    构建一个SSR应用程序的过程相比较普通的SPA应用程序增加了许多复杂操作,但是通过Vue-cli3进行构建,可以简化这个过程。以下是构建一个SSR应用程序的详细步骤: 安装Vue-cli3 如果尚未安装Vue-cli3,请使用以下命令安装: npm install -g @vue/cli 创建一个Vue项目 vue create my-ssr-app cd …

    Vue 2023年5月27日
    00
  • vue项目中存储与使用后端传递过来的token

    在Vue项目中使用后端传递过来的token需要进行以下几个步骤: 1. 发送登录请求,获取token 在登录页面,用户输入用户名和密码后,向后端发送登录请求。如果用户名和密码验证成功,后端返回一个token给前端。 axios.post(‘/login’, { username: ‘username’, password: ‘password’ }) .th…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部