mirror of
https://github.com/imfing/hextra.git
synced 2025-09-15 12:01:59 -04:00
feat(image-zoom): implement multi-touch pinch detection for zoom functionality
- Added support for pinch gestures to enhance the zoom experience on touch devices. - Implemented event listeners for pointer events to manage pinch start and end. - Updated closing behavior to account for active pinch gestures, improving user interaction.
This commit is contained in:
@@ -23,12 +23,42 @@
|
|||||||
|
|
||||||
overlay.appendChild(img);
|
overlay.appendChild(img);
|
||||||
|
|
||||||
|
// Track pinch gesture
|
||||||
|
let pinching = false;
|
||||||
|
let pinchTimer = 0;
|
||||||
|
const activeTouchPointers = new Set();
|
||||||
|
function pinchingStart() {
|
||||||
|
pinching = true;
|
||||||
|
if (pinchTimer) clearTimeout(pinchTimer);
|
||||||
|
}
|
||||||
|
function pinchingEndSoon() {
|
||||||
|
if (pinchTimer) clearTimeout(pinchTimer);
|
||||||
|
pinchTimer = setTimeout(() => (pinching = false), 350);
|
||||||
|
}
|
||||||
|
function onPointerDown(e) {
|
||||||
|
if (e.pointerType === 'touch') {
|
||||||
|
activeTouchPointers.add(e.pointerId);
|
||||||
|
if (activeTouchPointers.size > 1) pinchingStart();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function onPointerUp(e) {
|
||||||
|
if (e.pointerType === 'touch') {
|
||||||
|
activeTouchPointers.delete(e.pointerId);
|
||||||
|
if (activeTouchPointers.size < 2) pinchingEndSoon();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function close(immediate = false) {
|
function close(immediate = false) {
|
||||||
// trigger dedicated closing transitions for smoother zoom-out
|
// trigger dedicated closing transitions for smoother zoom-out
|
||||||
overlay.classList.add("closing");
|
overlay.classList.add("closing");
|
||||||
window.removeEventListener("keydown", onKeyDown, true);
|
window.removeEventListener("keydown", onKeyDown, true);
|
||||||
window.removeEventListener("scroll", onScroll, true);
|
window.removeEventListener("scroll", onScroll, true);
|
||||||
overlay.removeEventListener("wheel", onWheel);
|
overlay.removeEventListener("wheel", onWheel);
|
||||||
|
overlay.removeEventListener("pointerdown", onPointerDown);
|
||||||
|
overlay.removeEventListener("pointerup", onPointerUp);
|
||||||
|
overlay.removeEventListener("pointercancel", onPointerUp);
|
||||||
|
activeTouchPointers.clear();
|
||||||
|
if (pinchTimer) clearTimeout(pinchTimer);
|
||||||
|
|
||||||
if (immediate) {
|
if (immediate) {
|
||||||
overlay.remove();
|
overlay.remove();
|
||||||
@@ -44,10 +74,21 @@
|
|||||||
overlay.addEventListener("click", () => close(false), { once: true });
|
overlay.addEventListener("click", () => close(false), { once: true });
|
||||||
window.addEventListener("keydown", onKeyDown, true);
|
window.addEventListener("keydown", onKeyDown, true);
|
||||||
|
|
||||||
function onWheel(e) { if (e && e.ctrlKey) return; close(true); }
|
function onWheel(e) {
|
||||||
function onScroll() { close(true); }
|
// Ignore trackpad pinch (wheel + ctrlKey) and active pinch
|
||||||
|
if ((e && e.ctrlKey) || pinching) return;
|
||||||
|
close(true);
|
||||||
|
}
|
||||||
|
function onScroll() {
|
||||||
|
if (pinching) return;
|
||||||
|
close(true);
|
||||||
|
}
|
||||||
|
|
||||||
overlay.addEventListener("wheel", onWheel, { passive: true });
|
overlay.addEventListener("wheel", onWheel, { passive: true });
|
||||||
|
// Standard W3C pointer events for multi-touch pinch detection
|
||||||
|
overlay.addEventListener("pointerdown", onPointerDown);
|
||||||
|
overlay.addEventListener("pointerup", onPointerUp);
|
||||||
|
overlay.addEventListener("pointercancel", onPointerUp);
|
||||||
window.addEventListener("scroll", onScroll, true);
|
window.addEventListener("scroll", onScroll, true);
|
||||||
|
|
||||||
document.body.appendChild(overlay);
|
document.body.appendChild(overlay);
|
||||||
|
Reference in New Issue
Block a user