uniapp video悬浮无法滚动:原生组件层级问题与解决方案
本文分析uniapp中video标签在原生App端悬浮无法随页面滚动的问题。指出原因是video作为原生组件层级高于前端组件。提供三种解决方案:使用cover-view、plus.nativeObj.view以及subNVue原生子窗体,并给出利用iframe封装组件的最终可行方案。
背景:
在uniapp开发中,通常使用<video></video>标签来播放动态src的视频资源。
1.在开发调试阶段,通过HBuilderX运行到浏览器时,video标签显示正常;
2.然而,当使用HBuilderX发行并云打包生成.apk后缀的原生App后,视频播放出现异常。
问题截图:

问题描述:在App端,视频画面固定在屏幕上,不会随着页面滚动而移动。
问题分析:
1.检查<video>标签的属性设置是否有误;
2.尝试为video标签添加CSS样式,排查是否为样式导致的问题;
3.查阅uniapp框架文档。既然浏览器中正常而手机端异常,需关注框架差异;
4.搜索相关技术博客,寻找解决方案。
一、video标签
官网:点击跳转官网

1.基本用法属性:
id: 给视频标签一个唯一的 ID。class: 用于样式控制。src: 视频的 URL,可以是本地路径或者网络地址。controls: 显示默认的视频控件。autoplay: 自动播放视频。loop: 循环播放视频。muted: 静音播放视频
2.事件监听
@start: 监听视频播放事件。@pause: 监听视频暂停事件。@finish: 监听视频播放结束事件。
备注:浏览uniapp框架下的video标签,发现没有属性能够控制其保持在电子屏幕不动。、
进一步说明这个是手机端才有的Bug
二、video标签的css样式
在某些情况下,视频可能会被固定在屏幕上,而不是随着页面滚动。这可能是由于视频元素的层级或样式问题。可以尝试以下方法:
确保视频的样式设置正确,使其能够随着页面滚动。
<template>
<view class="container">
<video
id="myVideo"
class="video"
src="/static/videos/your-video.mp4"
controls
autoplay
loop
muted
preload="auto"
x5-video-player-type="h5"
x5-video-player-fullscreen="true"
x5-playsinline
playsinline
webkit-playsinline
></video>
</view>
</template>
<style>
.container {
width: 100%;
height: 300px;
background-color: #f0f0f0;
overflow: hidden; /* 确保容器能够滚动 */
}
.video {
width: 100%;
height: 100%;
object-fit: cover;
position: relative; /* 确保视频能够随页面滚动 */
}
</style>在某些设备上,硬件加速或渲染层可能导致视频渲染问题。可以尝试禁用硬件加速或调整渲染层设置:
<template>
<view class="container">
<video
id="myVideo"
class="video"
src="/static/videos/your-video.mp4"
controls
autoplay
loop
muted
preload="auto"
x5-video-player-type="h5"
x5-video-player-fullscreen="true"
x5-playsinline
playsinline
webkit-playsinline
></video>
</view>
</template>
<style>
.container {
width: 100%;
height: 300px;
background-color: #f0f0f0;
overflow: hidden; /* 确保容器能够滚动 */
}
.video {
width: 100%;
height: 100%;
object-fit: cover;
position: relative; /* 确保视频能够随页面滚动 */
will-change: transform; /* 提示浏览器优化渲染 */
transform: translateZ(0); /* 强制开启 GPU 加速 */
}
</style>备注:
我使用了对应的css样式,但是问题没有解决。
三、uniapp框架下的video标签
查看了uniapp框架下的video标签,但是没有对应的属性能够解决问题。
四、vedio原生组件层级高于前端组件
意思是:
1.Video是属于原生组件的,层级是最高的,无法被其他内容所覆盖,当然也不会跟着div的overflow-y:scroll进行滑动,只会一直浮在表层,挡住其他元素。
2.部分组件如map、video、textarea、canvas通过原生控件实现,原生组件层级高于前端组件(类似flash层级高于div)。
为了能正常覆盖原生组件,设计了cover-view。
uni官网的官方文档:点击跳转官网

cover-view使用示例:
//cover-view标签得在<video>标签内部
<template>
<view>
<video style="position: relative;" src="https://haokan.baidu.com/v?pd=wisenatural&vid=18309277609015821003">
<cover-view style="width: 100px;height: 100px;background-color:
#fff;position:absolute;left: 0;">
</cover-view>
</video>
</view>
</template>
<script>
export default {
data() {
return {
}
},
methods: {
}
}
</script>
<style>
</style>cover-view使用的问题:
uni-app 原生APP 模式下 video 层级过高,页面滚动后会覆盖自定义顶部 tabbar和自定义底部菜单,很多人都只是说 cover-view 覆盖,但是cover-view必须在video里面才是有效的,cover-view 在原生app里面无法嵌套内容 。
vue页面层级覆盖解决方案: 点击跳转官网

三种方式对比:

1.cover-view
更适合在视频上边添加某些组件,比如播放按钮或者什么功能。
cover-view或者cover-image,放在video标签内使用,子绝父相
2.plus.nativeObj.view
这个是安卓的原生写法,看了很多资料,发现是能解决相当多种类的问题,但是毕竟原生语法会难一些,在时间不够的情况下很难去学好怎么使用原生语言满足当前的需求,但如果时间充足且有条件的基础下可以采用这个方法 。
plus.nativeObj.View() 绘制原生画布,有点击事件。不属于dom,可以覆盖webview和各种原生控件
plus.nativeObj.view官方文档。因为偏原生组件,较复杂,可自行选择学习
Html5产业联盟。关于video标签的相关文档
3.subNVue
subNVue是原生渲染的nvue子窗体,把一个nvue页面以半屏的方式覆盖在vue页面上
subnvue 创建原生子窗体,放在当前页面下,放好位置即可。
首先创建nvue文件。最好放入同级。
在
pages.json中,新增了subNVues节点,配置subNVue子窗体的相关属性。在
pages.json中增加完配置,也写好了subNVue子窗体,接下来就是在vue/nvue页面中使用了。
uni-app subNVue 原生子窗体开发指南

参考博客:参考博客
五、video标签一个解决办法
最后在网上参考了其他人的一份解决方案,刚好解决此问题。
封装一个组件,利用iframe实现:
//MyVideo组件
//自行封装一个组件,利用iframe实现
<template>
<iframe :onload="onloadCode" style="width:100%;height:100%;border:1px solid #fff;background: #000;"></iframe>
</template>
<script>
export default {
props: {
src: {}
},
data() {
return {
onloadCode: ''
}
},
created() {
this.onloadCode =
`this.contentWindow.document.body.innerHTML = '<video style="width: 100%;height: 100%" controls="controls" src="${this.src}"></video>';`
},
}
</script>
<style lang="scss">
</style>使用方式:
在其他页面调用注册此封装的组件,并传递视频资源src
//其它页面调用
<MyVideo :src="item.img" v-for="(item, index) in vediosData" :key="index" class="video"></MyVideo>写在最后,我们这里只是简单的在App端播放视频,且动态赋值src。如果还有其它复杂的布局内部嵌套video标签也是不成功的,例如:<swiper>、<scroll-view>等
到此这篇关于uniapp video播放视频 悬浮在屏幕无法滑动的文章就介绍到这了,更多相关uniapp video播放视频内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
JS转整数出现NaN怎么办?常见异常处理方案
2026-11-05 16:27:31
推荐几款免安装的在线JS压缩工具
2026-11-05 14:54:53
JS怎么使用JSON.stringify实现JSON格式化与缩进
2026-11-04 10:47:30
CodePen、JSFiddle 与 StackBlitz:主流 JS 在线编辑器对比
2026-11-03 21:07:49
JS字符串转数字后怎么正确判断是否为有效数值
2026-11-03 20:04:15
