移動端瀏覽器中的video元素是比較特別的,早期不管是在iOS仍是Android的瀏覽器中,它都位於頁面的最頂層,沒法被遮蓋。後來這個問題在iOS下獲得瞭解決,可是Android的瀏覽器則問題依舊。X5是騰訊基於Webkit開發的渲染引擎,它提供了一種名叫「同層播放器」的特殊video元素以解決遮蓋問題。javascript
同層播放器的使用方式跟普通的video元素差異不大,只是須要加上兩個X5的自定義屬性:「x5-video-player-type」和「x5-video-player-fullscreen」。css
下面作一個測試頁面嵌入同層播放器:html
body {
margin: 0;
background: #000;
font-size: 0.3rem;
}
.player {
width: 100%;
height: 4.22rem;
}
.player .video {
width: 100%;
height: 100%;
}
複製代碼
<video id="video" class="video" controls="controls" playsinline x5-video-player-type="h5" x5-video-player-fullscreen="true">
<source src="video.mp4" />
</video>
複製代碼
點擊播放後,video元素佔全屏,視頻部分默認居中顯示:
前端
按照官方文檔所述,只要修改video元素的「object-position」屬性,就能夠修改視頻部分的顯示位置,但實際上還要把video元素的寬高設成屏幕的寬高才行:java
.fullscreen .video {
object-position: center top;
}
複製代碼
var player = document.getElementById('video');
player.addEventListener('x5videoenterfullscreen', function() {
// 設爲屏幕尺寸
player.style.width = window.screen.width + 'px';
player.style.height = window.screen.height + 'px';
// 在body上添加樣式類以控制全屏下的展現
document.body.classList.add('fullscreen');
});
player.addEventListener('x5videoexitfullscreen', function() {
player.style.width = player.style.height = '';
document.body.classList.remove('fullscreen');
}, false);
複製代碼
效果以下(右圖):
瀏覽器
注意把video元素的高設爲屏幕高度時,要用「window.screen.height」而不能用「document.documentElement.clientHeight」,由於後者不包含導航欄高度,將會致使沒法滿屏(如上方左圖所示)。
微信
下面加上標題欄:ide
.header {
width: 100%;
height: 1.14rem;
line-height: 1.14rem;
background: #fff;
font-size: 0.36rem;
text-align: center;
color: #000;
}
複製代碼
<header id="header" class="header">標題欄</header>
<div class="player">
<video id="video" class="video" controls="controls" playsinline x5-video-player-type="h5" x5-video-player-fullscreen="true">
<source src="video.mp4" />
</video>
</div>
複製代碼
然而,點擊播放進入全屏狀態後,標題欄就消失不見了。既然同層播放器是能夠被遮蓋的,那就試試絕對定位吧:
佈局
.fullscreen .header {
position: absolute;
top: 0;
left: 0;
z-index: 9999;
}
複製代碼
標題欄確實遮擋住視頻了,可是就多了一層黑色的漸變以及左右兩個按鈕(下方左圖)。據官方文檔所述,這些都是沒法移除的。
測試
接下來要作的是把視頻下移,使總體UI與進入全屏前保持一致(上方右圖):
.fullscreen .player .video {
object-position: center 1.14rem;
}
複製代碼
下一步是在video元素後面添加其餘內容:
.main {
height: 5rem;
background: #fff;
}
.main .inner {
padding: 0.3rem;
}
複製代碼
<header id="header" class="header">標題欄</header>
<div class="player">
<video id="video" class="video" controls="controls" playsinline x5-video-player-type="h5" x5-video-player-fullscreen="true">
<source src="video.mp4" />
</video>
</div>
<div id="main" class="main">
<div class="inner">這裏是其餘內容</div>
</div>
複製代碼
然而,進入全屏狀態後,內容元素向上偏移了(下方左圖)。
明顯地,該元素的位置也要下移標題欄的高度:
.fullscreen .main {
margin-top: 1.14rem;
}
複製代碼
接下來嘗試簡單的點擊事件響應:
var main = document.getElementById('main');
main.addEventListener('click', function() {
this.querySelector('.inner').innerHTML = Date.now();
}, false);
複製代碼
此時進入全屏狀態後點擊內容元素是沒有任何反應的,由於video元素佔滿屏,而它的層級偏高,把內容元素擋住了。知道問題以後,解決方案也很簡單,只要把main元素的層級調高就行了:
.fullscreen .main {
position: relative;
}
複製代碼
由於同層播放器的全屏狀態只能指定一個方向(默認爲豎屏),因此播放後仍是會強制豎屏。此時總體效果都不太對勁:
由於橫屏狀態的寬高與豎屏狀態下的恰好相反,因此才致使恢復豎屏時的UI異常。所以,進入全屏時要判斷一下寬高,若是寬大於高,則將其交換:
player.addEventListener('x5videoenterfullscreen', function() {
var width = window.screen.width;
var height = window.screen.height;
if (width > height) {
width = [height, height = width][0];
}
player.style.width = width + 'px';
player.style.height = height + 'px';
document.body.classList.add('fullscreen');
}, false);
複製代碼
若是播放前頁面有滾動條,進入全屏狀態下能夠滾動嗎?答案是確實能夠滾動,可是與其叫滾動,不如叫抖動,具體效果能夠本身嘗試。總之進入全屏狀態後就不要用頁面的滾動了,而是用局部滾動。此外還應注意,由於調高了層級,若是內容元素過高,就會擋住視頻的控制條。
最後一個問題是,播放某些格式的視頻時,進度條會出現錯亂,即便返回非全屏模式時也仍是錯亂。
本文也發佈在做者我的博客:X5同層播放器試用報告 | 前端開發 | Heero's Blog