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 |
9 回复
swiper性能不行吧
回复 小新的狗叫小白: 老哥,问题解决了吗?怎么解决的,能告诉我一下吗?感激不尽
回复 七寸夜话:过去太久了,好像是在滑动的时候添加数据导致有一个cell没有高度
回复 小新的狗叫小白: 老哥,能具体说说吗?
vue下不行 nvue问题不大的
仅作参考哈,之前我写过vue的 编译成小程序和app了 数据量也不小 顺畅度还行
回复 小枫叶: 试了下nvue中swiper滑动特别不灵敏
在使用 uni-app
开发短视频整屏滑动功能时,如果出现滑动卡在中间的情况,通常是由于以下几个原因导致的。以下是一些可能的解决方案:
1. 优化 scroll-view
的配置
scroll-view
的scroll-y
属性:确保scroll-view
的scroll-y
属性设置为true
,以启用垂直滚动。scroll-view
的scroll-with-animation
属性:设置为true
,可以让滚动过程更加平滑。scroll-view
的scroll-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>