mirror of https://github.com/sveltejs/svelte
* Change actions tutorial * Rename files containing action functions * Move old pannable example to separate directory * Add new tutorial to examples * Update title of the pannable example * Add thumbnail for pannable action example * I can't remember all css properties, okay? * Fix order of style tag in new example * Inline outclick handlers * Rename pannable example * Fix formatting Co-authored-by: Nayan Gautam <50981692+698969@users.noreply.github.com>pull/6974/head
parent
81fc3f898a
commit
6ff1aed8d5
@ -0,0 +1,15 @@
|
|||||||
|
export function clickOutside(node) {
|
||||||
|
const handleClick = (event) => {
|
||||||
|
if (!node.contains(event.target)) {
|
||||||
|
node.dispatchEvent(new CustomEvent("outclick"));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
document.addEventListener("click", handleClick, true);
|
||||||
|
|
||||||
|
return {
|
||||||
|
destroy() {
|
||||||
|
document.removeEventListener("click", handleClick, true);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
@ -0,0 +1,51 @@
|
|||||||
|
<script>
|
||||||
|
import { spring } from 'svelte/motion';
|
||||||
|
import { pannable } from './pannable.js';
|
||||||
|
|
||||||
|
const coords = spring({ x: 0, y: 0 }, {
|
||||||
|
stiffness: 0.2,
|
||||||
|
damping: 0.4
|
||||||
|
});
|
||||||
|
|
||||||
|
function handlePanStart() {
|
||||||
|
coords.stiffness = coords.damping = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
function handlePanMove(event) {
|
||||||
|
coords.update($coords => ({
|
||||||
|
x: $coords.x + event.detail.dx,
|
||||||
|
y: $coords.y + event.detail.dy
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
function handlePanEnd(event) {
|
||||||
|
coords.stiffness = 0.2;
|
||||||
|
coords.damping = 0.4;
|
||||||
|
coords.set({ x: 0, y: 0 });
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="box"
|
||||||
|
use:pannable
|
||||||
|
on:panstart={handlePanStart}
|
||||||
|
on:panmove={handlePanMove}
|
||||||
|
on:panend={handlePanEnd}
|
||||||
|
style="transform:
|
||||||
|
translate({$coords.x}px,{$coords.y}px)
|
||||||
|
rotate({$coords.x * 0.2}deg)"
|
||||||
|
></div>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.box {
|
||||||
|
--width: 100px;
|
||||||
|
--height: 100px;
|
||||||
|
position: absolute;
|
||||||
|
width: var(--width);
|
||||||
|
height: var(--height);
|
||||||
|
left: calc(50% - var(--width) / 2);
|
||||||
|
top: calc(50% - var(--height) / 2);
|
||||||
|
border-radius: 4px;
|
||||||
|
background-color: #ff3e00;
|
||||||
|
cursor: move;
|
||||||
|
}
|
||||||
|
</style>
|
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"title": "A more complex action"
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
export function clickOutside(node) {
|
||||||
|
const handleClick = (event) => {
|
||||||
|
if (!node.contains(event.target)) {
|
||||||
|
node.dispatchEvent(new CustomEvent("outclick"));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
document.addEventListener("click", handleClick, true);
|
||||||
|
|
||||||
|
return {
|
||||||
|
destroy() {
|
||||||
|
document.removeEventListener("click", handleClick, true);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
@ -1,47 +0,0 @@
|
|||||||
export function pannable(node) {
|
|
||||||
let x;
|
|
||||||
let y;
|
|
||||||
|
|
||||||
function handleMousedown(event) {
|
|
||||||
x = event.clientX;
|
|
||||||
y = event.clientY;
|
|
||||||
|
|
||||||
node.dispatchEvent(new CustomEvent('panstart', {
|
|
||||||
detail: { x, y }
|
|
||||||
}));
|
|
||||||
|
|
||||||
window.addEventListener('mousemove', handleMousemove);
|
|
||||||
window.addEventListener('mouseup', handleMouseup);
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleMousemove(event) {
|
|
||||||
const dx = event.clientX - x;
|
|
||||||
const dy = event.clientY - y;
|
|
||||||
x = event.clientX;
|
|
||||||
y = event.clientY;
|
|
||||||
|
|
||||||
node.dispatchEvent(new CustomEvent('panmove', {
|
|
||||||
detail: { x, y, dx, dy }
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleMouseup(event) {
|
|
||||||
x = event.clientX;
|
|
||||||
y = event.clientY;
|
|
||||||
|
|
||||||
node.dispatchEvent(new CustomEvent('panend', {
|
|
||||||
detail: { x, y }
|
|
||||||
}));
|
|
||||||
|
|
||||||
window.removeEventListener('mousemove', handleMousemove);
|
|
||||||
window.removeEventListener('mouseup', handleMouseup);
|
|
||||||
}
|
|
||||||
|
|
||||||
node.addEventListener('mousedown', handleMousedown);
|
|
||||||
|
|
||||||
return {
|
|
||||||
destroy() {
|
|
||||||
node.removeEventListener('mousedown', handleMousedown);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
After Width: | Height: | Size: 4.0 KiB |
Loading…
Reference in new issue