vue监听移动端左滑、右滑、上滑、下滑、长按事件

  1. 定义一个监听touch指令,主要根据计算开始到结束滑动的位置计算X、Y轴相应的距离再计算角度来判断滑动的方向
    directives:{
    	//滑动指令
    	touch:{
        bind: function (el, binding, vnode) {
          var touchType = binding.arg; //传入的模式 press swipeRight swipeLeft swipeTop swipeDowm Tap
          var timeOutEvent = 0;
          var direction = '';
          //滑动处理
          var startX, startY;
    
          //返回角度
          function GetSlideAngle(dx, dy) {
            return Math.atan2(dy, dx) * 180 / Math.PI;
          }
    
          //根据起点和终点返回方向 1:向上,2:向下,3:向左,4:向右,0:未滑动
          function GetSlideDirection(startX, startY, endX, endY) {
            var dy = startY - endY;
            var dx = endX - startX;
            var result = 0;
    
            //如果滑动距离太短
            if (Math.abs(dx) < 2 && Math.abs(dy) < 2) {
              return result;
            }
    
            var angle = GetSlideAngle(dx, dy);
            if (angle >= -45 && angle < 45) {
              result = 'swiperight';
            } else if (angle >= 45 && angle < 135) {
              result = 'swipeup';
            } else if (angle >= -135 && angle < -45) {
              result = 'swipedown';
            }
            else if ((angle >= 135 && angle <= 180) || (angle >= -180 && angle < -135)) {
              result = 'swipeleft';
            }
            return result;
          }
    
          el.addEventListener('touchstart', function (ev) {
            startX = ev.touches[0].pageX;
            startY = ev.touches[0].pageY;
    
            //判断长按
            timeOutEvent = setTimeout(() =>{
              timeOutEvent = 0 ;
              if(touchType === 'press'){
                  binding.value()
              }
            } , 500);
    
          }, false);
    
          el.addEventListener('touchmove' , function (ev) {
            clearTimeout(timeOutEvent)
            timeOutEvent = 0;
          });
    
          el.addEventListener('touchend', function (ev) {
            var endX, endY;
            endX = ev.changedTouches[0].pageX;
            endY = ev.changedTouches[0].pageY;
            direction = GetSlideDirection(startX, startY, endX, endY);
    
            clearTimeout(timeOutEvent)
    
            switch (direction) {
              case 0:
                break;
              case 'swipeup':
                if(touchType === 'swipeup'){
                    binding.value()
                }
                break;
              case 'swipedown':
                if(touchType === 'swipedown'){
                    binding.value()
                }
                break;
              case 'swipeleft':
                if(touchType === 'swipeleft'){
                    binding.value()
                }
                break;
              case 'swiperight':
                if(touchType === 'swiperight'){
                    binding.value()
                }
                break;
              default:
            }
      		}, false);
        }
    	}
    }

     

  2. 在标签绑定指令和事件,并在methods定义事件。
    <div v-touch:swipeleft="leftSlide" v-touch:swiperight="rightSlide">
     
    </div>
    leftSlide() {
    	console.log('左滑')
    },
    rightSlide() {
    	console.log('右滑')
    }

     

 

转载于:https://my.oschina.net/u/4051564/blog/3024527

### 实现 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、付费专栏及课程。

余额充值