uni-app swiper sticky list 在里面的list激活状态时,swiper 无法左右滚动

uni-app swiper sticky list 在里面的list激活状态时,swiper 无法左右滚动

操作步骤:

滚动list,激活内层list滚动 swiper无法左右滚动,滚上去,激活外层list滚动,swiper可以左右滚动

预期结果:

滚动list,激活内层list滚动 swiper可以左右滚动

实际结果:

滚动list,激活内层list滚动 swiper无法左右滚动

bug描述:

swiper sticky list 在里面的list激活状态时,swiper 无法左右滚动,只有滚动到上面,激活外层list的时候,swiper才能左右滚动, 使用的是官方提供的 多页签滑动吸顶效果demo

项目信息
产品分类 uniapp/App
PC开发环境 Windows
PC开发环境版本号 windows 10
HBuilderX类型 正式
HBuilderX版本号 3.4.6
手机系统 iOS
手机系统版本号 iOS 15
手机厂商 苹果
手机机型 iphone 13
页面类型 nvue
vue版本 vue2
打包方式 云端
项目创建方式 HBuilderX

更多关于uni-app swiper sticky list 在里面的list激活状态时,swiper 无法左右滚动的实战教程也可以访问 https://www.itying.com/category-93-b0.html

8 回复

还有个问题 之前改好了的swiper list 现在用最新版hbuilderx 又出问题了,里面list没法滚,现在又在照着官方demo改,也看不出来哪里出了问题,心累啊

更多关于uni-app swiper sticky list 在里面的list激活状态时,swiper 无法左右滚动的实战教程也可以访问 https://www.itying.com/category-93-b0.html


这个不是bug吗,是新版本故意设置成这样的嘛,咋没人理我。。。

你好,没太理解是什么问题,测试了 多页签滑动吸顶效果demo 没发现有问题

多页签滑动吸顶效果demo 用3.4.6Hbuilderx运行到iOS手机,会出现,当嵌套list中里面(内层)的list滚动上去之后,swiper左右切换效果无法触发,

回复 d***@whaiw.com: 现在正式版已经是3.4.7了,升级一下使用内置基座在测试一下看看,如果还有问题请录个屏看一下是怎么操作的

回复 DCloud_iOS_XHY: 升级到3.4.7就好了,谢谢

回复 DCloud_iOS_XHY: 如果需要的话 我可以用3.4.6复现出来

uni-app 中,如果你在 swiper 组件中使用了 sticky 布局,并且在 swiper 内部的 list 组件中激活了某些状态(例如滚动、点击等),可能会导致 swiper 无法左右滚动。这是因为 sticky 布局和 swiper 的滚动事件可能会产生冲突。

解决方案

  1. 禁用 sticky 布局的滚动事件: 如果你在 sticky 布局中使用了 scroll-view 或其他可滚动的组件,可以尝试禁用这些组件的滚动事件,或者通过条件判断来控制滚动行为。

    <scroll-view :scroll-y="!isSwiperActive">
      <!-- 你的内容 -->
    </scroll-view>
    

    data 中定义 isSwiperActive,并在 swiperchange 事件中更新它:

    data() {
      return {
        isSwiperActive: false
      };
    },
    methods: {
      onSwiperChange(e) {
        this.isSwiperActive = e.detail.current !== 0; // 假设第一个页面不需要禁用滚动
      }
    }
    
  2. 使用 touch 事件手动控制 swiper 滚动: 你可以通过监听 touch 事件来手动控制 swiper 的滚动行为。例如,在 list 组件中监听 touchstarttouchend 事件,并在适当的时候阻止事件冒泡。

    <view [@touchstart](/user/touchstart)="onTouchStart" [@touchend](/user/touchend)="onTouchEnd">
      <!-- 你的列表内容 -->
    </view>
    
    methods: {
      onTouchStart(e) {
        // 记录触摸开始的位置
        this.startX = e.touches[0].clientX;
      },
      onTouchEnd(e) {
        // 计算滑动距离
        const endX = e.changedTouches[0].clientX;
        const deltaX = endX - this.startX;
    
        // 如果滑动距离大于某个阈值,则触发 swiper 滚动
        if (Math.abs(deltaX) > 50) {
          this.$refs.swiper.next(); // 或者 this.$refs.swiper.prev();
        }
      }
    }
    
  3. 调整 sticky 布局的层级: 有时候 sticky 布局的层级可能会影响 swiper 的滚动。你可以尝试调整 sticky 布局的 z-index,确保它不会覆盖 swiper 的滚动区域。

    .sticky-container {
      position: sticky;
      top: 0;
      z-index: 1; /* 调整 z-index */
    }
    
  4. 使用 swipertouch 事件: 你可以通过监听 swipertouch 事件来控制 swiper 的滚动行为。例如,在 swipertouchstart 事件中禁用 list 的滚动,在 touchend 事件中恢复。

    <swiper [@touchstart](/user/touchstart)="onSwiperTouchStart" [@touchend](/user/touchend)="onSwiperTouchEnd">
      <!-- 你的 swiper 内容 -->
    </swiper>
    
    methods: {
      onSwiperTouchStart() {
        this.isSwiperActive = true;
      },
      onSwiperTouchEnd() {
        this.isSwiperActive = false;
      }
    }
回到顶部