关于微信H5页面的图片和视频全屏问题

项目需求

  1. 图片或者视频在页面中居中显示(边框圆角)
  2. 点击图片或者视频时,全屏显示/播放

看起来是很简单吧,但是移动端、微信内置的QQ垃圾浏览器组合起来,事情就没有那么简单了。。。还是先说简单的吧。

图片全屏

img标签上不绑定任何事件时,在安卓机上点击可以全屏显示,再次点击退出全屏,简直是perfect。完全符合需求,但是!!!
在IOS的部分机型上,点击伪全屏显示(微信顶部Bar有占位),再次点击没有反应。还有一些IOS机型是点击完全没有反应。好吧,没法偷懒了。

由于有顶部Bar的存在,无法完全全屏实现(目前没有发现可行方法)。降级为可视区域内全屏显示。

实现思路
  1. 首先获取到手机可视区域的宽。
var width = document.documentElement.clientWidth;
  1. 设置一个modal层,包含要显示图片,占满全屏,浮在最上层。
  2. 页面刚开始加载进入的时候,隐藏modal层。只显示居中的图片。
  3. 当点击居中的图片时,显示modal层,点击modal层时,隐藏modal。

视频全屏播放

QQ垃圾浏览器video标签安卓机上面非常丑陋,视频播放完会自动加入推荐视频。优先级最高,浮在最顶层,不支持border-radius。
在某华为机型上不会自动全屏播放,在其他一些安卓机上全屏播放完返回页面时,会导致样式错乱,好像冒出去了似的。

QQ浏览器提供的同层播放器接入规范也并没有什么卵用。

还是给大家隆重介绍一下video.js吧。纯英文文档,对于小白的我来说,看起来还是比较费劲的。我踩过的坑希望大家都能绕过去。

使用方法

引入方法:

第一种

   <link rel="shortcut icon" type="image/ico" href="/static/favicon.ico" />
   <link href="https://vjs.zencdn.net/7.0.3/video-js.css" rel="stylesheet">

第二种

npm install video.js

初始化:

<video id="video" class="video-js"></video>
// 引入核心就在class="video-js"

或者使用js初始化,这里不再介绍
实例化对象:

var video=videojs('video');
// 对应video标签的id

video.js相关的API丰富。

参考videojs入门指南1——videojs基础使用

1. autoplay()获取或者设置自动播放属性
2. currentTime()设置或者获取当前播放进度
3. duration()获取视屏的总长度,一般要等到视屏对象完全加载后才能获取到,一般我们会使用定时轮询的方式来获取总时长
4. ended()获取当前视屏对象是否已经处于结束状态
5. enterFullWindow() 当全屏不支持我们可以视频容器延伸到浏览器将让我们一样宽。经过试验改api完全无法使视屏进入全屏。分析源码后发现真正进入全屏的api应该是requestFullscreen(),但可惜该api只能又手势触发函数执行,连模拟点击都没法触发他。
// requestFullscreen()这个我的库中没有这个API? 因此我用的isFullscreen。
6. exitFullscreen() 退出全屏,有效的
7. exitFullWindow() 退出全屏,试了没什么用
8. height() 设置/获取播放器的高度
9. width() 设置/获取播放器的宽度
10. isFullscreen() 检查是否处于全屏模式
11. load() 开始加载视屏
12. loop() 在视频中获取或设置循环属性元素
13. muted() 获取当前的静音状态
14. pause() 暂停视频
15. paused() 检查视屏是否暂停
16. play() 播放视屏
17. played() 检查视屏播放状态
18. preload() 获取或设置预加载属性
19. ready() 视屏对象加载完成后调用ready中的回调函数
20. poster() 获取或设置海报图像源url
21. reset() 重载视屏
22. src() 更换视频源

事件监听方法:

video.on('ended', function() {
    //
  });
需求实现思路

video.js解决了微信安卓端视频播放完毕样式混乱,但是依然无法实现四周圆角。只能做绕过处理。进入页面显示视频的首帧图和播放键,让其看起来像是视频的样子。然后点击后,真正的视频标签全屏播放。这样变向的实现圆角。

<div class="share-video" >
    <img class="poster" src="{{videoPoster}}" on-click="changePlay">
    <img src="{{icon}}" class="pausePlay {{isPlay?'hidden':''}}" on-click="changePlay"/>
    <video id="video" class="video-js" style="width:0px;height:0px;">
    </video>
 </div> 
// SAN框架组件
// 组件attached生命周期函数中执行
// res为ajax请求返回的数据,包含视频和首帧图的url
videoInit(res) {
    this.data.set('videoPoster', res.data.image);
    const video = videojs('video', {
        sources: [{
            src: res.data.video
        }]
    });
    // 视频初始化时,设置宽高为0,隐藏
    video.ready(() => {
        video.width('0px');
        video.height('0px');
    });
    video.isFullscreen(true);// 设置要全屏播放。
    video.on('ended', () => {
        video.exitFullscreen();//退出全屏
        video.width('0px');
        video.height('0px');
        this.showIcon();//显示播放键
    });
    video.on('pause', this.showIcon.bind(this));
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,025评论 3 119
  • 毕业前,收到太多谢意, 像收到季节的果实, 像收到旅行的船票。 从你们嘴里说出, 感谢母校,感谢老师, 绝不客套的...
    玉藕阅读 276评论 0 4
  • 画主先画了房子,然后是草地,树,吊床,吊床上的是画主二宝,旁边是画主自己,本来想画面对孩子的,但不知道分析图能不能...
    何呵_d71d阅读 433评论 1 1
  • 蒋先生是个孤儿,不孤独的孤儿。 米小姐是个知了,叽叽喳喳的知了。 蒋先生只知道自己姓蒋,除此以外没有任何关于亲生父...
    苏景先生爱吃鱼阅读 306评论 1 0
  • 情刀 作者:屿上日光 爱是箭 情是刀 箭射中的是 一点伤心 刀劈中了是 一道伤口 一箭穿心 一刀入...
    屿上日光阅读 237评论 0 0