百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

实现网页全屏,记住这个超实用的 API

haoteby 2025-09-18 19:13 3 浏览

不为人知的requestFullscreen:解锁全屏API的隐藏力量

在现代Web开发中,requestFullscreen是最被低估的API之一。你以为它只是简单的全屏切换?实则暗藏玄机!本文将揭示那些连MDN都未曾明说的黑科技用法,带你重新认识这个浏览器原生能力。


基础认知的三大误区

// 大多数人这样使用(但存在致命缺陷)
document.getElementById('video').requestFullscreen();

误区真相

  1. 并非所有元素都可全屏:<div>元素需设置contain: layout或明确尺寸
  2. Safari的私有前缀陷阱:需同时处理webkitRequestFullscreen
  3. 权限限制:必须在用户交互事件中触发,异步调用会失败

被低估的实战神技

1. 精准控制全屏元素样式

/* 鲜为人知的全屏伪元素选择器 */
video:-webkit-full-screen { 
background: #000; /* 覆盖默认黑边 */
}

:fullscreen#controls {
opacity: 0.3;
transition: opacity 0.3s;
}

:fullscreen#controls:hover {
opacity: 1; /* 鼠标悬停显示控制栏 */
}

2. 多元素动态全屏切换

const fullscreenManager = {
currentElement: null,

  toggle(element) {
    if (this.currentElement === element && document.fullscreenElement) {
      document.exitFullscreen();
    } else {
      this.currentElement = element;
      element.requestFullscreen().catch(e => {
        console.error('全屏失败:', e.name);
        // 优雅降级方案
        element.classList.add('simulated-fullscreen');
      });
    }
  }
};

// 画廊应用:点击不同图片切换全屏
document.querySelectorAll('.gallery-img').forEach(img => {
  img.addEventListener('click', () => fullscreenManager.toggle(img));
});

3. 全屏状态下的键盘劫持

document.addEventListener('fullscreenchange', () => {
if (document.fullscreenElement) {
    // 全屏时重定义键盘事件
    document.addEventListener('keydown', handleFullscreenHotkeys);
  } else {
    document.removeEventListener('keydown', handleFullscreenHotkeys);
  }
});

function handleFullscreenHotkeys(e) {
if (e.key === 'Escape') return; // 保留默认退出

// 自定义快捷键:F切换滤镜/P画中画/S截图
if (e.key === 'f') toggleFilter();
if (e.ctrlKey && e.key === 'p') enterPictureInPicture();
if (e.shiftKey && e.key === 's') captureScreenshot();
  e.preventDefault(); // 阻止页面滚动
}

超越官方文档的三大黑科技

1. 伪装全屏检测(绕过安全限制)

// 检测是否在伪全屏模式(用户按F11)
const isFakeFullscreen = () => 
  window.outerHeight === screen.height && 
  !document.fullscreenElement;

// 应对策略
if (isFakeFullscreen()) {
  showAlert('请使用官方全屏按钮以获得完整体验');
}

2. 全屏状态持久化

// 页面刷新后恢复全屏状态
window.addEventListener('DOMContentLoaded', () => {
  const lastFullscreen = localStorage.getItem('fullscreenEl');
  if (lastFullscreen) {
    document.querySelector(lastFullscreen)?.requestFullscreen();
  }
});

document.addEventListener('fullscreenchange', () => {
  localStorage.setItem('fullscreenEl', 
    document.fullscreenElement?.id || ''
  );
});

3. 全屏中的全屏(嵌套沙盒)

<div id="main-screen">
  <iframe id="sub-screen" allowfullscreen></iframe>
</div>

<script>
  // 主容器全屏后,自动激活iframe内全屏
  mainScreen.addEventListener('fullscreenchange', async () => {
    if (document.fullscreenElement === mainScreen) {
      const iframeDoc = subScreen.contentDocument;
      await iframeDoc.getElementById('video').requestFullscreen();
    }
  });
</script>

意想不到的应用场景

  1. 全屏表格编辑器
// Excel式体验
function enterSpreadsheetMode() {
  document.querySelector('.active-cell').scrollIntoView({block: 'center'});
  setTimeout(() => gridContainer.requestFullscreen(), 300);
}
  1. 全景图查看器
// 陀螺仪控制全景
document.addEventListener('fullscreenchange', initGyroControl);
  1. 全屏WebGL性能优化
// 全屏时切换高质量渲染
canvas.requestFullscreen({ navigationUI: 'hide' })
  .then(() => setRenderQuality('ultra'));
  1. 防录屏水印系统
:fullscreen::before {
content: "";
position: fixed;
z-index: 9999;
background: url('watermark.png') repeat;
opacity: 0.05;
pointer-events: none;
/* 更多防泄密技巧... */
}

开发者必知的陷阱清单

陷阱描述

解决方案

iOS Safari全屏视频强制横屏

添加playsinline属性 + 自定义旋转按钮

全屏状态丢失滚动位置

使用scroll-snap或保存scrollTop

全屏触发页面重排

提前设置width:100%;height:100%

全屏时无法打开DevTools

开发环境禁用全屏快捷键拦截

全屏元素内iframe权限限制

添加allow="fullscreen"属性


终极代码:全屏API完全解决方案

const Fullscreen = {
// 统一前缀处理
request: async (el = document.documentElement) => {
    const methods = [
      'requestFullscreen',
      'webkitRequestFullscreen',
      'mozRequestFullScreen',
      'msRequestFullscreen'
    ];
    for (const method of methods) {
      if (el[method]) {
        try {
          await el[method]({ navigationUI: 'hide' });
          returntrue;
        } catch (e) { console.warn(method, 'failed:', e) }
      }
    }
    returnfalse;
  },

// 状态检测
isActive: () => !!(
    document.fullscreenElement ||
    document.webkitFullscreenElement ||
    document.mozFullScreenElement ||
    document.msFullscreenElement
  ),

// 退出全屏
exit: async () => {
    const exitMethods = [
      'exitFullscreen',
      'webkitExitFullscreen',
      'mozCancelFullScreen',
      'msExitFullscreen'
    ];
    for (const method of exitMethods) {
      if (document[method]) {
        try {
          awaitdocument[method]();
          returntrue;
        } catch (e) { console.warn(method, 'failed:', e) }
      }
    }
    returnfalse;
  },

// 事件监听统一封装
onChange: (callback) => {
    const events = [
      'fullscreenchange',
      'webkitfullscreenchange',
      'mozfullscreenchange',
      'MSFullscreenChange'
    ];
    events.forEach(evt =>document.addEventListener(evt, callback));
  }
};

兼容性

相关推荐

如何随时清理浏览器缓存_清理浏览器缓存怎么弄

想随时清理浏览器缓存吗?Cookieformac版是Macos上一款浏览器缓存清理工具,所有的浏览器Cookie,本地存储数据,HTML5数据库,FlashCookie,Silverlight,...

Luminati代理动态IP教程指南配置代理VMLogin中文版反指纹浏览器

介绍如何使用在VMLogin中文版设置Luminati代理。首先下载VMLogin中文版反指纹浏览器(https://cn.vmlogin.com)对于刚接触Luminati动态ip的朋友,是不是不懂...

mac清除工具分享,解除您在安全方面的后顾之忧

想要永久的安全的处理掉重要数据,删除是之一,使用今天小编分享的mac清除工具,为您的操作再增一层“保护”,小伙伴慎用哟,一旦使用就不可以恢复咯,来吧一起看看吧~mac清除工具分享,解除您在安全方面的后...

取代cookie的网站追踪技术:”帆布指纹识别”

【前言】一般情况下,网站或者广告联盟都会非常想要一种技术方式可以在网络上精确定位到每一个个体,这样可以通过收集这些个体的数据,通过分析后更加精准的去推送广告(精准化营销)或其他有针对性的一些活动。Co...

辅助上网为啥会被抛弃 曲奇(Cookie)虽甜但有毒

近期有个小新闻,大概很多小伙伴都没有注意到,那就是谷歌Chrome浏览器要弃用Cookie了!说到Cookie功能,很多小伙伴大概觉得不怎么熟悉,有可能还不如前一段时间被弃用的Flash“出名”,但它...

浏览器指纹是什么?浏览器指纹包括哪些信息

本文关键词:浏览器指纹、指纹浏览器、浏览器指纹信息、指纹浏览器原理什么是浏览器指纹?浏览器指纹是指浏览器的各种信息,当我们访问其他网站时,即使是在匿名的模式下,这些信息也可以帮助网站识别我们的身份。...

那些通用清除软件不曾注意的秘密_清理不常用的应用软件

系统清理就像卫生检查前的大扫除,即使你使出吃奶的劲儿把一切可能的地方都打扫过,还会留下边边角角的遗漏。随着大家电脑安全意识的提高,越来越多的朋友开始关注自己的电脑安全,也知道安装360系列软件来"武装...

「网络安全宣传周」这些安全上网小知识你要知道!

小布说:互联网改变了人们的衣食住行,但与之伴生的网络安全威胁也不容忽视。近些年来,风靡全球的勒索病毒、时有发生的电信诈骗、防不胜防的个人信息泄露时时刻刻都威胁着我们的生活。9月18日-24日是第四届...

TypeScript 终极初学者指南_typescript 进阶

在过去的几年里TypeScript变得越来越流行,现在许多工作都要求开发人员了解TypeScript...

jQuery知识一览_jquery的认识和使用

一、概览jQuery官网:https://jquery.com/jQuery是一个高效、轻量并且功能丰富的js库。核心在于查询query。...

我的第一个Electron应用_electronmy

hello,好久不见,最近笔者花了几天时间入门Electron,然后做了一个非常简单的应用,本文就来给各位分享一下过程,Electron大佬请随意~笔者开源了一个Web思维导图,虽然借助showSav...

HTML5 之拖放(Drag 和 Drop)_html拖放api

简介拖放是一种常见的特性,即抓取对象以后拖到另一个位置。在HTML5中,拖放是标准的一部分,任何元素都能够拖放。先点击一个小例子:在用户开始拖动<p>元素时执行JavaScrip...

如何用JavaScript判断输入值是数字还是字母?

在日常开发中,我们有时候需要判断用户输入的是数字还是字母。本文将介绍如何用JavaScript实现这一功能。检查输入值是否是数字或字母...

图形编辑器开发:快捷键的管理_图形编辑工具

大家好,我是前端西瓜哥。...

浏览器原生剪贴板:原来它能这样读取用户截图!

当我们使用GitHub时,会发现Ctrl+V就能直接读取用户剪贴板图片进行粘贴,那么它是如何工作的?安全性如何?...