uniapp手机端video标签层级过高问题

当我们想以视频作为背景时,其他dom通过定位显示在视频上方,h5页面上调试发现可以正常使用,效果如下:

当放在手机上看,会发现,仅仅剩一个视频,本应在视频上层的元素不见了。

经过一番排查,发现是video的层级相当高,而尝试改改zIndex的方法均失效了。因此针对这种特殊情况,总结了一下几种方法可供尝试:

start 👇

方法1(官网标签):

用uniapp官方提供的cover-view、cover-image标签实现效果:

html 复制代码
<view class="outter">
	<video src="../../static/超小视频.mp4" :autoplay="true" :loop="true" :muted="true" :controls="false" style="width: 100vw; height: 100vw">
		<cover-view class="video_menu">
			<cover-view>hello video</cover-view>
			<cover-view style="margin-top: 50rpx;" class="button">hi</cover-view>
		</cover-view>
	</video>
</view>
css 复制代码
.button {
	width: calc(100% - 60rpx);
	text-align: center;
	background-color: #fff;
	padding: 10rpx 20rpx;
	color: #000;
	border-radius: 8rpx;
}

效果:

方法1局限性:只能使用cover-view与cover-image标签,不适用于复杂的页面结构。

方法2(subNVue):

使用subNVue 原生子窗体解决该问题:

官方参考:uni-app subNVue 原生子窗体开发指南 - DCloud问答

1.在当前页面的同级创建subNVue目录,目录中添加nvue文件,用于书写视频上层的内容

2.在pages.json文件中的页面(本例子中的页面名是video)的style中对subNVue进行注册,参考如下,注意id要唯一,后面要使用:

javascript 复制代码
{
	"path": "pages/video/video",
	"style": {
		"navigationBarTitleText": "uni-app",
		"app-plus": {  
			"subNVues":[{  
				"id": "myMenu", // 唯一标识  
				"path": "pages/video/subNVue/myMenu", // 页面路径  
				"style": {  
					"position": "absolute",  
					"dock": "right",  
					"width": "500rpx",  
					"height": "300rpx",
					"left": "120rpx",
					"top": "500rpx", 
					"background": "transparent"
				}  
			}]  
		} 
	}
}

3.在创建的nvue文件中,书写要展示的内容,并在钩子函数中调用展示的方法。

myMenu.nvue内容参考如下:

javascript 复制代码
<template>
	<view class="video_menu">
		<!-- 字体颜色nvue中无法继承,需要单独写一下 -->
		<text class="video_text">hello video</text>
		<button style="margin-top: 50rpx;" class="button">hi</button>
	</view>
</template>
<script>
	export default {
		onReady() {
			const subNVue = uni.getSubNVueById('myMenu');
			subNVue.show('slide-in-left', 300, function(){  
				// 可在打开后进行一些操作...  
				//   
			});  
		}
	}
</script>
<style>
	.video_menu {
		background-color: rgba(0, 0, 0, 0.5);
		font-size: 32rpx;
		font-weight: 600;
		padding: 30rpx;
	}
	.video_text {
		color: #ffffff;
	}
</style>

4.进行好以上操作,无需在video.vue中做任何操作,该subNVue弹窗便可超过在页面中展示出来,效果同上。

方法3(原生画布):

plus.nativeObj.View()原生画布:

(ps:这种方法不适用于pc端,因此需要手机进行调试,pc端会报 ReferenceError: plus is not defined)

此方法貌似适用于无交互的图形、文字、图片展示;相对较为局限。

这里tag对应的font为字体,img为图片,rect为矩形。

详细相关配置项可参考:HTML5+ API Reference

javascript 复制代码
onLoad() {
	this.view = new plus.nativeObj.View(
		'video_menu',
		{
			top: '120px', // 下面均可用变量控制
			left: '20px',
			width: '320px',
			height: '200px',
			backgroundColor: 'rgba(0, 0, 0, 0.5)',
			padding: '30px'
		},
		[
			{
				tag: 'font',
				text: 'hello video',
				position:{
					top:'30px',
					left:'30px',
					height:'50px',
				},
				textStyles: {
					color: '#fff',
					size: '32px',
					align: 'left'
				}
			},
			{
				tag:'rect',
				color:'#fff',
				position:{
					top:'100px',
					left:'30px',
					width:'80%',
					height:'50px',
				},
			},
			{
				tag: 'font',
				text: 'hi',
				position:{
					top:'100px',
					left:'50px',
					width:'90%',
					height:'50px',
				},
				textStyles: {
					color: '#000',
					size: '32px',
					align: 'left'
				}
			},
		]
	);
	setTimeout(() => {
		this.view.show();
	}, 300);
	this.view.addEventListener(
		'click',
		e => {
			this.view.hide();
		},
		false
	);
}

效果:

方法4(三方库):

最简单粗暴的方法,使用现有的第三方库dom-video-player

链接:video-player 视频播放器 html5视频播放器-解决频层级、覆盖 - DCloud 插件市场

1.下载并引入

javascript 复制代码
import DomVideoPlayer from '@/components/DomVideoPlayer/DomVideoPlayer';

// 。。。

export default {
	components: {
		DomVideoPlayer
	},

// 。。。

2.使用DomVideoPlayer,下方为参考:

html 复制代码
<template>
	<view class="outter">
		<!-- #ifdef H5 -->
			<video src="https://www.runoob.com/try/demo_source/mov_bbb.mp4" :autoplay="true" :loop="true" :muted="true" :controls="false" style="width: 100vw; height: 100vw"></video>
		<!-- #endif -->
		<!-- #ifndef H5 -->
			<DomVideoPlayer 
				src="https://www.runoob.com/try/demo_source/mov_bbb.mp4"
				style="width: 100vw; height: 100vw"
				:autoplay="true"
				:controls="false"
				:show-play-btn="false"
				:enable-progress-gesture="false"
				object-fit="cover"
				:muted="true"
				loop
			></DomVideoPlayer>
		<!-- #endif -->
		<view class="video_menu">
			<text>hello video</text>
			<button style="margin-top: 50rpx;">hi</button>
		</view>
	</view>
</template>

效果:

ok!

目前了解这几种方法,当然肯定还有其他方法,欢迎大家补充~

希望本文会对您有所帮助 ^_^ ~

相关推荐
ღ᭄ꦿ࿐Never say never꧂2 小时前
微信小程序 Button 组件 open-type 完全指南:从用户信息获取到客服分享的实战应用
spring boot·微信小程序·小程序·uni-app·vue3
你真的可爱呀3 小时前
uniapp学习【路由跳转 +数据请求+本地存储+常用组件】
前端·学习·uni-app
2501_915106329 小时前
iOS 26 APP 性能测试实战攻略:多工具组合辅助方案
android·macos·ios·小程序·uni-app·cocoa·iphone
00后程序员张17 小时前
iOS混淆与IPA文件加固全流程实战 防止苹果应用被反编译的工程级方案
android·ios·小程序·https·uni-app·iphone·webview
草字18 小时前
uniapp 打开横竖屏。usb调试时可以横竖屏切换,但是打包发布后却不行?
java·前端·uni-app
2501_9151063219 小时前
iOS 应用加固与苹果软件混淆指南,如何防止 IPA 被反编译与二次打包?
android·ios·小程序·https·uni-app·iphone·webview
赵庆明老师21 小时前
Uniapp微信小程序开发:全局变量的使用
微信小程序·小程序·uni-app
2501_915921431 天前
iOS 应用加固与苹果软件混淆全解析 IPA 文件防反编译、混淆加密与无源码加固策略
android·macos·ios·小程序·uni-app·cocoa·iphone
Jyywww1211 天前
uniapp uni.chooseImage+uni.uploadFile使用方法与详解
开发语言·javascript·uni-app
2501_916007471 天前
iOS 代上架实战指南,从账号管理到使用 开心上架 上传IPA的完整流程
android·macos·ios·小程序·uni-app·cocoa·iphone