-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbefore-after.js
More file actions
70 lines (60 loc) · 2.28 KB
/
Copy pathbefore-after.js
File metadata and controls
70 lines (60 loc) · 2.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
(function () {
const compares = document.querySelectorAll("[data-compare]");
compares.forEach((el) => {
const handle = el.querySelector(".compare-handle");
if (!handle) return;
let dragging = false;
const setPos = (pct) => {
const clamped = Math.max(0, Math.min(100, pct));
el.style.setProperty("--compare-pos", clamped + "%");
handle.setAttribute("aria-valuenow", Math.round(clamped));
};
const posFromEvent = (clientX) => {
const rect = el.getBoundingClientRect();
return ((clientX - rect.left) / rect.width) * 100;
};
const onPointerMove = (e) => {
if (!dragging) return;
setPos(posFromEvent(e.clientX));
};
const onPointerUp = () => {
dragging = false;
el.classList.remove("is-dragging");
window.removeEventListener("pointermove", onPointerMove);
window.removeEventListener("pointerup", onPointerUp);
};
const startDrag = (e) => {
dragging = true;
el.classList.add("is-dragging");
setPos(posFromEvent(e.clientX));
window.addEventListener("pointermove", onPointerMove);
window.addEventListener("pointerup", onPointerUp);
};
handle.addEventListener("pointerdown", (e) => {
e.preventDefault();
handle.focus();
startDrag(e);
});
el.addEventListener("pointerdown", (e) => {
if (e.target === handle || handle.contains(e.target)) return;
startDrag(e);
});
handle.addEventListener("keydown", (e) => {
const current = parseFloat(handle.getAttribute("aria-valuenow")) || 50;
const step = e.shiftKey ? 10 : 2;
if (e.key === "ArrowLeft") {
e.preventDefault();
setPos(current - step);
} else if (e.key === "ArrowRight") {
e.preventDefault();
setPos(current + step);
} else if (e.key === "Home") {
e.preventDefault();
setPos(0);
} else if (e.key === "End") {
e.preventDefault();
setPos(100);
}
});
});
})();