Skip to content

ScratchCard 刮刮卡 ​

新粗野主义风格的刮刮卡组件,使用 HTML5 Canvas 覆盖在底稿内容上方,绘制斑驳条纹层。用户用鼠标/手指擦除一定面积后,Canvas 淡出并销毁,完全露出插槽中的 Vue 内容。

预览 ​

Preview

🎉 恭喜中奖!

自定义底色

大笔刷 (brushRadius=40)

大笔刷

渐隐时长 (fadeDuration=1000ms)

慢速渐隐

手动揭示 (revealAll)

一键揭示

安装 ​

pnpm dlx brutx-vue@latest add scratch-card

用法 ​

vue
<script setup>
import { ScratchCard } from 'brutx-ui-vue'
</script>

<template>
    <ScratchCard class="w-full max-w-sm h-48">
        <div class="flex items-center justify-center h-full bg-brutal-accent">
            <p class="text-2xl font-black">🎉 恭喜中奖!</p>
        </div>
    </ScratchCard>
</template>

自定义覆盖层 ​

默认绘制 Neobrutalist 双色条纹图案(--brutal-primary + --brutal-secondary)。可通过 overlayColor prop 设置纯色覆盖层:

vue
<ScratchCard overlay-color="#FFE66D">
    <p>底稿内容</p>
</ScratchCard>

程序化控制 ​

vue
<script setup>
import { ref } from 'vue'
import { ScratchCard } from 'brutx-ui-vue'

const scratchCardRef = ref()
</script>

<template>
    <ScratchCard ref="scratchCardRef" />
    <button @click="scratchCardRef?.revealAll()">全部揭开</button>
</template>

API 参考 ​

ScratchCard — 属性
名称类型默认值说明
percentage
number | undefined
50
达到此已刮开面积百分比时自动完成揭示;默认阈值为 50。
详情

声明类型

number | undefined

默认值详情

解析值
50

来源

ScratchCard.vue:21

packages/ui/src/components/scratch-card/ScratchCard.vue

brushRadius
number | undefined
20
设置指针刮除笔刷的半径,单位为像素。
详情

声明类型

number | undefined

默认值详情

解析值
20

来源

ScratchCard.vue:22

packages/ui/src/components/scratch-card/ScratchCard.vue

overlayColor
string | undefined
undefined
设置 Canvas 覆盖层的纯色底色;未设置时使用主题双色斜纹。
详情

声明类型

string | undefined

默认值详情

解析值
undefined

来源

ScratchCard.vue:23

packages/ui/src/components/scratch-card/ScratchCard.vue

fadeDuration
number | undefined
300
达到完成阈值后覆盖层淡出的时长,单位为毫秒;减少动态效果偏好会跳过动画。
详情

声明类型

number | undefined

默认值详情

解析值
300

来源

ScratchCard.vue:24

packages/ui/src/components/scratch-card/ScratchCard.vue

class
string | undefined
undefined
追加到刮刮卡根容器的 CSS 类。
详情

声明类型

string | undefined

默认值详情

解析值
undefined

来源

ScratchCard.vue:25

packages/ui/src/components/scratch-card/ScratchCard.vue

ScratchCard — 事件
名称签名或类型说明
@progress
[percent: number]
刮除进度变化时发出当前已揭示面积百分比;事件经过节流。
详情

声明类型

[percent: number]

来源

ScratchCard.vue

packages/ui/src/components/scratch-card/ScratchCard.vue

@completed
[]
达到自动揭示阈值或调用 revealAll 后,覆盖层完成移除时发出。
详情

声明类型

[]

来源

ScratchCard.vue

packages/ui/src/components/scratch-card/ScratchCard.vue

ScratchCard — 插槽
名称签名或类型说明
#default
{}
被 Canvas 覆盖层遮住并逐步揭示的刮刮卡底层内容。
详情

声明类型

{}

来源

ScratchCard.vue

packages/ui/src/components/scratch-card/ScratchCard.vue

ScratchCard — 暴露成员
名称签名或类型说明
isRevealed
boolean
组件实例上暴露的揭示状态;Vue 会自动解包内部 Ref,可通过 scratchCardRef.value.isRevealed 读取布尔值。
详情

声明类型

boolean

字面量

  • false
  • true

来源

ScratchCard.vue:108

packages/ui/src/components/scratch-card/ScratchCard.vue

revealAll
() => void
立即揭示全部内容并开始移除覆盖层。
详情

声明类型

() => void

来源

ScratchCard.vue:109

packages/ui/src/components/scratch-card/ScratchCard.vue

可访问性 ​

  • 键盘操作:组件设置了 tabindex="0",按 Enter 或 Space 键可自动揭开全部内容
  • ARIA 属性:组件设置了 role="region",aria-label 默认使用本地化文本 scratchCard.ariaLabel(默认为"刮刮卡")
  • 动效降级:当用户偏好 prefers-reduced-motion: reduce 时,淡出动画被跳过,Canvas 立即移除
  • 交互提示:Canvas 覆盖层使用 cursor-crosshair 光标提示可交互

蛮力铸就。