js判断移动端手指的上滑,下滑,左滑,右滑,事件监听

本文详细解析触摸滑动事件的工作原理,并提供了一个简单的代码示例,展示如何通过比较触摸开始和结束时的坐标来判断滑动方向。此外,文章还讨论了斜向滑动时的处理技巧,以确保滑动方向的准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原理:

1:当开始一个touchstart事件的时候,获取此刻手指的横坐标startX和startY;

2:当触发touchmove事件的时候,再获取此时手指的横坐标moveEndX和纵坐标moveEndY;最后,通过两次获取的坐标差值来判断手指在手机屏幕上的滑动方向。

代码:

document.getElementById("id").addEventListener("touchstart", function(e) {

    e.preventDefault();
    startX = e.originalEvent.changedTouches[0].pageX,
    startY = e.originalEvent.changedTouches[0].pageY;
  });
document.getElementById("id").addEventListener("touchmove", function(e) {
    e.preventDefault();
    moveEndX = e.originalEvent.changedTouches[0].pageX,
    moveEndY = e.originalEvent.changedTouches[0].pageY,
    X = moveEndX - startX,
    Y = moveEndY - startY;

    if ( X > 0 ) {
      alert("左往右滑");
    }
    else if ( X < 0 ) {
      alert("右往左滑");
    }
    else if ( Y > 0) {
      alert("上往下滑");
    }
    else if ( Y < 0 ) {
      alert("下往上滑");
    }
    else{
      alert("滑了个寂寞");
    }
  });

touchmove的最后坐标减去touchstart的起始坐标,X的结果如果正数,则说明手指是从左往右划动;X的结果如果负数,则说明手指是从右往左划动;Y的结果如果正数,则说明手指是从上往下划动;Y的结果如果负数,则说明手指是从下往上划动。

实际上手指在手机上面滑动时很难做到直上直下的滑动;只要稍微有点斜,就会被x轴的判断现行接管,而与我们的实际操作意愿相背离。此时就需要添加特殊的判断技巧,代码如下:

document.getElementById("id").addEventListener("touchstart", function(e) {
    e.preventDefault();
    startX = e.originalEvent.changedTouches[0].pageX,
    startY = e.originalEvent.changedTouches[0].pageY;
  });
document.getElementById("id").addEventListener("touchmove", function(e) {
    e.preventDefault();
    moveEndX = e.originalEvent.changedTouches[0].pageX,
    moveEndY = e.originalEvent.changedTouches[0].pageY,
    X = moveEndX - startX,
    Y = moveEndY - startY;

    if ( Math.abs(X) > Math.abs(Y) && X > 0 ) {
      alert("左往右滑");
    }
    else if ( Math.abs(X) > Math.abs(Y) && X < 0 ) {
      alert("右往左滑");
    }
    else if ( Math.abs(Y) > Math.abs(X) && Y > 0) {
      alert("上往下滑");
    }
    else if ( Math.abs(Y) > Math.abs(X) && Y < 0 ) {
      alert("下往上滑");
    }
    else{
      alert("滑了个寂寞");
    }
  });

### 实现 Vue3 移动端卡片效果 对于实现移动端 Vue3 的卡片效果,可以考虑使用 `vue-awesome-swiper` 或者其他专门针对触摸事件优化的库来处理手势识别[^1]。 #### 使用 vue-awesome-swiper 库 安装依赖: ```bash npm install vue-awesome-swiper@next swiper --save ``` 创建 Swiper 组件并配置参数以适应卡片样式需求: ```javascript import { defineComponent } from 'vue'; import { Swiper, SwiperSlide } from 'swiper/vue'; export default defineComponent({ name: 'CardSwiper', components: { Swiper, SwiperSlide }, setup() { const onSwiper = (swiper) => { console.log(swiper); }; const onSlideChange = () => { console.log('slide change'); }; return { onSwiper, onSlideChange } } }); ``` 模板部分定义如下所示: ```html <template> <div class="card-container"> <swiper :modules="modules" @swiper="onSwiper" @slideChange="onSlideChange"> <!-- 卡片项 --> <swiper-slide v-for="(item,index) in items" :key="index">{{ item }}</swiper-slide> </swiper> </div> </template> <script lang="ts"> // ... 上述 JavaScript 部分 ... </script> <style scoped> .card-container .swiper-slide { display: flex; justify-content: center; align-items: center; } </style> ``` 此方法利用了 Swiper 提供的强大功能集,包括但不限于自动轮播、循环模式以及触控支持等功能特性。 #### 自定义解决方案 如果希望更轻量级或者完全自定义交互逻辑,则可以通过监听 touchstart 和 touchmove 事件来自行计算位移距离,并据此调整 DOM 元素的位置属性。这种方式虽然灵活度更高但也意味着更多的工作量和潜在兼容性挑战。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值