首页 > 其他分享 >一个vue3指令,兼容pc与移动端的拖动tab切换,鼠标拖动与触摸拖动触控监听

一个vue3指令,兼容pc与移动端的拖动tab切换,鼠标拖动与触摸拖动触控监听

时间:2024-03-29 11:58:47浏览次数:10  
标签:hasMove el const 控监 拖动 pc addEventListener event

<View class="app-tabs-container" :class="{ appear: state.showTabsTrans }" v-tabs-pointer-event:[state.hasMove]="handleProductChange">
    <router-view v-slot="{ Component }">
        <KeepAlive>
            <component :is="Component" :key="route.fullPath"></component>
        </KeepAlive>
    </router-view>
</View>
import vTabsPointerEvent from '@/directives/vTabsPointerEvent';

vTabsPointerEvent.ts

const vPointerEvent = {
    mounted(el: HTMLElement, binding: any) {
        const childNum = el.children.length;
        el.style.width = 'max-content';
        const childWidth = Math.floor(el.clientWidth / childNum);
        const emitIndex = binding.value || (() => {});

        /** 未限制最左右侧页面尽头的不可滑动,需添加页面位置标志监听 */
        const discoverTabsType = localStorage.getItem('discoverTabsType') || 'appIndex';
        let startX = 0;
        /** 限制出现上下滑动时禁止切面切换事件 */
        let startY = 0;
        let hasMove = false;
        el.addEventListener('pointerdown', event => {
            event.preventDefault();
            startX = event.pageX;
            startY = event.pageY;
            el.style.transition = '';
        });

        el.addEventListener('pointermove', event => {
            if (event.pointerType === 'mouse' && event.buttons === 0) return event.stopPropagation(); // 鼠标滑过忽略

            const nowOffsetX = event.pageX - startX;
            /** 限制最左右侧页面尽头的不可滑动 */
            if ((discoverTabsType === 'appIndex' && nowOffsetX > 0) || (discoverTabsType === 'appSort' && nowOffsetX < 0)) {
                hasMove = false;
                event.stopPropagation();
                return;
            }
            const nowOffsetY = event.pageY - startY;
            if (Math.abs(nowOffsetX) > 10) hasMove = true;
            if (Math.abs(nowOffsetY) > 20) hasMove = false;
        });

        el.addEventListener('pointerup', event => {
            emitIndex(hasMove);
            if (!hasMove) return event.stopPropagation();
            hasMove = false;
        });

        /** 兼容鼠标拖动的滚动事件 */
        el.addEventListener('mouseleave', event => {
            if (event.pointerType === 'mouse' && event.buttons === 0) return; // 鼠标滑过忽略
            if (!hasMove) return event.stopPropagation();
            emitIndex(hasMove);
            hasMove = false;
        });

        el.addEventListener('touchmove', event => {
            /** 页面可上下滑动 */
            if (hasMove) event.preventDefault();
        });

        el.addEventListener('click', event => {
            /** 监听会在 @click 事件触发后才触发,无法拦截 @click 事件 */
            event.preventDefault();
            /** 滑动有偏移的话就阻止点击事件的捕获 */
            if (Math.abs(startX - event.clientX) > 5) event.stopPropagation();
        });
    }
};

export default vPointerEvent;

标签:hasMove,el,const,控监,拖动,pc,addEventListener,event
From: https://www.cnblogs.com/yoona-lin/p/18103503

相关文章

  • PCM文件页面播放及波形图绘制
    一、前端使用WaveSurfer.js插件来绘制波形图。针对vue项目做个简单介绍:1. 安装WaveSurfer依赖包:npminstallWaveSurfer2.页面内引用:a.html       b.js                     到此就可以对引入的需要播......
  • 【Linux】生产者消费者模型{基于BlockingQueue的PC模型/RAII风格的加锁方式/串行,并行,
    文章目录1.认识PC模型2.基于BlockingQueue的PC模型2.1串行,并行,并发2.2理解linux下的并发2.2RAII风格的加锁方式2.3阻塞队列2.4深入理解pthread_cond_wait2.5整体代码1.Task.hpp2.lockGuard.hpp3.BlockQueue.hpp4.pcModel.cc3.总结PC模型1.认识PC模型知乎好文「......
  • 自定义的基于System.Net.Http.HttpClient的WebClient,可以作为微信支付宝的发起请求时
    个人编写的,自己用于自己的微信api的请求的实现当中,源码公开,大家可以查看反编译源码。以下是使用方法:第一步搜索和安装zmjtool第二步发起请求1/**引入命名空间*/2usingZmjTool;34/**发起Get请求*/5using(varcl=newZmjTool.WebClient())6{7cl.......
  • 不同操作系统中通用解决方案,浏览器拉起app或打开本机应用软件原理,前端网页如何打开一
    不同操作系统中通用解决方案,浏览器拉起app或打开本机应用软件原理,前端网页如何打开一个PC本地应用,通过Scheme、JavaScript、第三方库分别实现前端网页打开本地应用。设想一个场景,当我们在浏览一个网页并且需要下载某个资源时,你的电脑可能经常会跳出一个提示框,询问你是否需......
  • C++第五十七篇——RPC进程间通信
    第一步:新建一个空项目 第二步:新建一个IDL 第三步:生成一个GUID,编写RPCConn.idl RPCConn.idlimport"oaidl.idl";import"ocidl.idl";[uuid(1BA624D4-DC7D-484C-AF8C-0EF86C4A0555),version(1.0)]interfaceRPCConn{intAdd([in]inta,......
  • [转帖]PCIe7.0宣布即将2025推出
    https://zhuanlan.zhihu.com/p/532935941 jiu导言在2022年的PCI-SIG的开发者大会上,PCI-SIG总裁庆祝了PCI-SIG成立30周年并宣布PCIe技术的下一代技术展望,并且计划在2025年向成员发布PCIe7.0标准。而在未来3年中即将推出的PCIe7.0再次提供速度提升(相比较PCIe6.0翻倍,X16双......
  • pc鼠标左右移动
     constmovable=useRef<any>(null) consthandle=()=>{  letisDragging=false;  letstartX:any;  movable.current.addEventListener('mousedown',(e:any)=>{    isDragging=true;    startX=e.clientX-movable.c......
  • vue3 - 最新手机扫码PC网站二维码登录功能,用手机端扫描PC端vue3网页的登录二维码,然后
    效果图在vue3开发中,详细实现“PC电脑网站生成微信登录二维码+手机扫码登录+双端同步数据”,利用扫码实现网站登录功能、用户用手机扫描电脑端二维码进行登录的详细教程步骤(电脑端PC网页、手机端都是vue3开发,支持将手机端改造成微信小程序、uniapp安卓苹果app、H5网页等。)......
  • gRpc
    一、gRpc是什么gRPC是一个开源的高性能远程过程调用(RPC)框架,调用远程服务可像调用方法一样简单,适用于多种环境和多种语言。gRPC基于HTTP/2协议标准,并使用Protobuf序列化机制,gRPC基于接口定义语言(IDL)进行定义,允许用户定义服务及其能够被远程调用的方法,gRPC框架支持多种开发语言......
  • 【题解】P10235 [yLCPC2024] C. 舞萌基本练习
    P10235舞萌基本练习题解思路看到最大值最小首先考虑二分答案。由于答案满足单调性,可以二分不优美度的最大值,也就是逆序对数的最大值。我们在每次增加一个元素的时候都要求解当前区间的逆序对数,所以不能用归并排序求逆序对数,考虑树状数组解法。如果不会树状数组求逆序对,请出......