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日

相关文章

  • vue3 Composition API使用示例教程

    让我来分享一下关于“Vue3 Composition API使用示例教程”的完整攻略。 什么是Composition API? Composition API 是 Vue.js 3.x 中一种全新的 API 形式,它允许我们通过一个新的代码组织方式来组织我们的 Vue 组件。使用 Composition API,我们可以通过功能切分的思路更好地组织代码,并更…

    Vue 2023年5月28日
    00
  • Vue 计数器的实现

    下面是“Vue 计数器的实现”攻略。 什么是 Vue 计数器 Vue 计数器是一个非常简单的 Web 应用程序,它包含一个数字和两个按钮:加和减。点击按钮可以增加或减少数字。Vue 计数器通常用作 Vue 初学者的教学示例,因为它涉及到了 Vue 组件之间的交互和状态管理,但对于有经验的开发者来说,实现它并不复杂。 Vue 计数器的实现步骤 步骤 1:创建一…

    Vue 2023年5月29日
    00
  • vue中的插槽详解

    Vue中的插槽详解 什么是插槽? 插槽是Vue的一个高级特性。插槽可以使组件更加灵活和复用。 在Vue中,可以使用插槽来让组件具有更灵活的内容分发能力,也就是可以将一些内容插入到组件内部的指定位置。 通俗来说,如果一个组件有一个或多个插槽(slot),那么这个组件就可以让开发者在使用它的时候,将一些内容插入到组件内部指定的位置上。 插槽的类型 匿名插槽(De…

    Vue 2023年5月29日
    00
  • mpvue 单文件页面配置详解

    我来为你详细讲解“mpvue 单文件页面配置详解”的完整攻略。 mpvue 单文件页面配置详解 1. 简介 mpvue 是一款使用 Vue.js 开发小程序的前端框架,可在小程序原生 API 基础上,结合 Vue.js 语法规范进行开发。 在 mpvue 中,我们可以通过单文件组件(SFC)的形式,实现对小程序页面的开发和配置。通过配置 SFC 的 temp…

    Vue 2023年5月27日
    00
  • 使用vue插件axios传数据的Content-Type及格式问题详解

    使用Vue插件axios传送数据时,我们需要了解有关Content-Type的知识。Content-Type是HTTP头部中的一个域,表示发送数据的媒体类型和字符集。在传送数据时,我们需要根据接受方所期望的Content-Type的类型,构造对应的数据格式来传输数据。 简单来说,如果请求的Content-Type为‘application/json’, 则P…

    Vue 2023年5月28日
    00
  • 使用Vue.set()方法实现响应式修改数组数据步骤

    使用Vue.set()方法实现响应式修改数组数据,可以确保视图与数据的同步更新。下面是实现步骤: 引入Vue 在使用Vue.set()方法之前,需要先在项目中引入Vue.js。可以通过script标签引入,也可以通过webpack等构建工具引入。 定义数据 假设要在Vue组件中使用一个数组todos: data() { return { todos: [ {…

    Vue 2023年5月28日
    00
  • Vue动态组件表格的实现代码

    下面是Vue动态组件表格的实现代码的详细攻略。 1. 目标 在网页中展示一个动态组件表格,可根据需要动态添加或删除表格的行和列。 2. 实现 2.1. HTML模板 首先,我们需要在HTML模板中定义一些代码以用于展示动态组件表格: <div id="app"> <button @click="addRow&q…

    Vue 2023年5月28日
    00
  • vue.js学习之UI组件开发教程

    下面是“vue.js学习之UI组件开发教程”的完整攻略和两个示例说明。 一、前言 Vue.js 是目前比较流行的前端框架之一,它提供了一套完整的响应式系统,可以极大地提高开发效率并优化用户体验。而在实际开发中,UI组件是不可避免的,因此学会使用 Vue.js 开发 UI 组件是非常重要的一环。 二、简介 Vue.js 的官方文档提供了非常详细的组件开发指南,…

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