A123533525 2023-12-01 09:16 采纳率: 42.9%
浏览 6
已结题

js的touch事件

使用了touch相关事件,但是在滑动的过程中会触发浏览器的手势(前进,后退,缩放等),于是乎就在touchmove中对浏览器默认事件进行了禁用,但是衍生出一个问题就是我页面中所有的滚动条都无法使用了,于是没办法只能通过代码在touchmove事件中来修改dom的scorllTop或scrollLeft值,但是又发现一个问题就是修改scrollLeft值没太多问题,但是修改scorllTop的时候会出现卡顿或者赋值不生效的情况,上述问题怎么解决呢

  • 写回答

1条回答 默认 最新

  • 梦回阑珊 2023-12-02 10:30
    关注

    回复不易,麻烦关注下博主,后面还有问题直接私信我,谢谢!!!

    问题的根本原因可能与浏览器的滚动行为和 touchmove 事件有关。在处理 touchmove 事件时,你禁用了浏览器默认行为,这导致浏览器不再处理滚动。因此,你需要手动模拟滚动的效果。

    为了解决这个问题,你可以尝试以下方法:

    使用 CSS 属性 overflow: hidden: 在处理 touchmove 事件期间,将页面的 overflow 样式设置为 hidden,以防止浏览器滚动。处理完 touchmove 事件后,再将 overflow 恢复到原来的值。

    document.body.style.overflow = 'hidden';
    // 处理 touchmove 事件
    document.body.style.overflow = 'auto'; //'scroll',恢复原来的 overflow 值
    
    
    

    使用 passive 选项: 在 addEventListener 中使用 { passive: false } 选项,以便在处理 touchmove 事件时仍能阻止浏览器默认滚动行为

    document.addEventListener('touchmove', handleTouchMove, { passive: false });
    
    
    

    模拟滚动效果: 如果需要在 touchmove 事件中手动模拟滚动效果,确保你的代码是高效的。使用 requestAnimationFrame 来在下一帧更新滚动位置,以提高性能。

    let startY;
    
    document.addEventListener('touchstart', (e) => {
        startY = e.touches[0].clientY;
    });
    
    document.addEventListener('touchmove', (e) => {
        const deltaY = e.touches[0].clientY - startY;
        // 模拟滚动效果
        window.scrollTo({
            top: window.scrollY - deltaY,
            behavior: 'auto' // 或 'smooth',根据需要选择
        });
        startY = e.touches[0].clientY;
        e.preventDefault(); // 阻止默认滚动
    }, { passive: false });
    
    
    

    事件委托: 考虑使用事件委托来减少事件处理器的数量。只有在真正需要处理 touchmove 事件时才添加事件处理器,以减少性能开销。

    避免频繁触发滚动: 如果你在 touchmove 中频繁触发滚动,可能导致性能问题。确保只在必要的情况下触发滚动,并尽量避免在滚动过程中频繁修改 DOM

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月11日
  • 创建了问题 12月1日

悬赏问题

  • ¥15 付费100元 悬赏iphone 15pm 链接watch s7 移动一号双终端 下载不了esim文件解决办法?
  • ¥60 云南移动网络无法访问网站,但联通电信可正常访问
  • ¥15 寻找有过Qt加载网页项目经验的人
  • ¥15 我的电脑在最近一次windows更新后彻底打不开了,一按电源键只有这个提示,如何解决
  • ¥15 烝救者笔记本然后刷thinkbook笔记本的bios
  • ¥15 同心圆环圆心的高精度测量
  • ¥15 vs2010修改时间编辑控件
  • ¥15 郑州牧原测试岗值得去吗
  • ¥100 复现论文:matlab仿真代码编写
  • ¥15 esp32驱动GC9A01循环播放视频