页面指定区域全屏和退出全屏并触发对应事件

1. 前言

页面全屏和退出全屏是我们工作中经常遇到的问题,以前遇到都是直接到网上copy一份直接使用,知道最近遇到一个需要监听全屏后按ESC键退出全屏问题。所以重新梳理了下相关事件做个总结。

2. 需求问题

这次的需求和以往简单的页面全屏有一些区别

  1. 以往的需求都是整个页面全屏和退出全屏即当前的可视窗口document文档。但这次是要指定某个区域全屏。
  2. 需要判断当前这块区域是否全屏来显示对应的按钮。
  3. 通过ESC建退出全屏后,要能及时更新按钮显示或者状态。

3. 问题解决方案

3-1. 页面全屏,退出全屏方法

注意:调用全屏方法的对象可以是任意一个dom元素,我这里的el可以是document,同时也可以是通过document.querySelector获取的任意dom。如果是document,就是当前页面全屏。否则就是获取的指定dom的区域全屏。

操作 浏览器 方法
全屏 --- el.requestFullscreen()
全屏 CHROME el.webkitRequestFullScreen()
全屏 FIREFOX el.mozRequestFullScreen()
全屏 IE el.msRequestFullscreen()
退出全屏 --- document.exitFullscreen()
退出全屏 CHROME document.webkitCancelFullScreen()
退出全屏 FIREFOX document.mozCancelFullScreen()
退出全屏 IE document.msExitFullscreen()

3-2. 监听当前页面全屏,退出全屏事件

浏览器在进入全屏或者退出全屏时会触发对应的方法

浏览器 方法
--- fullscreenchange
CHROME mozfullscreenchange
FIREFOX webkitfullscreenchange
IE msfullscreenchange

3-2. 获取当前页面的全屏相关的对象

这个对象如果为true则表示当前页面处于全屏状态下,反正则不是。

浏览器 对象
--- document.fullscreenElement
CHROME document.mozFullScreenElement
FIREFOX document.webkitFullscreenElement
IE document.msFullScreenElement

4 用法

4-1. 在Vue项目中使用

<div id="app">
  <button v-if="!fullFlag" @click="fullScreen">全屏</button>
  <button v-else @click="exitFullscreen">退出全屏</button>
  <div class="test">我是全屏内容</div>
</div>
export default {
  data() {
    return {
      fullFlag: false
    };
  },
  created() {
    this.$nextTick(() => {
      // 监听当前页面全屏,退出全屏事件
      let fullArray = [
        "fullscreenchange",
        "mozfullscreenchange",
        "webkitfullscreenchange",
        "msfullscreenchange"
      ];
      fullArray.forEach(item => {
        window.addEventListener(item, () => this.fullscreenchange());
      });
    });
  },
  methods: {
    // 全屏
    fullScreen() {
      let el = document.querySelector(".test");
      if (el.requestFullscreen) {
        el.requestFullscreen();
      } else if (el.mozRequestFullScreen) {
        el.mozRequestFullScreen();
      } else if (el.webkitRequestFullScreen) {
        el.webkitRequestFullScreen();
      } else if (el.msRequestFullscreen) {
        el.msRequestFullscreen();
      }
    },
    // 关闭全屏
    exitFullscreen() {
      let de = document;
      if (de.exitFullscreen) {
        de.exitFullscreen();
      } else if (de.mozCancelFullScreen) {
        de.mozCancelFullScreen();
      } else if (de.webkitCancelFullScreen) {
        de.webkitCancelFullScreen();
      } else if (de.msExitFullscreen) {
        de.msExitFullscreen();
      }
    },
    // 全屏事件改变
    fullscreenchange() {
      let isFullscreen
        = document.fullscreenElement
        || document.mozFullScreenElement
        || document.webkitFullscreenElement
        || document.msFullScreenElement;
      if (isFullscreen) {
        this.fullFlag = true;
      } else {
        this.fullFlag = false;
      }
    },
  },
}

4-1. 解析

  1. 首先要在created时监听对应的事件触发方法fullscreenchange
  2. fullscreenchange方法中操作对应的数据fullFlag,而不是在全屏和退出全屏的方法中操作。
    : 不这样处理的话,如果我们是通过键盘上的ESC而不是点击退出全屏按钮退出全屏的时候,会造成错误。

5. 总结

好了,以上就是我对页面全屏这个需求的全部总结了。如果喜欢,请给我点个赞❤️。

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