解決微信小程序視頻組件層級太高的問題

本文首發於個人我的博客: http://www.fogcrane.org

海豚圖片

前言

在微信小程序的開發中,總有一些「VIP」組件,他們的層級,高得讓人抓狂,老是凌駕於不少其餘低層級組件之上。
諸如:video組件、map組件、canvas組件等。如今就讓我來說講如何巧妙的解決掉這個問題。css

問題描述

因爲視頻組件層級太高而且沒法使用z-index進行控制層級,致使許多人都沒法在視頻組件之上放置一些其餘的組件。
爲此,一些漂亮的視頻設計每每還沒開始就宣告告終束。上一張官方文檔的相關說明:
video_regulations.jpgcanvas

解決方案

解決思路其實也挺簡單的。今天就暫且不宣揚愚公移山的精神了,咱們今天選擇繞過眼前的大山。既然視頻層級很高
很高,而且咱們不能下降視頻層級或者提高其餘組件層級已覆蓋視頻組件。那麼咱們就選擇只在恰當的時候才讓視頻
組件出如今咱們的頁面中。那麼問題就顯得簡單起來了。思路大體以下:小程序

  • 在渲染頁面的時候,使用假視頻來代替視頻組件,換言之就是使用視頻封面充當一個視頻組件。
  • 當用戶點擊視頻封面時,進行兩步操做,第一,隱藏視頻封面;第二,播放視頻。
  • 當存在同一頁面多視頻的時候,須要進行視頻切換的處理。

接下來直接上代碼了:
首先是wxml的代碼:微信小程序

<!--index.wxml-->
<view>
  <view class="margin_bottom--100" wx:for="{{items}}" wx:key="unique">
    <view class="video-container">
        <view  class="video" data-id="{{item.id}}" bindtap="videoPlay" >
          <video wx:if="{{curr_id == item.id}}" id="myVideo" style="width: 750rpx;height: calc(9 * 750rpx / 16);" id="myVideo" src="{{item.src}}"
          poster="{{item.poster}}"  objectFit="cover"  controls></video>
          <view wx:else >
              <image class="model-img" style="width: 750rpx;height: calc(9 * 750rpx / 16);" mode="aspectFill" src="{{item.poster}}"></image>
              <view class="model-btn">
                      <view class="play-icon"></view>
                </view>
          </view>
        </view>
    </view>
  </view>
  <view class="text">
    <text>我是遮擋層。</text>
  </view>
</view>

接着是js的代碼:微信

//index.js
Page({
  data: {
    curr_id: '',   //當前打開的視頻id
    items: [
      {
        id: 1, src: 'https://wxsnsdy.tc.qq.com/105/20210/snsdyvideodownload?filekey=30280201010421301f0201690402534804102ca905ce620b1241b726bc41dcff44e00204012882540400&bizid=1023&hy=SH&fileparam=302c020101042530230204136ffd93020457e3c4ff02024ef202031e8d7f02030f42400204045a320a0201000400', poster: 'http://ow74m25lk.bkt.clouddn.com/shilan.jpg'
      }, {
        id: 2, src: 'https://wxsnsdy.tc.qq.com/105/20210/snsdyvideodownload?filekey=30280201010421301f0201690402534804102ca905ce620b1241b726bc41dcff44e00204012882540400&bizid=1023&hy=SH&fileparam=302c020101042530230204136ffd93020457e3c4ff02024ef202031e8d7f02030f42400204045a320a0201000400', poster: 'http://ow74m25lk.bkt.clouddn.com/shilan.jpg'
      },
      {
        id: 3, src: 'https://wxsnsdy.tc.qq.com/105/20210/snsdyvideodownload?filekey=30280201010421301f0201690402534804102ca905ce620b1241b726bc41dcff44e00204012882540400&bizid=1023&hy=SH&fileparam=302c020101042530230204136ffd93020457e3c4ff02024ef202031e8d7f02030f42400204045a320a0201000400', poster: 'http://ow74m25lk.bkt.clouddn.com/shilan.jpg'
      },
      {
        id: 4, src: 'https://wxsnsdy.tc.qq.com/105/20210/snsdyvideodownload?filekey=30280201010421301f0201690402534804102ca905ce620b1241b726bc41dcff44e00204012882540400&bizid=1023&hy=SH&fileparam=302c020101042530230204136ffd93020457e3c4ff02024ef202031e8d7f02030f42400204045a320a0201000400', poster: 'http://ow74m25lk.bkt.clouddn.com/shilan.jpg'
      },
    ],
  },
  onReady: function () {  //建立視頻上下文對象
    this.videoContext = wx.createVideoContext('myVideo')
  },
  videoPlay(e) {
    this.setData({
      curr_id: e.currentTarget.dataset.id,
    })
    this.videoContext.play()
  }
})

最後是css的代碼:xss

/*index.wxss*/
.video{
    margin-bottom: 40rpx;
    position: relative;
}
.model-img{
    width: 100%;
    height: 420rpx;
}
.model-btn{
    position:absolute;
    left:0;
    top:0;
    bottom:0;
    right:0;
    margin:auto;
    width:100rpx;
    height:100rpx;
    border-radius:50%;
    background-color: rgba(0,0,0,.3);
}
.play-icon{
    margin:28rpx 42rpx;
    border-top:26rpx solid transparent;
    border-left:36rpx solid #fff;
    border-bottom:22rpx solid transparent;
}
.text{
  width: 100%;
  height: 100rpx;
  line-height: 100rpx;
  text-align: center;
  background-color: red;
  color: #fff;
  position: fixed;
  bottom: 0;
}

以上,就是所有代碼了,附上運行結果圖:
運行結果圖ide

代碼下載

自定義視頻組件代碼,密碼爲30s3post

結語

好看的皮囊千篇一概,有趣的靈魂萬里挑一。祝各位都是有趣的程序媛/猿。嗨起來٩(๑❛ᴗ❛๑)۶this

相關文章
相關標籤/搜索