判断手机屏幕上的横向滑动(左滑和右滑)

在JavaScript中,你可以通过监听触摸事件(touch events)来判断用户在手机屏幕上的横向滑动方向。以下是实现方法:

基本实现方案

javascript 复制代码
let touchStartX = 0;
let touchEndX = 0;

function handleTouchStart(event) {
  touchStartX = event.changedTouches[0].screenX;
}

function handleTouchEnd(event) {
  touchEndX = event.changedTouches[0].screenX;
  handleSwipe();
}

function handleSwipe() {
  const threshold = 50; // 最小滑动距离阈值
  const diffX = touchEndX - touchStartX;

  if (Math.abs(diffX) > threshold) {
    if (diffX > 0) {
      console.log("向右滑动");
      // 执行右滑操作
    } else {
      console.log("向左滑动");
      // 执行左滑操作
    }
  }
}

// 添加事件监听
const element = document.getElementById('swipe-area');
element.addEventListener('touchstart', handleTouchStart, false);
element.addEventListener('touchend', handleTouchEnd, false);

更完善的实现(包含滑动速度检测)

javascript 复制代码
let touchStartX = 0;
let touchStartTime = 0;

const element = document.getElementById('swipe-area');

element.addEventListener('touchstart', (e) => {
  touchStartX = e.touches[0].clientX;
  touchStartTime = Date.now();
}, false);

element.addEventListener('touchmove', (e) => {
  e.preventDefault(); // 阻止默认行为,避免页面滚动
}, { passive: false });

element.addEventListener('touchend', (e) => {
  const touchEndX = e.changedTouches[0].clientX;
  const touchEndTime = Date.now();
  
  const diffX = touchEndX - touchStartX;
  const duration = touchEndTime - touchStartTime;
  const velocity = Math.abs(diffX) / duration; // 计算滑动速度
  
  const threshold = 50; // 最小滑动距离
  const minVelocity = 0.3; // 最小滑动速度(像素/毫秒)
  
  if (Math.abs(diffX) > threshold && velocity > minVelocity) {
    if (diffX > 0) {
      console.log("向右滑动");
      // 执行右滑操作
    } else {
      console.log("向左滑动");
      // 执行左滑操作
    }
  }
}, false);

React 组件实现示例

jsx 复制代码
import React, { useRef } from 'react';

const SwipeDetector = () => {
  const touchStartX = useRef(0);
  const touchStartTime = useRef(0);

  const handleTouchStart = (e) => {
    touchStartX.current = e.touches[0].clientX;
    touchStartTime.current = Date.now();
  };

  const handleTouchEnd = (e) => {
    const touchEndX = e.changedTouches[0].clientX;
    const touchEndTime = Date.now();
    
    const diffX = touchEndX - touchStartX.current;
    const duration = touchEndTime - touchStartTime.current;
    const velocity = Math.abs(diffX) / duration;
    
    const threshold = 50;
    const minVelocity = 0.3;
    
    if (Math.abs(diffX) > threshold && velocity > minVelocity) {
      if (diffX > 0) {
        console.log("向右滑动");
        // 执行右滑操作
      } else {
        console.log("向左滑动");
        // 执行左滑操作
      }
    }
  };

  return (
    <div
      style={{ width: '100%', height: '200px', backgroundColor: '#eee' }}
      onTouchStart={handleTouchStart}
      onTouchEnd={handleTouchEnd}
    >
      在此区域滑动
    </div>
  );
};

export default SwipeDetector;

注意事项

  1. 阈值选择threshold 值需要根据实际需求调整,太小可能会误触,太大可能导致滑动不灵敏
  2. 性能考虑 :避免在touchmove事件中执行复杂操作
  3. 兼容性:现代浏览器都支持触摸事件,但要注意某些旧版本浏览器的兼容性
  4. 被动事件 :如果不需要阻止默认行为,可以设置{ passive: true }提高滚动性能
  5. 多指触摸:上述代码只处理单指滑动,如需处理多指手势需要额外逻辑

进阶优化

  1. 可以添加垂直滑动检测,并判断是横向还是纵向滑动
  2. 可以添加滑动过程中的视觉反馈
  3. 可以使用现有的手势库如Hammer.js(https://hammerjs.github.io/)简化开发
html 复制代码
<!-- 使用Hammer.js示例 -->
<script src="https://cdn.jsdelivr.net/npm/hammerjs@2.0.8/hammer.min.js"></script>
<script>
  const element = document.getElementById('swipe-area');
  const hammer = new Hammer(element);
  
  hammer.on('swipeleft', () => console.log('向左滑动'));
  hammer.on('swiperight', () => console.log('向右滑动'));
</script>
相关推荐
天若有情6735 小时前
程序员原创|借鉴JS事件冒泡,根治电脑文件混乱的“冒泡整理法”
开发语言·javascript·windows·ecmascript·电脑·办公·日常
FYKJ_20106 小时前
springboot校园兼职平台--附源码02041
java·javascript·spring boot·python·eclipse·django·php
空中海11 小时前
01 React Native 基础、核心组件与布局体系
javascript·react native·react.js
空中海12 小时前
05 React架构设计、项目实践与专家清单
前端·react.js·前端框架
꯭爿꯭巎꯭12 小时前
root环境检测软件(环境检测工具大全root )Nativetest
智能手机·安卓
前端之虎陈随易14 小时前
2年没用Nodejs了,Bun很香
linux·前端·javascript·vue.js·typescript
空中海14 小时前
04 工程化、质量体系与 React 生态
前端·ubuntu·react.js
空中海14 小时前
03 性能、动画与 React Native 新架构
react native·react.js·架构
好运的阿财15 小时前
OpenClaw工具拆解之host_workspace_write+host_workspace_edit
前端·javascript·人工智能·机器学习·ai编程·openclaw·openclaw工具
XiYang-DING15 小时前
JavaScript
开发语言·javascript·ecmascript