页面中指定元素进入全屏退出全屏

news/2025/2/27 10:41:06

可运行demo

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Fullscreen Div Example</title>
    <style>
        /* 设置 div 的样式 */
        #fullscreenDiv {
            width: 300px; /* 宽度 */
            height: 200px; /* 高度 */
            background-color: lightblue; /* 背景颜色 */
            display: flex; /* 使用 flex 布局 */
            justify-content: center; /* 水平居中 */
            align-items: center; /* 垂直居中 */
            cursor: pointer; /* 鼠标悬停时显示为手型 */
        }
    </style>
</head>
<body>
    <!-- 这是一个 div 元素,点击它可以切换全屏 -->
    <div id="fullscreenDiv">
        Click to toggle fullscreen
    </div>

    <script>

      /**
       * 全屏 API 的工作流程
       *
       * 进入全屏:
       * 调用某个元素的 requestFullscreen() 方法,例如 fullscreenDiv.requestFullscreen()。
       * 浏览器会将这个元素设置为全屏状态,并将 document.fullscreenElement 设置为这个元素。
       *
       * 判断是否全屏:
       * 通过 document.fullscreenElement 判断当前是否有元素处于全屏状态。
       * 如果 document.fullscreenElement 不为 null,则表示有元素处于全屏状态。
       *
       * 退出全屏:
       * 调用 document.exitFullscreen() 方法,退出全屏模式。
       * 退出后,document.fullscreenElement 会变为 null。
      */

        // 获取 div 元素
        const fullscreenDiv = document.getElementById('fullscreenDiv');

        // 监听 div 的点击事件,点击时切换全屏
        fullscreenDiv.addEventListener('click', toggleFullscreen);

        /**
         * 监听键盘按键事件 - 这段监听按钮自定义退出全屏的逻辑非必要
         * 因为即使不手动监听 Esc 键,浏览器默认也会在按下 Esc 键时
         * 为什么不需要手动监听 Esc 键?
          浏览器的默认行为:
          ***** 当页面或某个元素进入全屏模式时,浏览器会自动监听 Esc 键。
          按下 Esc 键时,浏览器会自动退出全屏模式,而不需要开发者额外编写代码。
          全屏 API 的设计:
          全屏 API 的设计初衷是让开发者能够控制进入全屏的逻辑,但退出全屏的逻辑通常由浏览器自动处理。
          这是为了确保用户始终能够通过 Esc 键或浏览器提供的其他方式(如按 F11 键)退出全屏模式。
          用户体验的一致性:
          如果每个网站都需要手动实现退出全屏的逻辑,可能会导致不一致的用户体验。
          浏览器通过内置行为确保用户在任何网站中都能通过 Esc 键退出全屏。

          为什么代码中还需要监听 Esc 键?
          虽然浏览器默认会处理 Esc 键退出全屏,但在某些情况下,开发者可能希望在退出全屏时执行一些额外的操作。例如:
          更新页面状态。
          显示提示信息。
          记录用户行为。
        */
        document.addEventListener('keydown', function(event) {
            // 如果按下的是 Esc 键,并且当前有元素处于全屏状态
            if (event.key === 'Escape' && document.fullscreenElement) {
                exitFullscreen(); // 退出全屏
            }
        });

        // 切换全屏的函数
        function toggleFullscreen() {

            /**
             * document.fullscreenElement 是什么?
             * document.fullscreenElement 是浏览器提供的一个属性,用于获取当前处于全屏模式的元素
             * 如果有就返回处于全屏模式的元素,否则返回 null
             * 全屏模式是文档级别的状态,浏览器需要知道当前整个文档中是否有元素处于全屏状态,因此将 fullscreenElement 放在了 document 对象上。
            */
            if (!document.fullscreenElement) {
                enterFullscreen(); // 进入全屏
            } else {
                exitFullscreen(); // 退出全屏
            }
        }

        /**
         * @desc 进入全屏的函数 - 每个元素都可以调用 requestFullscreen() 方法,请求将自己设置为全屏模式。
        */
        function enterFullscreen() {
            // 检查浏览器是否支持标准的全屏 API
            if (fullscreenDiv.requestFullscreen) {
                fullscreenDiv.requestFullscreen(); // 进入全屏
            }
            // 检查 Firefox 浏览器的全屏 API
            else if (fullscreenDiv.mozRequestFullScreen) {
                fullscreenDiv.mozRequestFullScreen();
            }
            // 检查 Chrome、Safari 和 Opera 浏览器的全屏 API
            else if (fullscreenDiv.webkitRequestFullscreen) {
                fullscreenDiv.webkitRequestFullscreen();
            }
            // 检查 IE/Edge 浏览器的全屏 API
            else if (fullscreenDiv.msRequestFullscreen) {
                fullscreenDiv.msRequestFullscreen();
            }
        }

        /**
         * 退出全屏的函数
         * 退出全屏是文档级别的操作,而不是某个元素的操作。
         * 无论哪个元素处于全屏状态,调用 document.exitFullscreen() 都会退出全屏模式。
         * 这是因为浏览器需要确保只有一个元素可以处于全屏状态,退出时不需要指定具体是哪个元素。
        */
        function exitFullscreen() {
            // 检查浏览器是否支持标准的退出全屏 API
            if (document.exitFullscreen) {
                document.exitFullscreen(); // 退出全屏
            }
            // 检查 Firefox 浏览器的退出全屏 API
            else if (document.mozCancelFullScreen) {
                document.mozCancelFullScreen();
            }
            // 检查 Chrome、Safari 和 Opera 浏览器的退出全屏 API
            else if (document.webkitExitFullscreen) {
                document.webkitExitFullscreen();
            }
            // 检查 IE/Edge 浏览器的退出全屏 API
            else if (document.msExitFullscreen) {
                document.msExitFullscreen();
            }
        }
    </script>
</body>
</html>

相关知识点

全屏 API 的工作流程

1、进入全屏:
调用某个元素的 requestFullscreen() 方法,例如 fullscreenDiv.requestFullscreen()。
浏览器会将这个元素设置为全屏状态,并将 document.fullscreenElement 设置为这个元素。

2、判断是否全屏:
通过 document.fullscreenElement 判断当前是否有元素处于全屏状态。
如果 document.fullscreenElement 不为 null,则表示有元素处于全屏状态。

3、退出全屏:
调用 document.exitFullscreen() 方法,退出全屏模式。
退出后,document.fullscreenElement 会变为 null。

一些思考

为什么通过 fullscreenDiv.requestFullscreen() 进入全屏,但通过 document.exitFullscreen() 退出全屏?

1、进入全屏:
每个元素都可以调用 requestFullscreen() 方法,请求将自己设置为全屏模式。
例如:fullscreenDiv.requestFullscreen() 会让 fullscreenDiv 进入全屏状态。

2、退出全屏:
退出全屏是文档级别的操作,而不是某个元素的操作。
无论哪个元素处于全屏状态,调用 document.exitFullscreen() 都会退出全屏模式。
这是因为浏览器需要确保只有一个元素可以处于全屏状态,退出时不需要指定具体是哪个元素。


http://www.niftyadmin.cn/n/5869965.html

相关文章

Docker01 - docker快速入门

Docker快速入门 文章目录 Docker快速入门一&#xff1a;Docker概述1&#xff1a;虚拟机技术和容器化技术2&#xff1a;Docker名词解释2.1&#xff1a;Docker镜像(images)2.2&#xff1a;Docker容器(containers)2.3&#xff1a;Docker仓库(registry) 3&#xff1a;Docker下载安装…

【多模态大模型学习】位置编码的学习记录

【多模态大模型学习】位置编码的学习记录 0.前言1. sinusoidal编码1.0 数学知识——复数1.0.1 复数乘法、共轭复数1.0.2 复数的指数表示 1.1 sinusoidal编码来历1.2 代码实现 2. Rotary Positional Embedding (RoPE) ——旋转位置编码2.1 RoPE来历2.2 代码实现2.2.1 GPT-J风格的…

二、IDE集成DeepSeek保姆级教学(使用篇)

各位看官老爷好&#xff0c;如果还没有安装DeepSeek请查阅前一篇 一、IDE集成DeepSeek保姆级教学(安装篇) 一、DeepSeek在CodeGPT中使用教学 1.1、Edit Code 编辑代码 选中代码片段 —> 右键 —> CodeGPT —> Edit Code, 输入自然语言可编辑代码&#xff0c;点击S…

java23种设计模式-观察者模式

观察者模式&#xff08;Observer Pattern&#xff09;学习笔记 编程相关书籍分享&#xff1a;https://blog.csdn.net/weixin_47763579/article/details/145855793 DeepSeek使用技巧pdf资料分享&#xff1a;https://blog.csdn.net/weixin_47763579/article/details/145884039 1.…

u3d使用图片字/渐变色字/艺术字详解

一.使用BMFont生成.fnt和.tga文件 1.1 下载安装bmfont Bitmap Font Generator 1.2 设置bit depth为32位 Options->Export options 1.3 清理选择字符 Edit->Clear all chars in fomt 1.4 导入艺术字图片 Edit->Open Image Manager Image->Import image 选择美术…

本地部署阿里的万象2.1文生视频(Wan2.1-T2V-1.3B)模型

文章目录 &#xff08;零&#xff09;在线体验&#xff08;一&#xff09;本地部署&#xff08;1.1&#xff09;克隆仓库&#xff08;1.2&#xff09;安装依赖&#xff08;1.2.1&#xff09;安装 flash-attention&#xff08;1.2.2&#xff09;重新安装依赖&#xff08;1.2.3&a…

深入理解高阶函数:提升JavaScript编程技巧

在JavaScript中&#xff0c;函数是一等公民&#xff0c;这意味着函数可以像其他数据类型一样被传递、赋值和返回。高阶函数&#xff08;Higher-Order Function&#xff09;是函数式编程中的一个核心概念&#xff0c;它能够极大地提升代码的灵活性和可重用性。本文将深入探讨高阶…

Nuxt.js 3【详解】敏感信息处理 -- 环境变量配置

部分敏感信息不便存在代码中&#xff0c;需在环境变量中配置 新建 .env NUXT_API_KEY123以 apiKey 为例&#xff0c;在 .env 中&#xff0c;必须以 NUXT_ 开头&#xff0c;全部大写&#xff0c;驼峰用 _连接 nuxt.config.ts 中添加运行时配置 runtimeConfig: {apiKey: "…