2023-07-23.6.54.58.mov
scratchable is a scratch card renderer using HTML Canvas. It renders a scratchable canvas element on your content, and provides percentage of scratched pixels.
First of all, you should pass container to Scratchable, which will be overlapped by a scratchable canvas.
const container = document.getElementById("container");
const scratchable = new Scratchable({
container,
/* ... */
});<div id="container">/* CONTENT */</div>Or in React,
const container = ref.current;
const scratchable = new Scratchable({
container,
/* ... */
});<div ref={ref}>{/* CONTENT */}</div>And then it will render the canvas on your /* CONTENT */, when you call Scratchable.render(). It returns Promise<void>.
await scratchable.render();And you can also remove the rendered canvas.
scratchable.destroy();This is the basic. Now let's see another required option background.
You should pass background to Scratchable, which is the color of the rendered canvas.
It has three kinds of type, single, linear-gradient and image.
new Scratchable({
/* ... */
background: {
type: "single",
color: "#FA58D0",
},
});2023-07-23.9.15.39.mov
new Scratchable({
/* ... */
background: {
type: "linear-gradient",
gradients: [
{ offset: 0, color: "#FA58D0" },
{ offset: 0.5, color: "#DA81F5" },
{ offset: 1, color: "#BE81F7" },
],
},
});2023-07-23.9.16.48.mov
new Scratchable({
/* ... */
background: {
type: "image",
url: "karina.jpeg",
},
});2023-07-23.10.16.20.mov
You can set radius of a circle which is rendered when you scratch the canvas. Let's compare between 20 and 40.
new Scratchable({
/* ... */
radius: 20,
});2023-07-23.9.20.28.mov
new Scratchable({
/* ... */
radius: 40,
});2023-07-23.9.21.00.mov
You can register a function which will be called when scratch event fires. The event fires when an user is scratching the canvas.
const handler = (e: ScratchableEvent) => {
/* ... */
};
scratchable.addEventListener("scratch", handler);
scratchable.removeEventListener("scratch", handler);You can get percentage(0 ~ 1) from ScratchEvent above. The percentage is ratio of scratched area to all scratchable area.
const handler = (e: ScratchableEvent) => {
if (e.percentage > 0.5) {
scratchable.destroy();
}
};
scratchable.addEventListener("scratch", handler);