
浏览器全屏 API 实战指南:从原生 JS 到 Vue 3 封装
想给视频播放器、图片查看器或报表页面加上「一键全屏」?浏览器原生 `Fullscreen API` 就能实现,无需引入任何第三方库。本文从原生 JavaScript 到 Vue 3 组合式封装,带你完整掌握进入全屏、退出全屏、状态检测与监听的全部玩法。
目录
浏览器全屏 API 实战指南:从原生 JS 到 Vue 3 封装
想给视频播放器、图片查看器或报表页面加上「一键全屏」?浏览器原生
Fullscreen API就能实现,无需引入任何第三方库。本文从原生 JavaScript 到 Vue 3 组合式封装,带你完整掌握进入全屏、退出全屏、状态检测与监听的全部玩法。
一、Fullscreen API 是什么
Fullscreen API 是浏览器提供的一组原生接口,可以让任意 HTML 元素进入全屏展示,也能随时退出全屏。它特别适合以下几类场景:
- 视频播放器的全屏播放;
- 图片/看图模式的沉浸式浏览;
- 报表、图表、看板的全屏展示;
- 任何需要「占满屏幕」交互的页面元素。
它最大的优势是零依赖——不需要引入任何第三方库,浏览器原生支持,非常适合封装成可复用的组件。
二、功能一览
完整的全屏能力通常包含四个核心功能:
| 功能 | 说明 |
|---|---|
| 进入全屏 | 让指定元素占满整个屏幕 |
| 退出全屏 | 从全屏状态恢复正常窗口 |
| 状态检测 | 判断当前是否有元素处于全屏状态 |
| 变化监听 | 监听全屏状态的切换(可选,用于同步 UI) |
同时,为了兼容老版本浏览器,还需要处理各浏览器前缀(webkit / moz / ms)。
三、原生 JavaScript 实现
1. 进入全屏
默认全屏对象是整个文档根元素,也可以传入任意指定的元素(如某个视频、某张图片):
js
function enterFullscreen(el = document.documentElement) {
if (el.requestFullscreen) {
el.requestFullscreen();
} else if (el.webkitRequestFullscreen) {
el.webkitRequestFullscreen();
} else if (el.mozRequestFullScreen) {
el.mozRequestFullScreen();
} else if (el.msRequestFullscreen) {
el.msRequestFullscreen();
}
}
2. 退出全屏
退出全屏是文档级别的操作,不依赖具体元素:
js
function exitFullscreen() {
if (document.exitFullscreen) {
document.exitFullscreen();
} else if (document.webkitExitFullscreen) {
document.webkitExitFullscreen();
} else if (document.mozCancelFullScreen) {
document.mozCancelFullScreen();
} else if (document.msExitFullscreen) {
document.msExitFullscreen();
}
}
3. 判断是否处于全屏状态
通过 fullscreenElement 判断当前是否有元素处于全屏:
js
function isFullscreen() {
return document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement;
}
返回值是当前全屏的元素;如果返回
null,说明当前不在全屏状态。
4. 切换全屏(一键 Toggle)
把「进入」和「退出」组合起来,实现点击一次即可来回切换:
js
function toggleFullscreen() {
if (isFullscreen()) {
exitFullscreen();
} else {
enterFullscreen();
}
}
四、Vue 3 组合式封装
在 Vue 3 中,可以把以上逻辑封装成一个组合式函数(Composable),配合响应式状态 isFull,让组件使用起来更顺手:
ts
import { ref } from 'vue';
const isFull = ref(false);
function toggleFullscreen(el: HTMLElement = document.documentElement) {
if (!isFull.value) {
el.requestFullscreen?.();
isFull.value = true;
} else {
document.exitFullscreen?.();
isFull.value = false;
}
}
export { toggleFullscreen, isFull };
在组件里可以直接这样用:
vue
<script setup>
import { toggleFullscreen, isFull } from './useFullscreen';
</script>
<template>
<button @click="toggleFullscreen()">
{{ isFull ? '退出全屏' : '进入全屏' }}
</button>
</template>
五、监听全屏状态变化(可选)
如果用户通过按 Esc 键等方式主动退出全屏,组件的 isFull 状态可能不同步。这时可以监听 fullscreenchange 事件来保持状态一致:
js
document.addEventListener('fullscreenchange', () => {
console.log('全屏状态变更:', !!document.fullscreenElement);
});
监听事件后,在 Vue 封装中同步更新 isFull 值即可,避免 UI 与真实状态脱节。
六、注意事项与兼容性提示
- 必须由用户操作触发:进入全屏的调用需要发生在用户手势(如点击)的回调中,否则浏览器会拦截;
- 前缀兼容:旧版 Safari / Chrome 需要
webkit前缀,Firefox 用moz,老 Edge 用ms,建议统一做降级处理; - 状态同步:用户按
Esc或切换到全屏元素会触发fullscreenchange,应据此更新组件状态; - Promise 与异常:
requestFullscreen返回一个 Promise,全屏失败(如权限被拒)时可catch处理,提升健壮性。
七、总结
Fullscreen API 用极少的代码就能实现专业级的全屏体验,核心就四件事:进入、退出、检测、监听。配合 Vue 3 组合式 API 封装成 composable,即可在视频、看图、报表等多个业务场景中复用,是一套值得收藏的通用前端能力。
如果这篇文章对你有帮助,欢迎点赞、收藏、转发。更多前端实用技巧持续更新中。