[贝聊科技]X5浏览器内核同层播放器试用报告

移动端浏览器中的video元素是比较特别的,早期无论是在iOS还是Android的浏览器中,它都位于页面的最顶层,无法被遮盖。后来这个问题在iOS下得到了解决,但是Android的浏览器则问题依旧。X5是腾讯基于Webkit开发的渲染引擎,它提供了一种名叫「同层播放器」的特殊video元素以解决遮盖问题。

简单使用

同层播放器的使用方式跟普通的video元素差别不大,只是需要加上两个X5的自定义属性:「x5-video-player-type」和「x5-video-player-fullscreen」。

下面做一个测试页面嵌入同层播放器:

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元素占全屏,视频部分默认居中显示:

image.png

调整位置

按照官方文档所述,只要修改video元素的「object-position」属性,就可以修改视频部分的显示位置,但实际上还要把video元素的宽高设成屏幕的宽高才行:

.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);

效果如下(右图):

image.png

注意把video元素的高设为屏幕高度时,要用「window.screen.height」而不能用「document.documentElement.clientHeight」,因为后者不包含导航栏高度,将会导致无法满屏(如上方左图所示)。

全屏状态下的布局

下面加上标题栏:

.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;
}

标题栏确实遮挡住视频了,但是就多了一层黑色的渐变以及左右两个按钮(下方左图)。据官方文档所述,这些都是无法移除的。

image.png

接下来要做的是把视频下移,使整体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>

然而,进入全屏状态后,内容元素向上偏移了(下方左图)。

image.png

明显地,该元素的位置也要下移标题栏的高度:

.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;
}

横屏状态下进入全屏

因为同层播放器的全屏状态只能指定一个方向(默认为竖屏),所以播放后还是会强制竖屏。此时整体效果都不太对劲:

image.png

因为横屏状态的宽高与竖屏状态下的刚好相反,所以才导致恢复竖屏时的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);

其他问题

如果播放前页面有滚动条,进入全屏状态下可以滚动吗?答案是确实可以滚动,但是与其叫滚动,不如叫抖动,具体效果可以自己尝试。总之进入全屏状态后就不要用页面的滚动了,而是用局部滚动。此外还应注意,因为调高了层级,如果内容元素太高,就会挡住视频的控制条。

image.png

最后一个问题是,播放某些格式的视频时,进度条会出现错乱,即使返回非全屏模式时也还是错乱。

image.png

总结

  • 关于同层播放器的支持情况,官方文档有详细描述,最新的微信、QQ以及QQ浏览器都能支持,但是仅限Android平台
  • 虽然同层播放器可以解决遮盖video元素的问题,但这毕竟还是X5 Only的技术。如果页面要在非腾讯系的产品中打开,那就要注意处理兼容问题。
  • 同层播放器之前的元素,要用绝对定位或固定定位才能展示出来;而其后的元素,只要往下偏移(播放器元素「object-position」指定的偏移)并且提高层级,就与未播放时无异了。

本文也发布在作者个人博客:X5同层播放器试用报告 | 前端开发 | Heero's Blog

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

推荐阅读更多精彩内容

  • 关于这份调研报告,不是从技术角度深入探索,重点是从产品本身分析,通俗易懂才是重点。主要是为了锻炼平时做技术调研和竞...
    石先阅读 23,283评论 13 48
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • 人的一生总有很多本该属于你的东西但总会因为种种原因变成不是你的,你是争还是不争,那次我选择了不争,但是给我...
    鱼小只阅读 468评论 5 0
  • 前往下载 省市区 Json Mysql 数据 2017-03-31 版
    初秋夏末阅读 709评论 0 0
  • 玉簪花开 薛宇星 父亲老了, 在我家院子种了好多花。 最喜欢的, 就是那玉簪花开。 玉簪花开, 是父亲的笑...
    薛氏夜话阅读 308评论 0 4