几天由于要实现一个16:9多屏显示播放页面,同时支持全屏显示以及动态设备选择功能。

前端技术框架layui。

接下来介绍实现过程:

1.16:9屏幕布局实现

HTML

<div class="box">
  <div class="scale">
    <img src="http://img17.3lian.com/201612/16/88dc7fcc74be4e24f1e0bacbd8bef48d.jpg" class="item"/>
  </div>
</div>

CSS

.box {
  width: 80%;
}

.scale {
  width: 100%;
  padding-bottom: 56.25%;
  height: 0;
  position: relative;
}

.item {
  width: 100%;
  height: 100%;
  background-color: aquamarine;
  position: absolute;
}

实现效果:

android 多屏播放相同画面 多屏幕播放_android 多屏播放相同画面

 

 参考地址:

 技术总结:

1)该方式基于padding-bottom: 56.25%;height: 0;实现

2)父级元素中设置position:relative;子元素中设置position:absolute;这样子元素中可以获取到正常的height值,有利于子元素中添加新样式时设置高度问题

2、指定元素全屏实现方案

 直接上代码,同时处理了兼容性:

//  做个全屏的构造函数
    var FullScreen = function(elem){
        this.elem = document.querySelector(elem);
    }
    //  全屏
    FullScreen.prototype.in = function() {
        if (this.elem.requestFullscreen) {
            this.elem.requestFullscreen();
        } else if (this.elem.webkitRequestFullscreen) {
            this.elem.webkitRequestFullscreen();
        } else if (this.elem.mozRequestFullScreen) {
            this.elem.mozRequestFullScreen();
        } else if (this.elem.msRequestFullscreen) {
            //  IE的实现没有实测过,不过据网上的资料说IE11以下可实现的
            this.elem.msRequestFullscreen();
        }
    }
    //  退出全屏
    FullScreen.prototype.out = function() {
        if (document.exitFullscreen) {
            document.exitFullscreen();
        } else if (document.webkitExitFullscreen) {
            document.webkitExitFullscreen();
        } else if (document.mozCancelFullScreen) {
            document.mozCancelFullScreen();
        } else if (document.msExitFullscreen) {
            document.msExitFullscreen();
        }
    }

 

使用:

 初始化时传入要全屏的元素即可

var fullScreen = new FullScreen("#screen");
//  全屏
fullScreen.in();//  退出fullScreen.out();

//为了保证选择框进入或者退出时位置不变化,需要添加全屏事件的监听/**
    * 监听是否进入或者推送全屏操作
    */
document.addEventListener("fullscreenchange", function (e) {
    if (document.fullscreenElement) {
        console.log('进入全屏');
        var alertPage = $(".layui-layer-page");
        alertPage.appendTo("#screen");
    } else {
        console.log('退出全屏');
        var alertPage = $(".layui-layer-page");
        alertPage.appendTo("body");
    }
});

 接下来我们使用layui中弹出层,可以根据显示的屏幕动态选择摄像头,效果如下:

android 多屏播放相同画面 多屏幕播放_android 多屏播放相同画面_02

 

 

 

 

貌似效果实现,可当我们在全屏下进行操作的时,弹出框显示已经弹出,但是不能显示。

3、完美适配解决方案

此时我们分析问题,我们看layui弹出层实现的机制:

我们参考下基于iframe中弹出层解决遮罩层覆盖到全屏方案:

参考:https://www.pianshen.com/article/92951324452/

因为layui官网说  如果弹层的内容content是某个DOM元素的话,要放在body的根节点下。不能放在div里面了。

android 多屏播放相同画面 多屏幕播放_弹出层_03

 所以如果不在body根目录下的话会导致遮罩遮挡全屏,因为最后生成的遮罩DOM元素的位置是body的子级,所以知道弹层的DOM要和遮罩的DOM 要在同一层。
如图:

 

android 多屏播放相同画面 多屏幕播放_解决方案_04

 

 

 所以这里再弹层的success的事件里面进行了处理,将遮罩的DOM位置挪动了一下,和弹层DOM元素同一级,代码如下:

android 多屏播放相同画面 多屏幕播放_android 多屏播放相同画面_05

 

 

 给弹框定义名称,关闭时可使用layer.close(弹框变量名)。

以上是解决方案,全屏的时候是不是也是类似问题呢?

我通过检索发现:vue页面或者网页全屏后,modal 弹框或者下拉框无法显示的问题,这篇文章介绍,参考:

其实无论layui还是bootstrap中model,都是基于父级显示的,默认情况下layui弹出层是基于body左右参考元素的,那么我们现在的解决方案就是在弹出层success成功后,

设置

layer.open({
    type: 1,
    title: '开通产品数量',
    area: ['700px', '600px'], //宽高
    shade: 0,
    shadeClose:false,
    anim: 3,
    zIndex:9999999999999999999,
    content: "#openProductBox",
    success: function() {
        var alertPage = $(".layui-layer-page");
        alertPage.appendTo("#screen");        //全屏模式下设置弹出层的父级参考标准
    }
});

此时完整效果如下:

android 多屏播放相同画面 多屏幕播放_弹出层_06

 

 至此问题得到解决。