最简路径是swiper+vertical="true",但真机卡顿、黑屏、自动播放失败、内存暴涨的根源在于默认渲染和事件模型无法支撑抖音式视频流,核心矛盾在于加载、播放、暂停、销毁的时机控制。

直接用 swiper + vertical="true" 是最简路径,但真机上卡顿、黑屏、自动播放失败、内存暴涨——不是配置漏了,而是默认渲染和事件模型根本扛不住抖音式视频流。核心矛盾不在“怎么滑”,而在“什么时候加载、播放、暂停、销毁”。
swiper 的 @change 不是实时滚动回调,别在它里面直接操作 video
很多人把 @change 当成滚动过程中的帧回调,结果 this.$refs.video.play() 总报错或无效。它只在滑动完全停止、页面对齐后才触发,此时 DOM 可能还没渲染完。
- 必须包一层
this.$nextTick再操作 video 实例,否则找不到元素或play()被拒绝 - iOS 上
current有微小延迟,别拿它算进度条或同步动画;安卓/H5 响应及时,但快速连滑时可能合并触发 - 如果动态追加视频(如下拉加载),更新
videoList后必须手动重置currentIndex,否则越界或卡死在空白页 - 慎用
circular="true":短视频流通常不循环,开启后容易导致索引错乱、预加载逻辑失效
video 自动播放失败的硬解法(尤其 iOS H5 和微信小程序)
iOS Safari 和微信 WebView 对带声视频的自动播放有强限制:没用户手势前,autoplay="true" + muted="false" 必然失败,表现就是“有声无画”或纯黑屏。
抖音/快手短视频全栈专家。提供内容策划、脚本撰写、爆款拆解、算法运营、带货策略服务。适用于:创作短视频脚本、制定内容选题、分析爆款视频、制定平台运营策略、撰写带货话术、设计标题封面、理解算法逻辑。服务对象:短视频创作者、自媒体运营、品牌方、MCN机构。
- 首屏视频必须设
:muted="true"+:autoplay="true",让画面先出来 - 监听
@loadedmetadata或@canplay,就绪后立刻调videoContext.mute(false)尝试开声(部分机型仍需用户点一下屏幕) - 所有
video标签必须加playsinline、webkit-playsinline、x5-playsinline,否则 iOS 微信里强制全屏 - H5 端首次加载后,必须等用户触发一次
touchstart,后续play()才真正可用;可加半透明“点击播放”浮层兜底
内存爆炸和卡顿的根源:全量渲染 video 标签
一次性把 100 条视频塞进 swiper-item,等于让浏览器同时解码 100 个视频首帧。iOS Safari 直接卡死,小程序白屏,App 端内存飙升到 500MB+。
- 只保留
current - 2到current + 2共 5 个swiper-item,其余用v-if="false"彻底移除 DOM - 每个
video加preload="none",首次进入可视区再调.load();滑出视口 500ms 后执行pause()+src = ''+load()释放资源 - 小程序中慎用
autoplay:设为false,等@loadedmetadata触发后再play(),避免并发加载阻塞主线程 - 不要用
scroll-view包video:它会截断原生 video 的手势事件,iOS/微信里滑动手势直接失灵
平台差异必须显式处理,不能靠“一套代码跑三端”
uni-app 的 video 组件底层映射到各端原生能力,行为不一致是常态,硬套会踩坑:
- 微信小程序:
object-fit: cover不生效,必须用width: 100%; height: 100%; object-fit: cover !important; - 抖音小程序:不能用
uni.createVideoContext,必须用组件ref+this.$refs.video.play() - App 端(nvue):必须用原生
video组件,支持gestureConfig和完整 touch 事件捕获;show-center-play-btn="false"关闭干扰 UI - H5 端:某些安卓 WebView 把地址栏高度算进
100vh,导致底部留白;建议用height: calc(100vh - var(--status-bar-height, 0px))动态适配
真正难的从来不是滑动本身,而是那几个边界点:滑出视口多久该 pause、preload="none" 后第一次 load() 的时机、iOS 用户未点屏时 fallback 播放按钮的显示策略——这些细节稍有偏差,用户划着划着就卡住或黑屏了。










