uni-app 使用list嵌套video做短视频整屏滑动时,会大概率出现滑动卡在中间的情况

uni-app 使用list嵌套video做短视频整屏滑动时,会大概率出现滑动卡在中间的情况

示例代码:

<list @loadmore="pushVideoList" @scroll="scrolls" :loadmoreoffset="systemInfo.screenHeight * 3" :show-scrollbar="false" ref="listBox" class="list-box" :pagingEnabled="true" :scrollable="true">
<!-- 刷新模块 -->
<refresh class="refresh" @refresh="onrefresh" @pullingdown="onpullingdown" ref="refresh" :display="refreshing ? 'show' : 'hide'">
<text class="text">松开立即刷新</text>
<loading-indicator class="loading-indicator"></loading-indicator>
</refresh>
<cell v-for="(item, idx) in videoList" :key="item.id">
<view class="video-box" :style="{ height: height }">
<!-- 视频渲染数预加载数影响性能 -->
<video :ref="item.ref"></video>
</view>
</cell>
</list>

操作步骤:

  • 不断往下滑

预期结果:

  • 正常流程滑动

实际结果:

  • 卡在两个cell中间

bug描述:

更新Hbuildex到3.4.6.20220420版本后,使用list嵌套video做短视频整屏滑动,会大概率出现滑动卡在中间的情况出现

信息类别 信息内容
产品分类 uniapp/App
PC开发环境 Windows
PC开发环境版本 windows10
HBuilderX类型 正式
HBuilderX版本 3.4.6
手机系统 Android
手机系统版本 Android 11
手机厂商 OPPO
手机机型 oppo
页面类型 nvue
vue版本 vue2
打包方式 云端
项目创建方式 HBuilderX

App下载地址或H5网址

9 回复

你用swiper来做也可以


swiper性能不行吧

回复 小新的狗叫小白: 老哥,问题解决了吗?怎么解决的,能告诉我一下吗?感激不尽

回复 七寸夜话:过去太久了,好像是在滑动的时候添加数据导致有一个cell没有高度

回复 小新的狗叫小白: 老哥,能具体说说吗?

vue下不行 nvue问题不大的

仅作参考哈,之前我写过vue的 编译成小程序和app了 数据量也不小 顺畅度还行

回复 小枫叶: 试了下nvue中swiper滑动特别不灵敏

在使用 uni-app 开发短视频整屏滑动功能时,如果出现滑动卡在中间的情况,通常是由于以下几个原因导致的。以下是一些可能的解决方案:

1. 优化 scroll-view 的配置

  • scroll-viewscroll-y 属性:确保 scroll-viewscroll-y 属性设置为 true,以启用垂直滚动。
  • scroll-viewscroll-with-animation 属性:设置为 true,可以让滚动过程更加平滑。
  • scroll-viewscroll-top 属性:在滑动时动态更新 scroll-top 的值,确保滑动位置正确。
<scroll-view scroll-y scroll-with-animation :scroll-top="scrollTop" [@scroll](/user/scroll)="handleScroll">
  <view v-for="(item, index) in videoList" :key="index">
    <video :src="item.src" controls></video>
  </view>
</scroll-view>
export default {
  data() {
    return {
      videoList: [
        { src: 'video1.mp4' },
        { src: 'video2.mp4' },
        // ...
      ],
      scrollTop: 0
    };
  },
  methods: {
    handleScroll(e) {
      this.scrollTop = e.detail.scrollTop;
    }
  }
};

2. 使用 swiper 组件替代 scroll-view

  • swiper 组件更适合整屏滑动的场景,尤其是短视频滑动。swiper 组件本身支持整屏滑动,并且滑动效果更加流畅。
<swiper :current="currentIndex" [@change](/user/change)="handleSwiperChange" vertical>
  <swiper-item v-for="(item, index) in videoList" :key="index">
    <video :src="item.src" controls></video>
  </swiper-item>
</swiper>
export default {
  data() {
    return {
      videoList: [
        { src: 'video1.mp4' },
        { src: 'video2.mp4' },
        // ...
      ],
      currentIndex: 0
    };
  },
  methods: {
    handleSwiperChange(e) {
      this.currentIndex = e.detail.current;
    }
  }
};

3. 优化 video 组件的加载

  • 预加载视频:在滑动到下一个视频时,提前加载视频资源,避免滑动时卡顿。
  • 懒加载视频:只在视频进入可视区域时加载视频资源,减少初始加载压力。
methods: {
  handleSwiperChange(e) {
    this.currentIndex = e.detail.current;
    this.preloadNextVideo();
  },
  preloadNextVideo() {
    const nextIndex = this.currentIndex + 1;
    if (nextIndex < this.videoList.length) {
      const videoContext = uni.createVideoContext(`video${nextIndex}`);
      videoContext.play();
      videoContext.pause(); // 预加载但不播放
    }
  }
}

4. 减少页面复杂度

  • 减少不必要的 DOM 元素:确保页面中只有必要的元素,减少渲染压力。
  • 避免复杂的 CSS 动画:复杂的动画可能会导致页面卡顿,尤其是在滑动时。

5. 使用 page-meta 优化页面性能

  • 使用 page-meta 组件来优化页面的渲染性能,尤其是在处理大量视频时。
<page-meta :page-style="'overflow: hidden;'"></page-meta>
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!