二分之一

Just Jason's Blog

原生javascript API实现HTML5浏览器全屏

众说周知,html5的<video>标签是一个激动人心的技术革新,但同时因不能全屏而被诟病。

这一现状已经被改变,并将被越来越多的浏览器所支持。Firefox 10 的发布就开始支持全屏API,除FireFox 10外,Chrome 15与Safari 5.1或更高版本的浏览器也已经支持原生全屏API。

值得一提的差异,全屏退出,FireFox和Safari都是使用“ESC”键退出,而Chrome 15却采用“F11”退出全屏,这些微小的差别,却会给用户带来困扰,愿Chrome能改回“ESC”退出。

在2011年10月15日,W3C发布了一份全屏API草案(由Opera团队的一名成员编写),它跟Mozilla的草案有两个主要的不同点:

一、自定义API对象,以便兼容使用

var fullScreenApi = {
    supportsFullScreen: false, //是否支持全屏
    isFullScreen: function() { return false; }, //是否全屏状态
    requestFullScreen: function() {}, //触发全屏
    cancelFullScreen: function() {}, //取消全屏
    fullScreenEventName: '', //全屏事件名
    prefix: '' //浏览器前缀
}
var browserPrefixes = 'webkit moz o ms khtml'.split(' '); //浏览器前缀列表

二、检测浏览器是否支持全屏API

if (typeof document.cancelFullScreen != 'undefined') {
    fullScreenApi.supportsFullScreen = true;
} else {
    //检测支持全屏的浏览器前缀,该API各浏览器厂商在该方法加了自己的前缀
    for (var i = 0, il = browserPrefixes.length; i < il; i++ ) {
        fullScreenApi.prefix = browserPrefixes[i];
        if (typeof document[fullScreenApi.prefix + 'CancelFullScreen' ] != 'undefined' ) {
            fullScreenApi.supportsFullScreen = true;
            break;
        }
    }
}

三、进入全屏,退出全屏,以及全屏事件名的兼容检测

if (fullScreenApi.supportsFullScreen) {
    fullScreenApi.fullScreenEventName = fullScreenApi.prefix + 'fullscreenchange';

    fullScreenApi.isFullScreen = function() {
        switch (this.prefix) {
            case '':
                return document.fullScreen;
            case 'webkit':
                return document.webkitIsFullScreen;
            default:
                return document[this.prefix + 'FullScreen'];
        }
    }
    fullScreenApi.requestFullScreen = function(el) {
        return (this.prefix === '') ? el.requestFullScreen() : el[this.prefix + 'RequestFullScreen']();
    }
    fullScreenApi.cancelFullScreen = function(el) {
        return (this.prefix === '') ? document.cancelFullScreen() : document[this.prefix + 'CancelFullScreen']();
    }
}

四、全屏样式

/* 普通状态 */
.my-container { width: 640px; height: 360px; }

/* Mozilla草案 (有中划线) */
.my-container:full-screen { width:100%; height:100%;}

/* W3C草案 (无中划线) */
.my-container:fullscreen { width:100%; height:100%;}

/* 当前可用的供应商前缀 */
.my-container:-webkit-full-screen,
.my-container:-moz-full-screen { width:100%; height:100%; }

相比于PC端的浏览器全屏,我更期待移动终端的浏览器全屏,这对于WEB APP的发展更有帮助。

在线DEMO:http://johndyer.name/lab/fullscreenapi/

最后修改时间:2014年9月8日星期一晚上9点03