当前位置:首页 > JavaScript

js手势实现

2026-02-28 19:32:47JavaScript

手势识别基础概念

手势识别通常涉及触摸事件的监听和处理,包括触摸开始(touchstart)、触摸移动(touchmove)和触摸结束(touchend)。通过分析这些事件的坐标变化和时间差,可以识别出常见手势如点击、滑动、缩放、旋转等。

监听触摸事件

在JavaScript中,通过添加事件监听器来捕获触摸事件:

const element = document.getElementById('gesture-area');
element.addEventListener('touchstart', handleTouchStart, false);
element.addEventListener('touchmove', handleTouchMove, false);
element.addEventListener('touchend', handleTouchEnd, false);

处理触摸数据

存储触摸点的初始位置和当前状态:

let touchStartX = 0;
let touchStartY = 0;
let touchEndX = 0;
let touchEndY = 0;

function handleTouchStart(event) {
    touchStartX = event.touches[0].clientX;
    touchStartY = event.touches[0].clientY;
}

实现滑动识别

通过比较起始和结束位置的差值判断滑动方向:

js手势实现

function handleTouchMove(event) {
    touchEndX = event.touches[0].clientX;
    touchEndY = event.touches[0].clientY;
}

function handleTouchEnd() {
    const dx = touchEndX - touchStartX;
    const dy = touchEndY - touchStartY;

    if (Math.abs(dx) > Math.abs(dy)) {
        if (dx > 0) console.log('向右滑动');
        else console.log('向左滑动');
    } else {
        if (dy > 0) console.log('向下滑动');
        else console.log('向上滑动');
    }
}

实现双指缩放

通过计算两点间距离变化识别缩放:

let initialDistance = 0;

function handleTouchStart(event) {
    if (event.touches.length === 2) {
        initialDistance = getDistance(event.touches[0], event.touches[1]);
    }
}

function handleTouchMove(event) {
    if (event.touches.length === 2) {
        const currentDistance = getDistance(event.touches[0], event.touches[1]);
        const scale = currentDistance / initialDistance;
        console.log(`缩放比例: ${scale}`);
    }
}

function getDistance(touch1, touch2) {
    return Math.hypot(
        touch2.clientX - touch1.clientX,
        touch2.clientY - touch1.clientY
    );
}

实现旋转识别

通过计算两点间角度变化识别旋转:

js手势实现

let initialAngle = 0;

function handleTouchStart(event) {
    if (event.touches.length === 2) {
        initialAngle = getAngle(event.touches[0], event.touches[1]);
    }
}

function handleTouchMove(event) {
    if (event.touches.length === 2) {
        const currentAngle = getAngle(event.touches[0], event.touches[1]);
        const rotation = currentAngle - initialAngle;
        console.log(`旋转角度: ${rotation}°`);
    }
}

function getAngle(touch1, touch2) {
    return Math.atan2(
        touch2.clientY - touch1.clientY,
        touch2.clientX - touch1.clientX
    ) * 180 / Math.PI;
}

使用现成库简化开发

对于复杂手势,推荐使用现成库如Hammer.js:

const hammer = new Hammer(element);
hammer.on('swipe', (event) => {
    console.log(`滑动方向: ${event.direction}`);
});
hammer.on('pinch', (event) => {
    console.log(`缩放比例: ${event.scale}`);
});
hammer.on('rotate', (event) => {
    console.log(`旋转角度: ${event.rotation}`);
});

性能优化建议

避免在touchmove事件中执行耗时操作,必要时使用requestAnimationFrame进行节流。对于移动端,注意处理被动事件监听器以提高滚动性能:

element.addEventListener('touchmove', handleTouchMove, { passive: true });

兼容性处理

检测设备是否支持触摸事件,并提供备用方案:

const supportsTouch = 'ontouchstart' in window;
if (!supportsTouch) {
    element.addEventListener('mousedown', handleMouseDown);
}

标签: 手势js
分享给朋友:

相关文章

js类实现

js类实现

使用类实现 JavaScript 功能 在 JavaScript 中,类(Class)是一种语法糖,基于原型继承机制。通过 class 关键字可以更直观地定义对象模板。 基本类定义 class…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…

js实现路由

js实现路由

js实现路由的方法 在JavaScript中实现路由功能可以通过多种方式完成,以下是几种常见的方法: 使用原生JavaScript实现路由 通过监听window.onhashchange事件来实现基…

js实现搜索

js实现搜索

实现搜索功能的方法 在JavaScript中实现搜索功能可以通过多种方式完成,以下是几种常见的实现方法。 使用数组的filter方法 通过数组的filter方法可以筛选出符合条件的数据项。假设有一个…

js实现下拉刷新

js实现下拉刷新

监听触摸事件 通过监听 touchstart、touchmove 和 touchend 事件来检测用户下拉手势。记录触摸起始位置和移动距离。 let startY = 0; let curr…

js实现滑动

js实现滑动

实现滑动效果的方法 在JavaScript中实现滑动效果可以通过多种方式完成,以下是几种常见的实现方法: 使用CSS过渡和JavaScript触发 通过CSS定义过渡效果,JavaScript控制触…