@tanzhenxing/zx-scratchcard
Version:
基于canvas的刮刮卡组件,支持自定义刮开层颜色、图片、刮开比例等配置。
207 lines (163 loc) • 4.58 kB
Markdown
# zx-scratchcard 刮刮卡
基于canvas的刮刮卡组件,支持自定义刮开层颜色、图片、刮开比例等配置。
## 平台兼容性
| H5 | 微信小程序 | 支付宝小程序 | 百度小程序 | 头条小程序 | QQ小程序 | App |
| --- | ---------- | ------------ | ---------- | ---------- | -------- | --- |
| √ | √ | √ | √ | √ | √ | √ |
## 基础用法
```vue
<template>
<zx-scratchcard content="恭喜中奖1000元" @open="handleOpen" />
</template>
<script setup>
const handleOpen = () => {
console.log('刮开了!')
}
</script>
```
## 异步数据
```vue
<template>
<zx-scratchcard :content="prizeContent" @open="handleOpen" />
</template>
<script setup>
import { ref, onMounted } from 'vue'
const prizeContent = ref('')
onMounted(() => {
setTimeout(() => {
prizeContent.value = '恭喜获得iPhone 15'
}, 2000)
})
const handleOpen = () => {
console.log('刮开了!')
}
</script>
```
## 自定义颜色
```vue
<template>
<zx-scratchcard
cover-color="#F9CC9D"
background-color="#C3D08B"
content="<em>1000</em><strong>元</strong>"
@open="handleOpen"
/>
</template>
<script setup>
const handleOpen = () => {
console.log('刮开了!')
}
</script>
```
## 背景图片
```vue
<template>
<zx-scratchcard
content="恭喜中奖1000万"
:cover-img="coverImage"
@open="handleOpen"
/>
</template>
<script setup>
import { ref } from 'vue'
const coverImage = ref('https://example.com/cover.jpg')
const handleOpen = () => {
console.log('刮开了!')
}
</script>
```
## 自定义尺寸和样式
```vue
<template>
<zx-scratchcard
width="400px"
height="200px"
font-size="24px"
cover-color="#FF6B6B"
background-color="#4ECDC4"
cover-text="刮开有惊喜"
cover-text-color="#FFFFFF"
cover-text-size="18px"
content="恭喜获得特等奖"
@open="handleOpen"
/>
</template>
<script setup>
const handleOpen = () => {
console.log('刮开了!')
}
</script>
```
## 设置刮开比例
```vue
<template>
<zx-scratchcard
content="恭喜中奖1000万"
:ratio="0.3"
@open="handleOpen"
/>
</template>
<script setup>
const handleOpen = () => {
console.log('只需要刮开30%就触发事件!')
}
</script>
```
## 重置刮刮卡
```vue
<template>
<view>
<zx-scratchcard
ref="scratchcardRef"
content="恭喜中奖1000元"
@open="handleOpen"
/>
<button @click="resetCard">重置</button>
</view>
</template>
<script setup>
import { ref } from 'vue'
const scratchcardRef = ref()
const handleOpen = () => {
console.log('刮开了!')
}
const resetCard = () => {
scratchcardRef.value?.reset()
}
</script>
```
## Props
| 字段 | 说明 | 类型 | 默认值 |
| --- | --- | --- | --- |
| content | 奖项信息,支持html | String | '' |
| height | 卡片高度 | String | '50px' |
| width | 卡片宽度 | String | '300px' |
| cover-color | 刮开层颜色 | String | '#C5C5C5' |
| cover-img | 刮开层图片(设置此项后cover-color失效) | String | '' |
| font-size | 中奖信息字号 | String | '20px' |
| background-color | 内容层背景颜色 | String | '#FFFFFF' |
| ratio | 触发事件的刮开比例(0-1之间) | Number | 0.8 |
| cover-text | 刮刮层文字 | String | '刮一刮' |
| cover-text-color | 刮刮层文字颜色 | String | '#FFFFFF' |
| cover-text-size | 刮刮层文字大小 | String | '16px' |
## Events
| 字段 | 说明 | 类型 |
| --- | --- | --- |
| open | 刮开后回调函数 | Function |
## Methods
| 方法名 | 说明 | 参数 |
| --- | --- | --- |
| reset | 重置刮刮卡 | - |
## 注意事项
1. 组件基于canvas实现,在不同平台上可能存在性能差异
2. 图片资源建议使用网络地址或base64格式
3. 在小程序中使用时,需要确保canvas-id的唯一性
4. 刮开比例ratio建议设置在0.3-0.8之间,过小可能导致误触发,过大可能影响用户体验
5. 组件会自动适配高清屏幕,无需额外处理
## 常见问题
### Q: 为什么在某些情况下canvas不显示?
A: 请确保组件已经正确挂载,可以尝试在nextTick中初始化或添加适当的延时。
### Q: 如何实现更复杂的刮开效果?
A: 可以通过修改scratch方法中的绘制逻辑来实现不同的刮开效果,比如改变刮除半径、形状等。
### Q: 在小程序中性能如何优化?
A: 建议合理设置刮开比例,避免过于频繁的重绘操作,必要时可以添加节流处理。