Vue-peel: Peeling animation Effect for Vue.js
Vue peel is a Vue library to create realistic peeling effects .
Documentation
Checkout the documentation here.
Getting Started
Installation
npm install vue-peel
Usage
<template>
<Peel
drag
:peel-position="{ x: 150, y: 150 }"
>
<template #top>
<div class="layer">Top</div>
</template>
<template #back>
<div class="layer">Back</div>
</template>
<template #bottom>
<div class="layer">Bottom</div>
</template>
</Peel>
</template>
<script setup>
import Peel from 'vue-peel'
import 'vue-peel/style.css'
</script>
Props
options
The options to pass to the underlying peel.js constructor as listed here.
peelPosition
{ x: number, y: number } | undefined
The position of the peel effect. This point is the position of the corner that is being peeled back.
corner
{ x: number, y: number } | typeof corners[keyof typeof corners] | undefined
The corner for the effect to peel back from. Can be 2 arguments as x,y coordinates or a single argument as a corner id defined in corners
. Default is the bottom right corner.
constraints
Array<{ x: number, y: number } | typeof corners[keyof typeof corners]> | undefined
List of constraints on the distance of the peel. This can be thought of as points on the layers that are connected and cannot be torn apart. Typically this only makes sense as a point on the outer edge, such as the left edge of an open book, or the top edge of a calendar. In this case, simply using 2 constraint points (top-left/bottom-left for a book, etc) will create the desired effect. An arbitrary point can also be used with an effect like a thumbtack holding the pages together. Can be 2 arguments as x,y coordinates or a single argument as a corner id defined in corners
.
drag
boolean | undefined
A shorthand for setting the @drag
event to set the peel position to the mouse. The same as:
// Don't copy-paste this! This is an example of what is under the hood.
<template>
<Peel
@drag="drag"
:peel-position="peelPosition"
>
<template #top>
<div class="layer">Top</div>
</template>
<template #back>
<div class="layer">Back</div>
</template>
<template #bottom>
<div class="layer">Bottom</div>
</template>
</Peel>
</template>
<script setup>
import { ref } from 'vue'
import Peel from 'vue-peel'
import 'vue-peel/style.css'
const peelPosition = ref({})
function drag({ x, y }) {
peelPosition.value = { x, y }
}
</script>
handleElement
HTMLElement | undefined
Can be specified to allow another element serve as a "hit area" that can be larger or smaller than the element itself. In this example only the corner is grabbable.
<template>
<Peel
drag
:handle-element="handle"
>
<template #top>
<div class="layer">Top</div>
</template>
<template #back>
<div class="layer">
Back
<div
ref="handle"
class="handle"
/>
</div>
</template>
<template #bottom>
<div class="layer">Bottom</div>
</template>
</Peel>
</template>
<script setup>
import { ref } from 'vue'
import Peel from 'vue-peel'
import 'vue-peel/style.css'
const handle = ref()
</script>
<style scoped>
.handle {
border: 1px dashed red;
position: absolute;
bottom: -16px;
left: -16px;
width: 32px;
height: 32px;
}
</style>
mode
"book" | "calendar" | undefined
A shortcut for setting predefined constraints
. Currently "book"
and "calendar"
.
fadeThreshold
number | undefined
A threshold above which the top layer (including the backside) layer will begin to fade out. The threshold is between 0 (no peel) and 1 (top layer is fully peeled off) and is calculated based on the visible clipped area. If a peel path is set, it will use the progress along the path instead.
peelPath
number[] | undefined
A path along which the peel will follow. This can be a flat line segment (represented by 4 arguments: x1, y1, x2, y2) or a bezier curve (represented by 8 arguments: x1, y1, cp1x, cp1y, cp2x, cp2y, x2, y2 where cp1 and cp2 are the 2 bezier control points, similar to the bezierCurveTo canvas method.)
Events
@drag
{ event: DragEvent, x: number, y: number, amountClipped: number }
Fires on drag.