uni-app之实现层级覆盖(app端覆盖原生组件)的问题

  1. 具体问题:拓展组件uni-popup无法正常覆盖video组件
  2. 问题描述:在APP端,如果页面中使用了video组件,则拓展组件uni-popup(里面包括一个view组件,view下是个image组件)不能正常覆盖原生组件video。
    示例:主要有一个video原生组件、一个image原生组件和一个uni-popup拓展组件
<template>
    <view>
        <view class="flex-sub margin-right-xs" style="height: 95%;">
            <video style="width: 100%;height: 100%;" id="myVideo" src="http://img.cdn.qiniu.dcloud.net.cn/wap2appvsnative.mp4" controls></video>
        </view>
        
        <view class="flex-sub margin-right-xs" style="align-self: center;" @tap="showBigImage">
            <image style="width: 150upx;height: 150upx;" src="https://img-cdn-qiniu.dcloud.net.cn/uniapp/images/shuijiao.jpg" mode="aspectFit"></image>
        </view>

        <uni-popup class="uni-bg-white" :show="type === 'middle'" position="middle" mode="fixed" @hidePopup="togglePopup('')">
            <view class="uni-bg-white" style="width:500upx;height:300upx;">
                <image style="width: 100%;height: 100%;" src="https://img-cdn-qiniu.dcloud.net.cn/uniapp/images/shuijiao.jpg" mode="aspectFit"></image>
            </view>
        </uni-popup>
    </view>
</template>

<script>
import uniPopup from "@/components/uni-popup/uni-popup.vue";
var _self;
export default {
    components: {
        uniPopup,
    },
    data() {
        return {
            type:"",
        }
    },
    methods: {
        showBigImage:function(){
            _self.type = "middle";
        },
        togglePopup(type) {
            _self.type = type;
        }
    },
    onLoad:function(){
        _self = this;
    }
}
</script>
<style>
.cover-img{
    position: fixed;
    z-index: 999;
    background-color: #ffffff;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    border-radius: 10upx;
    padding: 30upx;
}
</style>

h5端可正常覆盖:


h5端可正常覆盖.png

app端不能正常覆盖:


app端不能正常覆盖.png
  1. 分析:<video/> 组件在非H5端是客户端创建的原生组件,它的层级是最高的,高于普通前端组件,不能通过 z-index 控制层级。可使用 cover-viewcover-image覆盖在上面,也可通过plus.nativeObj.view或原生子窗体subNVue等方式来实现。
  • App端 cover-viewcover-image 中不支持嵌套其它组件。
  • App端暂不支持 cover-viewcover-image 组件之间的嵌套。
  • App端cover-view可覆盖的原生组件有限制,目前仅包括:videomap
  • App端还可以使用更强大的plus.nativeObj.view绘制原生内容,参考:uni-app中使用5+界面控件plus.nativeObj.view规范
  • App端还提供了更灵活和强大的subNvue,比cover-view和plus.nativeObj.view都更强大,参考原生子窗体subNvue
  • 其他小程序平台下,可以使用条件编译,完全按照其规范开发。
  • 在 video 组件中使用时,不支持在全屏模式下使用cover-view
  • 支付宝小程序中 cover-view 不支持嵌套。

拓展:微信基础库 2.4.0 起已支持 video 组件的同层渲染,也就是video在非全屏时,可以被前端元素通过调节z-index来遮挡,但video全屏时,仍需要cover-view覆盖。
(1) 使用cover-image替代uni-popup:一方面程序报错,一方面也不符合操作需求,弃用

<cover-image class="cover-img" style="width:500upx;height:300upx;" src="https://img-cdn-qiniu.dcloud.net.cn/uniapp/images/shuijiao.jpg" mode="aspectFit"></cover-image>

cover-image在app端报错.png

(2) 使用plus.nativeObj.view:虽然更灵活,但易用性比较差、没有动画、不支持内部内容滚动
(3) 原生子窗体subNvue
说明:subNVues 是 vue 页面的原生子窗体。用于解决 vue 页面中的层级覆盖和原生界面灵活自定义用的。它不是全屏页面,也不是组件,就是一个原生子窗体。它是一个 nvue 页面,使用 weex 引擎渲染,提供了比 cover-view、plus.nativeObj.view 更强大的原生排版能力,方便自定义原生导航或覆盖原生地图、视频等。
注意:原生子窗体subNvue替代了原生增强提示框插件,避免原生插件麻烦的打包流程。

  • pages.json
,{
            "path" : "pages/ipms/miaoyou/home/home",
            "style" : {
                "app-plus": {  
                    "titleNView": false,  //不启用系统导航
                    "subNVues":[{  
                        "id": "popup", // 唯一标识  
                        "path": "pages/ipms/miaoyou/home/subNVue/popup", // 页面路径  
                        "type": "popup",  //原生子窗口内置样式,可取值:'popup',弹出层;"navigationBar",导航栏
                        "style": {  
                            "margin": "auto",
                            "width": "50%",
                            "height": "400upx"  
                        }  
                    }]  
                } 
            }
            
        }
  • home.vue 部分代码
<template>
    <view class="uni-flex uni-row" style="width: 100%;height: 100%;">
        <view style="width: 50%;height: 98%;">
            <video style="width: 100%;height: 100%;" id="myVideo" src="http://img.cdn.qiniu.dcloud.net.cn/wap2appvsnative.mp4" controls></video>
        </view>
        
        <view style="width: 50%;height: 98%;" @tap="showBigImage">
            <image style="width: 100%;height: 100%;" src="https://img-cdn-qiniu.dcloud.net.cn/uniapp/images/shuijiao.jpg" mode="aspectFit"></image>
        </view>
        
        <uni-popup class="uni-bg-white" :show="type === 'middle'" position="middle" mode="fixed" @hidePopup="togglePopup('')">
            <view class="uni-bg-white" style="width:500upx;height:300upx;">
                <image style="width: 100%;height: 100%;" src="https://img-cdn-qiniu.dcloud.net.cn/uniapp/images/shuijiao.jpg" mode="aspectFit"></image>
            </view>
        </uni-popup>
    </view>
</template>

<script>
import uniPopup from "@/components/uni-popup/uni-popup.vue";
var _self;
export default {
    components: {
        uniPopup,
    },
    data() {
        return {
            type:"",
        }
    },
    methods: {

        showBigImage:function(){
            // #ifdef H5
            _self.type = "middle";
            // #endif
                
            // #ifdef APP-PLUS
            _self.showPopup();
            // #endif
            
        },
        showPopup() {
            uni.$emit('page-popup', {// 向 popup 传递消息
                imageUl: 'https://img-cdn-qiniu.dcloud.net.cn/uniapp/images/shuijiao.jpg',
                videoUrl:'http://img.cdn.qiniu.dcloud.net.cn/wap2appvsnative.mp4'
            });
            const subNVue = uni.getSubNVueById('popup');// 通过 id 获取 nvue 子窗体 
            subNVue.show('slide-in-top', 250);// 打开 nvue 子窗体
        },
        togglePopup(type) {
            _self.type = type;
        }
    },
    onLoad:function(){
        _self = this;
    }
}
</script>
<style>
.cover-img{
    position: fixed;
    z-index: 999;
    background-color: #ffffff;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    border-radius: 10upx;
    padding: 30upx;
}
</style>


  • popup.nvue
<template>
    <div style="text-align: center;vertical-align: middle;">
        <image style="vertical-align: middle;" :src="imageUl" mode="aspectFit"></image>
        <!-- <video style="vertical-align: middle;" :src="videoUrl" controls></video> -->
    </div>
</template>

<script>
export default {
    data() {
        return {
            imageUl: '',
            videoUrl:''
        }
    },
    created() {
        const vm = this;
        uni.$on('page-popup', (data) => {
            vm.imageUl = data.imageUl;
            vm.videoUrl = data.videoUrl;
        })
    },
    beforeDestroy() {
        uni.$off('page-popup')
    },
}
</script>

<style>

</style>

可能遇到的问题

  • 获取到原生子窗体实例为null:查看id是否匹配正确
  • 实例方法未定义:编译模式查看是否为自定义编译模式


    app端最终效果.png

参考原生组件说明

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,198评论 6 514
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,334评论 3 398
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,643评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,495评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,502评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,156评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,743评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,659评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,200评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,282评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,424评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,107评论 5 349
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,789评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,264评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,390评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,798评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,435评论 2 359

推荐阅读更多精彩内容