全屏實現(xiàn)

最近需求中遇到關于全屏展示的需求,于是深入了解了一下demo如下所示凿渊?

demo

MDN介紹

使用提供的API,讓一個元素與其子元素敛纲,可以占據(jù)整個屏幕剂癌,并在此期間,從屏幕上隱藏所有的瀏覽器用戶界面以及其他應用旁壮。

chrome下的全屏表現(xiàn)

  1. 全屏會隱藏標簽欄,書簽欄

  2. 如果網(wǎng)頁一開始不是全部撐開的形式谐檀,全屏下,也會將要全屏的元素充滿整個屏幕


1. 全屏API:

總共用到6個API

  1. 瀏覽器是否支持全屏模式:document.fullscreenEnabled
  2. 使元素進入全屏模式:Element.requestFullscreen()
  3. 退出全屏:document.exitFullscreen()
  4. 檢查當前是否有節(jié)點處于全屏狀態(tài):document.fullscreenElement
  5. 進入全屏/離開全屏麦撵,觸發(fā)事件:document.fullscreenchange
  6. 無法進入全屏時觸發(fā): document.fullscreenerror

瀏覽器前綴:

目前并不是所有的瀏覽器都實現(xiàn)了API的無前綴版本免胃,所以我們需要針對不同瀏覽器惫撰,做一下API的兼容:

1.1 屬性

1.1.1 瀏覽器是否支持全屏模式:document.fullscreenEnabled

document.fullscreenEnabled屬性返回一個布爾值,表示當前文檔是否可以切換到全屏狀態(tài)扼雏。

const fullscreenEnabled =
 document.fullscreenEnabled ||
 document.mozFullScreenEnabled ||
 document.webkitFullscreenEnabled ||
 document.msFullscreenEnabled;

if (fullscreenEnabled) {
 videoElement.requestFullScreen();
} else {
 console.log('瀏覽器當前不能全屏');
}

1.1.2 返回全屏狀態(tài)的Element節(jié)點document.fullscreenElement

fullscreenElement屬性返回正處于全屏狀態(tài)的Element節(jié)點诗充,如果當前沒有節(jié)點處于全屏狀態(tài)棍郎,則返回null

const  fullscreenElement =
  document.fullscreenElement ||
  document.mozFullScreenElement ||
  document.webkitFullscreenElement;

1.2 方法

1.2.1 使元素進入全屏模式:Element.requestFullscreen()

Fullscreen(domName) {
  const element = document.querySelector(domName); // 獲取dom
  const methodName =
    this.prefixName === ''
      ? 'requestFullscreen'
      : `${this.prefixName}RequestFullScreen`; // API前綴
  element[methodName](); // 調(diào)用全屏
}
復制代碼

值得注意的是:調(diào)用此API并不能保證元素一定能夠進入全屏模式

  1. MDN:例如<iframe> 元素具有 allowfullscreen 屬性涂佃,可選擇是否將其內(nèi)容以全屏模式顯示

    這種不被允許全屏的元素屬于極少數(shù)情況。

  2. 全屏請求必須在事件處理函數(shù)(點擊事件等)中調(diào)用汽抚,否則將會被拒絕伯病。

初始化直接全屏否过,會觸發(fā)進入全屏失敗回調(diào)惭蟋。因為這樣那就是容易造成欺騙告组,因為使用了全屏幕API,就會欺騙到人木缝,被成功釣魚我碟。 大概意思是這樣的,看另一個例https://feross.org/html5-fullscreen-api-attack/

1.2.2 退出全屏:document.exitFullscreen()

document對象的exitFullscreen方法用于取消全屏

function exitFullscreen() {
  if (document.exitFullscreen) {
    document.exitFullscreen();
  } else if (document.msExitFullscreen) {
    document.msExitFullscreen();
  } else if (document.mozCancelFullScreen) {
    document.mozCancelFullScreen();
  } else if (document.webkitExitFullscreen) {
    document.webkitExitFullscreen();
  }
}

exitFullscreen();

調(diào)用這個方法會讓文檔回退到上一個調(diào)用Element.requestFullscreen()方法進入全屏模式之前的狀態(tài)吱殉。

1.3 全屏事件

1.3.1 進入全屏/離開全屏厘托,觸發(fā)事件:document.fullscreenchange

當我們進入全屏和離開全屏的時候催烘,都會觸發(fā)一個fullscreenchange事件缎罢。

MDN注意:此事件不會提供任何信息,表明是進入全屏或退出全屏舰始。

看了好久事件返回的信息咽袜,確實找不到一個值,表明這是在進入全屏谜嫉,或者離開全屏凹联!

可以說相當不人性化了蔽挠!但我們可以通過檢查當前是否有節(jié)點處于全屏狀態(tài),判斷當前是否處于全屏模式比原。

document.addEventListener("fullscreenchange", function( event ) {
  if (document.fullscreenElement) {
    console.log('進入全屏');
  } else {
    console.log('退出全屏');
  }
});

1.3.2 無法進入全屏時觸發(fā): document.fullscreenerror

瀏覽器無法進入全屏時觸發(fā),可能是技術原因雇寇,也可能是用戶拒絕绑改。

比如全屏請求不是在事件處理函數(shù)中調(diào)用,會在這里攔截到錯誤

screenError(enterErrorFn) {
  const methodName = `on${this.prefixName}fullscreenerror`;
  document[methodName] = e => {
    enterErrorFn && enterErrorFn(e)
  };
}
復制代碼

1.4 全屏狀態(tài)的CSS

1.4.1 :full-screen偽類

全屏狀態(tài)下,大多數(shù)瀏覽器的CSS支持:full-screen偽類识腿,只有IE11支持:fullscreen偽類造壮。使用這個偽類,可以對全屏狀態(tài)設置單獨的CSS屬性成箫。

/* 針對dom的全屏設置 */
.div:-webkit-full-screen {
  background: #fff;
}
/* 全屏屬性 */
:-webkit-full-screen {}
:-moz-full-screen {}
:-ms-fullscreen {}
/* 全屏偽類 當前chrome:70 不支持 */
:full-screen {
}
:fullscreen {
  /* IE11支持 */
}

1.4.2 :backdrop 偽元素

全屏模式的元素下的即刻渲染的盒子(并且在所有其他在堆中的層級更低的元素之上)蹬昌,可用來給下層文檔設置樣式或隱藏它

  1. 默認設置 背景灰
:not(:root):-webkit-full-screen::backdrop {
  position: fixed;
  top: 0px;
  right: 0px;
  bottom: 0px;
  left: 0px;
  background: #999; // 會將背景設為灰色的 如果你沒為你的dom設置背景的話攀隔,全屏下會為灰色
}
  1. 默認樣式:
:not(:root):-webkit-full-screen {
  object-fit: contain;
  position: fixed !important;
  top: 0px !important;
  right: 0px !important;
  bottom: 0px !important;
  left: 0px !important;
  box-sizing: border-box !important;
  min-width: 0px !important;
  max-width: none !important;
  min-height: 0px !important;
  max-height: none !important;
  width: 100% !important;
  height: 100% !important;
  transform: none !important;
  margin: 0px !important;
}

1.5 在項目中使用
由于我這個個項目用到的是Vue里面用到了這個庫昆汹,它對各個方法和屬性做了很好的兼容,在開發(fā)中可以作參考辈末。 用法很簡單,導入庫映皆,就可以直接這樣調(diào)用方法:

fscreen.requestFullscreen(element)
// replacement for: element.requestFullscreen - without calling the function
// mapped to: element.vendorMappedRequestFullscreen

我項目中js使用如下所示

import fscreen from "fscreen";
import Message from "@/components/Message";
export default {
  name: "FullScreen",
  components: {},
  data() {
    return {
      isFullscreen: false
    };
  },

  computed: {
    fullscreenEnabled() {
      return fscreen.fullscreenEnabled;
    },

    fullscreenElement() {
      return JSON.stringify(fscreen.fullscreenElement);
    }
  },

  methods: {
    onTriggerClick(e) {
      if (this.isFullscreen) {
        this.onExitFullsreen();
      } else {
        this.requestFullscreen(document.querySelector(".fullscreen-content"));
      }
      this.isFullscreen = !this.isFullscreen;
    },

    requestFullscreen(ele) {
      if (fscreen.requestFullscreen) {
        return fscreen.requestFullscreen(ele);
      } else {
        alert("瀏覽器不支持全屏API");
      }
    },

    onExitFullsreen() {
      if (fscreen.exitFullscreen) {
        return fscreen.exitFullscreen();
      } else {
        alert("瀏覽器不支持全屏API");
      }
    }
  },

  mounted() {
    fscreen.addEventListener("fullscreenchange", e => {
      Message.info(this.isFullscreen ? "進入全屏" : "退出全屏");
      console.log(e);
    });

    fscreen.addEventListener("fullscreenerror", e => {
      Message.info("全屏切換出錯");
      console.log(e);
    });
  }
};

參考資料

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挤聘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子捅彻,更是在濱河造成了極大的恐慌檬洞,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沟饥,死亡現(xiàn)場離奇詭異添怔,居然都是意外死亡湾戳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門广料,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人艾杏,你說我怎么就攤上這事韧衣。” “怎么了购桑?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵畅铭,是天一觀的道長。 經(jīng)常有香客問我勃蜘,道長硕噩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任缭贡,我火速辦了婚禮炉擅,結果婚禮上,老公的妹妹穿的比我還像新娘阳惹。我一直安慰自己谍失,他們只是感情好,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布莹汤。 她就那樣靜靜地躺著快鱼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪纲岭。 梳的紋絲不亂的頭發(fā)上攒巍,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機與錄音荒勇,去河邊找鬼。 笑死闻坚,一個胖子當著我的面吹牛沽翔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播窿凤,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼仅偎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了雳殊?” 一聲冷哼從身側響起橘沥,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎夯秃,沒想到半個月后座咆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痢艺,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年介陶,在試婚紗的時候發(fā)現(xiàn)自己被綠了堤舒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡哺呜,死狀恐怖舌缤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情某残,我是刑警寧澤国撵,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站玻墅,受9級特大地震影響介牙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜椭豫,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一耻瑟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧赏酥,春花似錦喳整、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至呵晨,卻和暖如春魏保,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背摸屠。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工谓罗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人季二。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓檩咱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親胯舷。 傳聞我的和親對象是個殘疾皇子刻蚯,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355