使用JavaScript全屏API全屏化你的元素

原文链接:Displaying Content in Full Screen using the Fullscreen API**
作者:javascriptkit
译者:lwbg
转载需提前联系译者,未经允许不得转载

在浏览网站的时候,我们有时候需要全屏显示某些内容,比如在你选择图片或者视频时。
这里所说的全屏,是指占用整个用户屏幕而没有任何浏览器甚至后台应用程序的干扰。借用全屏API,只需几行简单的js代码,你就可以聚焦到网站任何值得关注的地方,比如你有一张值得炫耀的海岸美景图,并且刚刚发到你的旅游博客上,这个时候任何人都可以把它放大然后去欣赏了(图片来源:PoxaBay)。

全屏打开一个Element

全屏API依靠的就是 requestFullscreen()方法,这个方法可以全屏打开任何元素:

var img = document.getElementById('img')
if (img.requestFullscreen) {
    img.requestFullscreen
}

全屏API支持IE 11+ 和所有现代的Chrome、Firefox桌面浏览器。需要注意的是,直到撰写本文时,仍然需要使用前缀来访问构成API的相关方法和事件处理程序。对于主要的requestFullscreen方法,我们可以使用下面三个不同的前缀方法去满足不同的浏览器:

方法
requestFullscreen() (标准方法)
webkitRequestFullscreen()
mozRequestFullScreen()
msRequestFullscreen()

跨浏览器兼容requestFullscreen()方法

跨浏览器兼容方法:让我们创建一个跨浏览器版本支持的 requestFullscreen() ,我们不需要迷失在if / else嵌套的海洋里就可以在页面上的任意元素上使用它:

function getreqfullscreen () {
    var root = document.documentElement
    return root.requestFullscreen || root.webkitRequestFullscreen || root.mozRequestFullScreen || root.msRequestFullscreen
}
// 用法: getreqfullscreen.call(targetElement)

当我们调用getreqfullscreen()的时候,我们就可以得到一个在浏览器上被支持的requestFullscreen()版本。为了调用实际的方法,我们需要使用call()将该方法绑定到我们被期望全屏元素的上下文当中。
例子:
页面中所有css样式是“canfullscreen”的图片只要点击了就可以被全屏。

var globalreqfullscreen = getreqfullscreen() // 得到支持的版本
    document.addEventListener('click', function(e){
    var target = e.target
    if (target.tagName == "IMG" && target.classList.contains('canfullscreen')){
        globalreqfullscreen.call(target) 
    }
}, false)

是不是很简单!

注意:要在document本身调用requestFullscreen()来让整个页面全屏,我们用:
document.documentElement.requestFullscreen(),或者用跨浏览器方法:globalreqfullscreen.call(document.documentElement)

退出全屏

方法
document.exitFullscreen() (标准方法)
document.webkitExitFullscreen()
document.mozCancelFullScreen()
document.msExitFullscreen()

当元素全屏的时候,默认情况下用户可以按“esc”或“f11”退出全屏。当然你也可以用document.exitFullscreen()和其他方言方法来达到同样的效果:

方法
document.exitFullscreen() (标准方法)
document.webkitExitFullscreen()
document.mozCancelFullScreen()
document.msExitFullscreen()

需要注意的是,不同于requestFullscreen()方法,它存在于每一个进入全屏的DOM元素上,所以,exitFullscreen()方法仅在文档对象上定义,这样就能在调用时将元素恢复到正常位置。
跨浏览器exitFullscreen()方法: 像上一节一样,为了方便起见,我们将创建一个返回浏览器支持的document.exitFullscreen()版本

function getexitfullscreen(){
    return document.exitFullscreen || document.webkitExitFullscreen || document.mozCancelFullScreen || document.msExitFullscreen
}
// 用法:getexitfullscreen.call(document)

例子: :下面的例子当中,我们在全屏的图像上双击就可以让浏览器回到正常模式。

var globalexitfullscreen = getexitfullscreen() // 获取支持的版本
document.addEventListener('dblclick', function(e){
    var target = e.target
    if (target.tagName == "IMG" && target.classList.contains('canfullscreen')){
        globalexitfullscreen.call(document)
    }
}, false)

检查全屏状态

浏览器在进入全屏模式的时候,document.fullscreenElement对象(只读)包含了对当前显示的目标元素的引用,在一般情况下,此对象返回null。
借用document.fullscreenElement,我们可以:

  • 检查浏览器当前是否为全屏模式
  • 检查哪个元素被显示

document.fullscreenElement和其他全屏API一样,也依赖一些浏览器前缀方法:

方法
document.fullscreenElement() (标准方法)
document.webkitFullscreenElement()
document.mozFullScreenElement()
document.msFullscreenElement()

虽然确实很麻烦,但是我们还是应该哈哈一笑从容面对。

跨浏览器getfullscreenelement()方法: 使用下面的方法去兼容document.fullscreenElement对象:

function getfullscreenelement(){
    return document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement
}
用法:getfullscreenelement()

下面的代码会检查浏览器当前是否全屏,并且图像处于屏幕中央:

If (getfullscreenelement() && getfullscreenelement().tagName == "IMG"){
    console.log("图片全屏了!")
}

在全屏模式和常规模式之间切换

document.fullscreenElement对象的常见用法是编写在全屏模式和常规模式之间动态切换元素的代码。
例子: 为了说明,在下面的图片上进行点击切换全屏和常规模式,具体取决于浏览器当前处于哪种状态。

var globalreqfullscreen = getreqfullscreen()
var globalexitfullscreen = getexitfullscreen() 
document.addEventListener('click', function(e){
    var target = e.target
    if (target.tagName == "IMG" && target.classList.contains('canfullscreen')){
        if (getfullscreenelement() == null){ // 非全屏
            globalreqfullscreen.call(target)
        }
        else{
            globalexitfullscreen.call(document)
        }
    }
}, false)

其他的一些方法和事件处理

其他几个对象和事件处理程序构成了全屏API,
包括:

  • document.fullscreenEnabled:如果页面可用于全屏模式,则返回布尔值true。没有设置allowfullscreen属性的窗口化插件或<iframe>元素将不允许全屏,这时会触发document.onfullscreenerror事件
  • document.onfullscreenchange:浏览器全屏或退出触发的事件
  • document.onfullscreenerror:浏览器全屏失败的时候触发的事件
    同样的我们也必须使用前缀来访问对应的版本。
    要创建document.onfullscreenchangedocument.onfullscreenerror的跨浏览器版本,一个简单且优雅的方法是首先查看浏览器支持的requestFullscreen()方法的版本,然后将结果映射到我们希望的事件处理程序的对应版本。
    跨浏览器onfullscreenchange事件: 这是创建统一的`document.onfullscreenchange``事件处理程序的一种方法:
function getonfullscreenevt(){
    var root = document.documentElement
    var fullscreenevts = {
        'requestFullscreen': 'onfullscreenchange',
        'webkitRequestFullscreen': 'onwebkitfullscreenchange',
        'mozRequestFullScreen': 'onmozfullscreenchange',
        'msRequestFullscreen': 'onmsfullscreenchange'
    }
     
    for (var method in fullscreenevts){
        if (root[method]){ // if root document object supports this requestFullscreen method
            return fullscreenevts[method] // return corresponding onfullscreenchange event string
        }
    }
    return undefined
}
// 用法:var globalonfullscreenchange = getonfullscreenevt(); document[globalonfullscreenchange] = function(){...}

当我们调用getonfullscreenevt()时,我们得到的onfullscreenchange兼容版本,如onwebkitfullscreenchange。然后,为了利用这个事件字符串,我们将它与document对象(事件在下面定义的对象)相关联,并为其分配一个函数:

var globalonfullscreenchange = getonfullscreenevt()
document[globalonfullscreenchange] = function(){
    console.log('You just entered or exited full screen')
}

要注意,使用document.addEventListener()目前不适用于“onfullscreenchange”或“onwebkitfullscreenchange”事件,它们需要直接附加到document对象。

与全屏相关的CSS

你可以使用全屏伪选择器及其前缀变体在全屏模式下调整元素的外观:

:-webkit-full-screen {
    /*style for full screen element */
}
 
:-moz-full-screen {
    /*style for full screen element */
}
 
:-ms-fullscreen {
    /*style for full screen element */
}
 
:fullscreen { /* official selector */
    /*style for full screen element */
}

当目标元素及其子元素的样式需要与普通模式中的默认样式不同时,如在图形容器中需要全屏显示图形时,就非常有用了。
例子:


Hawaii, a U.S. state, is an isolated volcanic archipelago in the Central Pacific. Its islands are renowned for their rugged landscapes of cliffs, waterfalls, tropical foliage and beaches with gold, red, black and even green sands. -Wikipedia

默认情况下,该图形的宽度为300px,子图像跨越整个宽度。然而,在全屏模式下,我们希望将图片宽度扩展到100%,包含的图像到90vh的高度(留下一些空白放置标题)。css如下:

<style>
 
figure{
    width: 300px;
    background: #eee;
    padding: 5px;
    cursor: pointer;
}
 
figure img{
    width: 100%;
    height: auto;
}
 
figure:-webkit-full-screen {
    width: 100%;
    text-align: center;
}
 
figure:-moz-full-screen {
    width: 100%;
    text-align: center;
}
 
figure:-ms-fullscreen {
    width: 100%;
    text-align: center;
}
 
figure:fullscreen { /* official selector */
    width: 100%;
    text-align: center;
}
 
figure:-webkit-full-screen img{
    width: auto;
    height: 90vh;
}
 
figure:-moz-full-screen img{
    width: auto;
    height: 90vh;
}
 
figure:-ms-fullscreen img{
    width: auto;
    height: 90vh;
}
 
figure:fullscreen img{
    width: auto;
    height: 90vh;
}
 
</style>

总结

将某些内容显示为全屏是你给访问者留下深刻印象的一个点,比如在浏览电子商务网站的产品图片时,有了完整的屏幕API,我们就可以实现这个功能了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,856评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,637评论 18 139
  • 山穷水尽,穷途末路。解鞍稍驻,探我青芜。落魄红尘,风骤雨疏。天凉夏了,正伤心处。想天骄子,青骢的卢。蹉跎岁月,过隙...
    逸之阅读 348评论 2 2
  • 我总觉得那该是我很熟悉的人,又好像从来都没有见过。一种熟悉而陌生的感觉。 她穿着长的纱裙,在森林里,在我前面。 雾...
    漠一阅读 178评论 0 0
  • 手册内容为「如何让一部全新的 MacBook 快速完成开发环境配置」,主要面向 Web 开发者。其中的指导,在 M...
    阿树阅读 2,857评论 3 35