几天由于要实现一个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;
}
实现效果:
参考地址:
技术总结:
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中弹出层,可以根据显示的屏幕动态选择摄像头,效果如下:
貌似效果实现,可当我们在全屏下进行操作的时,弹出框显示已经弹出,但是不能显示。
3、完美适配解决方案
此时我们分析问题,我们看layui弹出层实现的机制:
我们参考下基于iframe中弹出层解决遮罩层覆盖到全屏方案:
参考:https://www.pianshen.com/article/92951324452/
因为layui官网说 如果弹层的内容content是某个DOM元素的话,要放在body的根节点下。不能放在div里面了。
所以如果不在body根目录下的话会导致遮罩遮挡全屏,因为最后生成的遮罩DOM元素的位置是body的子级,所以知道弹层的DOM要和遮罩的DOM 要在同一层。
如图:
所以这里再弹层的success的事件里面进行了处理,将遮罩的DOM位置挪动了一下,和弹层DOM元素同一级,代码如下:
给弹框定义名称,关闭时可使用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"); //全屏模式下设置弹出层的父级参考标准
}
});
此时完整效果如下:
至此问题得到解决。