You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

移动端Safari快速滑动Fancybox图库并关闭模态框后页面重渲染问题求助

移动端Safari快速滑动Fancybox图库并关闭模态框后页面重渲染问题求助

我现在碰到一个挺棘手的问题:用React+Next.js搭配Fancybox做的图片画廊组件,在所有浏览器里都运行正常,唯独在移动端Safari上出了状况——当我快速滑动浏览模态框里的照片,关闭模态框之后,整个页面会突然闪一下(也就是触发了重渲染)。

下面是我简化后的实现代码:

useEffect(() => {
  const initFancybox = () => {
    const isMobile = /iPhone|iPad|iPod/i.test(navigator.userAgent);
    Fancybox.bind(document.body, "[data-fancybox]", {
      dragToClose: true,
      closeButton: "auto",
      Images: { zoom: false },
      on: {
        ready: (fancybox) => {
          const instance = fancybox as FancyboxInstance;
          if (isMobile) {
            let startY = 0;
            let isSwiping = false;
            instance.container.addEventListener('touchstart', (e) => {
              startY = e.touches[0].clientY;
              isSwiping = true;
            }, { passive: true });
            instance.container.addEventListener('touchmove', (e) => {
              if (!isSwiping) return;
              const diffY = Math.abs(e.touches[0].clientY - startY);
              if (diffY > 50) instance.close();
            }, { passive: true });
          }
        },
        destroy: () => setTimeout(initFancybox, 100)
      }
    });
  };

  initFancybox();
  return () => Fancybox.destroy();
}, []);

我已经尝试过这些方法,但都没解决问题:

  • 在触摸事件处理器里添加preventDefault()
  • 调整被动事件监听器的各种配置
  • 给滑动事件添加防抖处理
  • 手动显式清理所有事件监听器

我的开发环境:

  • React 18
  • Next.js 14
  • Fancybox 5.0
  • iOS 15+ Safari

我怀疑可能的问题点:

  • 快速绑定事件监听器导致的内存泄漏
  • Safari过于激进的页面缓存行为
  • React虚拟DOM和Fancybox之间的交互冲突

特别奇怪的是,只有快速滑动之后才会触发这个问题,正常速度操作的话完全没问题。有没有大佬能给点排查思路或者解决方案呀?

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 08:22:58