uni-app之實(shí)現(xiàn)層級(jí)覆蓋(app端覆蓋原生組件)的問題

  1. 具體問題:拓展組件uni-popup無法正常覆蓋video組件
  2. 問題描述:在APP端蜜笤,如果頁(yè)面中使用了video組件美尸,則拓展組件uni-popup(里面包括一個(gè)view組件壹店,view下是個(gè)image組件)不能正常覆蓋原生組件video。
    示例:主要有一個(gè)video原生組件鳖昌、一個(gè)image原生組件和一個(gè)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端是客戶端創(chuàng)建的原生組件,它的層級(jí)是最高的低飒,高于普通前端組件许昨,不能通過 z-index 控制層級(jí)∪焐蓿可使用 cover-viewcover-image覆蓋在上面车要,也可通過plus.nativeObj.view或原生子窗體subNVue等方式來實(shí)現(xiàn)。
  • App端 cover-view崭倘、cover-image 中不支持嵌套其它組件翼岁。
  • App端暫不支持 cover-view类垫、cover-image 組件之間的嵌套。
  • App端cover-view可覆蓋的原生組件有限制琅坡,目前僅包括:video悉患、map
  • App端還可以使用更強(qiáng)大的plus.nativeObj.view繪制原生內(nèi)容,參考:uni-app中使用5+界面控件榆俺、plus.nativeObj.view規(guī)范
  • App端還提供了更靈活和強(qiáng)大的subNvue售躁,比cover-view和plus.nativeObj.view都更強(qiáng)大,參考原生子窗體subNvue
  • 其他小程序平臺(tái)下茴晋,可以使用條件編譯陪捷,完全按照其規(guī)范開發(fā)。
  • 在 video 組件中使用時(shí)诺擅,不支持在全屏模式下使用cover-view市袖。
  • 支付寶小程序中 cover-view 不支持嵌套。

拓展:微信基礎(chǔ)庫(kù) 2.4.0 起已支持 video 組件的同層渲染烁涌,也就是video在非全屏?xí)r苍碟,可以被前端元素通過調(diào)節(jié)z-index來遮擋,但video全屏?xí)r撮执,仍需要cover-view覆蓋微峰。
(1) 使用cover-image替代uni-popup:一方面程序報(bào)錯(cuò),一方面也不符合操作需求抒钱,棄用

<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端報(bào)錯(cuò).png

(2) 使用plus.nativeObj.view:雖然更靈活蜓肆,但易用性比較差、沒有動(dòng)畫谋币、不支持內(nèi)部?jī)?nèi)容滾動(dòng)
(3) 原生子窗體subNvue
說明:subNVues 是 vue 頁(yè)面的原生子窗體仗扬。用于解決 vue 頁(yè)面中的層級(jí)覆蓋和原生界面靈活自定義用的。它不是全屏頁(yè)面瑞信,也不是組件,就是一個(gè)原生子窗體穴豫。它是一個(gè) nvue 頁(yè)面凡简,使用 weex 引擎渲染,提供了比 cover-view精肃、plus.nativeObj.view 更強(qiáng)大的原生排版能力秤涩,方便自定義原生導(dǎo)航或覆蓋原生地圖、視頻等司抱。
注意:原生子窗體subNvue替代了原生增強(qiáng)提示框插件筐眷,避免原生插件麻煩的打包流程。

  • pages.json
,{
            "path" : "pages/ipms/miaoyou/home/home",
            "style" : {
                "app-plus": {  
                    "titleNView": false,  //不啟用系統(tǒng)導(dǎo)航
                    "subNVues":[{  
                        "id": "popup", // 唯一標(biāo)識(shí)  
                        "path": "pages/ipms/miaoyou/home/subNVue/popup", // 頁(yè)面路徑  
                        "type": "popup",  //原生子窗口內(nèi)置樣式习柠,可取值:'popup',彈出層匀谣;"navigationBar",導(dǎo)航欄
                        "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>

可能遇到的問題

  • 獲取到原生子窗體實(shí)例為null:查看id是否匹配正確
  • 實(shí)例方法未定義:編譯模式查看是否為自定義編譯模式


    app端最終效果.png

參考原生組件說明

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末照棋,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子武翎,更是在濱河造成了極大的恐慌烈炭,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宝恶,死亡現(xiàn)場(chǎng)離奇詭異符隙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)垫毙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門霹疫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人综芥,你說我怎么就攤上這事丽蝎。” “怎么了毫痕?”我有些...
    開封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵征峦,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我消请,道長(zhǎng)栏笆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任臊泰,我火速辦了婚禮蛉加,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缸逃。我一直安慰自己针饥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開白布需频。 她就那樣靜靜地躺著丁眼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪昭殉。 梳的紋絲不亂的頭發(fā)上苞七,一...
    開封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音挪丢,去河邊找鬼蹂风。 笑死,一個(gè)胖子當(dāng)著我的面吹牛乾蓬,可吹牛的內(nèi)容都是我干的惠啄。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼撵渡!你這毒婦竟也來了融柬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤姥闭,失蹤者是張志新(化名)和其女友劉穎丹鸿,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棚品,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡靠欢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了铜跑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片门怪。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖锅纺,靈堂內(nèi)的尸體忽然破棺而出掷空,到底是詐尸還是另有隱情,我是刑警寧澤囤锉,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布坦弟,位于F島的核電站,受9級(jí)特大地震影響官地,放射性物質(zhì)發(fā)生泄漏酿傍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一驱入、第九天 我趴在偏房一處隱蔽的房頂上張望赤炒。 院中可真熱鬧,春花似錦亏较、人聲如沸莺褒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)遵岩。三九已至,卻和暖如春巡通,著一層夾襖步出監(jiān)牢的瞬間尘执,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工扁达, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留正卧,地道東北人蠢熄。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓跪解,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子叉讥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容