🎉 在 Vue 3 中实现刮刮乐抽奖
当项目中需要做一些活动互动页时,需要实现刮刮乐,请看如下效果:
这里感谢github用户Choicc分享的组件,具体可点击传送门查看
1. 引入组件
将/src/components下ScratchCard.vue复制到自己的项目中,
在需要使用组件的页面中引入
<script setup>
import StratchCard from "./components/StratchCard.vue";
const scratchStart = ()=>{
console.log('scratchStart')
}
const scratchEnd = ()=>{
console.log('scratchEnd')
}
const scratchAll = ()=>{
console.log('scratchAll')
}
</script>
<template>
<StratchCard
maskColor="skyblue"
fillStyle="red"
font="30px 微软雅黑"
text="刮一刮文字"
:radius="5"
:scratchRadius="20"
:scratchPercent="80"
@scratchStart="scratchStart"
@scratchEnd="scratchEnd"
@scratchAll="scratchAll"
>
<!-- 自定义奖品内容插槽 -->
<div class="prize">我的奖品</div>
</StratchCard>
</template>
<style scoped>
* {
margin: 0;
padding: 0;
}
.prize {
width: 80vw;
height: 45vw;
display: flex;
align-items: center;
justify-content: center;
background: lightcoral;
}
</style>
⬇️ 对应的参数说明
参数名 | 说明 | 类型 | 默认值 | 备注 |
---|---|---|---|---|
maskColor | 刮奖图层背景颜色 | String | '#cccccc' | 当 imageUrl 非空时会被覆盖 |
text | 刮奖图层文字 | String | '刮一刮' | 当 imageUrl 非空时会被覆盖 |
fillStyle | 刮奖图层文字颜色 | String | '#000000' | - |
font | 刮奖图层字体 | String | '18px Arial' | - |
imageUrl | 刮奖图层使用图片 | String | - | 会覆盖掉刮奖图层文字 |
radius | 刮奖图层圆角 | Number | 0 | - |
scratchRadius | 刮奖半径 | Number | 10 | 刮奖时每次可刮的区域半径 |
scratchPercent | 刮开占比 | Number | 80 | 刮开面积达到该百分比后自动移除刮奖图层 |
⬇️ events事件如下
事件名 | 说明 | 备注 |
---|---|---|
scratchStart | 开始刮卡时 | 手指触控或鼠标按下时触发 |
scratchEnd | 刮卡结束时 | 手指离开或鼠标抬起时触发 |
scratchAll | 刮光全部时 | 刮刮卡被刮完时触发 |
⬇️ methods
方法名 | 说明 | 备注 |
---|---|---|
reset | 重置刮刮乐 | stratchCardRef.value?.reset() |
我在基础上加了两个参数disabled和defaultRemove
参数名 | 说明 | 类型 | 默认值 | 备注 |
---|---|---|---|---|
disabled | 禁用刮奖 | Boolean | false | – |
defaultRemove | 是否显示图层 | Boolean | false | – |
像我上面实现的效果来说,默认是没有蒙层的,需要点击开始洗牌后才会出现蒙层,这个时候需要加上defaultRemove来控制蒙层的显示隐藏,
当开始刮其中一个刮刮乐不能再刮其他的,或者说要刮完某一个才能继续下一个,这个时候需要使用disabled来禁用插件