文档章节

HTML5 全屏显示兼容方案

IamOkay
 IamOkay
发布于 2014/11/27 23:27
字数 549
阅读 30222
收藏 17

首先来说,这个标题具有误导性,但这样设置改标题也是主要因为video使用的比较多


在html5中,全屏方法可以适用于很多html标签元素,不仅仅是video


<!doctype  html>
<html>
<head>
<meta charset="utf-8" />
<title>全屏问题</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<meta http-equiv="imagetoolbar" content="no"/>
<meta name="apple-mobile-web-app-capable" content="yes"/>
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<style type="text/css">
*{
    padding: 0px;
    margin: 0px;
}

body div.videobox{
    width: 400px;
    height: 320px;
    margin: 100px auto;
    background-color:#000;
}

body div.videobox video.video
{
width: 100%;
    height: 100%;
}

:-webkit-full-screen {

}

:-moz-full-screen {

}

:-ms-fullscreen {
  
}

:-o-fullscreen {
  
}

:full-screen { 
 
}

:fullscreen {
 
}

:-webkit-full-screen video {
  width: 100%;
  height: 100%;
}
:-moz-full-screen video{
    width: 100%;
    height: 100%;
}
    </style>
</head>
<body>
 

<div id="videobox">
     
    <video controls="controls" preload="preload" id="video" poster="poster.jpg">
      <source src="./movie.ogg" type="video/ogg" />
      <source src="./movie.mp4" type="video/mp4" />
      <source src="./movie.webm" type="video/webm" />
      <object data="./movie.mp4" width="100%" height="100%">
        <embed width="100%" height="100%" src="./movie.swf" />
      </object>

    </video>
    <button id="fullScreenBtn">全屏</button>
</div>
 
 
<script type="text/javascript">
 
//反射調用
var invokeFieldOrMethod = function(element, method) 
{
   var usablePrefixMethod;
   ["webkit", "moz", "ms", "o", ""].forEach(function(prefix) {
       if (usablePrefixMethod) return;
       if (prefix === "") {
           // 无前缀,方法首字母小写
           method = method.slice(0,1).toLowerCase() + method.slice(1);   
       }
       var typePrefixMethod = typeof element[prefix + method];
       if (typePrefixMethod + "" !== "undefined") {
           if (typePrefixMethod === "function") {
               usablePrefixMethod = element[prefix + method]();
           } else {
               usablePrefixMethod = element[prefix + method];
           }
       }
   });
   
       return usablePrefixMethod;
};
   
//進入全屏
 function launchFullscreen(element) 
   {
    //此方法不可以在異步任務中執行,否則火狐無法全屏
     if(element.requestFullscreen) {
       element.requestFullscreen();
     } else if(element.mozRequestFullScreen) {
       element.mozRequestFullScreen();
     } else if(element.msRequestFullscreen){ 
       element.msRequestFullscreen();  
     } else if(element.oRequestFullscreen){
        element.oRequestFullscreen();
    }
    else if(element.webkitRequestFullscreen)
     {
       element.webkitRequestFullScreen();
     }else{
     
        var docHtml  = document.documentElement;
        var docBody  = document.body;
        var videobox  = document.getElementById('videobox');
        var  cssText = 'width:100%;height:100%;overflow:hidden;';
        docHtml.style.cssText = cssText;
        docBody.style.cssText = cssText;
        videobox.style.cssText = cssText+';'+'margin:0px;padding:0px;';
        document.IsFullScreen = true;

      }
   }
//退出全屏
   function exitFullscreen()
   {
       if (document.exitFullscreen) {
         document.exitFullscreen();
       } else if (document.msExitFullscreen) {
         document.msExitFullscreen();
       } else if (document.mozCancelFullScreen) {
         document.mozCancelFullScreen();
       } else if(document.oRequestFullscreen){
            document.oCancelFullScreen();
        }else if (document.webkitExitFullscreen){
         document.webkitExitFullscreen();
       }else{
        var docHtml  = document.documentElement;
        var docBody  = document.body;
        var videobox  = document.getElementById('videobox');
        docHtml.style.cssText = "";
        docBody.style.cssText = "";
        videobox.style.cssText = "";
        document.IsFullScreen = false;
    }
  }
document.getElementById('fullScreenBtn').addEventListener('click',function(){
    launchFullscreen(document.getElementById('video')); 
    window.setTimeout(function exit(){
//檢查瀏覽器是否處於全屏
if(invokeFieldOrMethod(document,'FullScreen') || invokeFieldOrMethod(document,'IsFullScreen') || document.IsFullScreen)
{
exitFullscreen();
}
   },5*1000);
},false);

</script>
</body>
 
</html>


~~~~~~~~~~~~~~~~~~~~2014-11-30 更新,已修复的buglist如下~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  1. bug,之前写的Demo 不能做到很好的兼容 firefox全屏失败

FullScreenDeniedNotInputDriven=全屏请求被拒绝,因为 Element.mozRequestFullScreen() 不是在一个短期运行的由用户引发的事件处理代码段中运行的。

  2.bug IE浏览器无法全屏,这里只让它放大了

  3.IE浏览器无法判断是否全屏

  4.之前忽略了 欧朋浏览器

© 著作权归作者所有

IamOkay

IamOkay

粉丝 204
博文 483
码字总数 403228
作品 0
海淀
程序员
私信 提问
加载中

评论(7)

1123046380
1123046380

引用来自“peyton”的评论

问题是 全屏后,显示不了 全屏的那个按钮,无法退出全屏,现在写的是定时器,比较烦,希望知道的宝宝,能回复我
如果是播放完毕后退出全屏,可以去查看一下api,通过事件监听【ended】,当播放完毕后立刻执行上面的方法!
peyton
peyton
问题是 全屏后,显示不了 全屏的那个按钮,无法退出全屏,现在写的是定时器,比较烦,希望知道的宝宝,能回复我
n
nick_give
谢谢分享
A
Aimme
0这个能应用到 移动端 的app里吗
IamOkay
IamOkay 博主

引用来自“朋也”的评论

这个文件能共享下嘛?
这个就这些代码啊
朋也
朋也
这个文件能共享下嘛?
朋也
朋也
movie.swf
HTML5(目前)无法帮你实现的五件事

一直以来,很多人都专注于HTML5能够实现什么(或者是如何将各种方法连接起来,实现一个更加优雅的解决方案)。而现在,也不少人想将目光投向那些HTML5无法实现的事情。MSDN上微软员工thebeeb...

虫虫
2011/12/12
3.9K
22
最好的 6 个 HTML5 的多媒体播放器

是 HTML5 中新引入的标签,用来在 Web 网页中嵌入视频播放功能,无需 Flash 和其他嵌入式插件的支持,是浏览器内建的功能,不过 旨在一些高级浏览器中支持,例如 Firefox, Safari, Chrome, a...

红薯
2011/11/27
9.5K
9
分享10款最棒的免费HTML5视频播放器

日期:2011/12/16 来源:GBin1.com 最近Web圈子里最让人激动地莫过于HTML5了,特别是HTML5视频,使用HTML5视频标签可以帮助我们解决困扰我们很长时间的网站视频插入问题。 HTML5可以在没有f...

gbin1
2011/12/21
3.3K
2
HTML5的当下与未来?

HTML5技术而今已不再陌生,不管是趋之若鹜,热情拥抱,还是远远张望,保持距离,HTML5都是技术论坛热门的话题,给人的感觉就是酷、新、看上去很美 任何技术都有他的适用范围,HTML5技术是一种...

modernizr
2014/04/03
2.1K
2
HTML5视频教程之canvas合成海报所遇问题及解决方案

本篇文章扣丁学堂HTML5培训小编大家分享HTML5开发方面的问题:canvas合成海报所遇问题及解决方案,HTML5不论是现在还是今后的发展相信很多人都是很看好的,下面和小编一起来了解一下HTML5开发...

扣丁学堂
2018/08/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Android面试常客之Handler全解

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/fnhfire_7030/article/details/79518819 前言:又到了一年...

shzwork
16分钟前
3
0
position sticky 定位

本文转载于:专业的前端网站➫position sticky 定位 1、兼容性 https://caniuse.com/#search=sticky chrome、ios和firefox兼容性良好。 2、使用场景 sticky:粘性。粘性布局。 在屏幕范围内时...

前端老手
22分钟前
2
0
CentOS 7 yum 安装 PHP7.3 教程

参考:https://www.mf8.biz/centos-rhel-install-php7-3/ 1、首先安装 EPEL 源: yum install epel-release 安装 REMI 源: yum install http://rpms.remirepo.net/enterprise/remi-release......

dragon_tech
37分钟前
3
0
Linux物理网卡聚合及桥接

Linux内部实现的bridge可以把一台机器上的多张网卡桥接起来,从而把自己作为一台交换机。同时,LInux bridge还支持虚拟端口,即桥接的不一定都是物理网卡接口,还可以是虚拟接口。目前主要表...

xiangyunyan
38分钟前
3
0
一起来学Java8(一)——函数式编程

在这篇文章中,我们将了解到在Java8下如何进行函数式编程。 函数式编程 所谓的函数式编程就是把函数名字当做值进行传递,然后接收方拿到这个函数名进行调用。 首先来看下JavaScript如何进行函...

猿敲月下码
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部