告别 window.open,拥抱全新浮窗体验!

  • 深入了解 Document Picture-in-Picture API,并对比 Modal 的最佳使用场景

在前端开发中,我们经常会遇到这样的需求:弹出一个浮动窗口来显示一些实时信息、工具栏或视频内容。过去我们会用
window.open(),后来越来越多的开发者倾向于使用 Modal。但现在,一个更现代的 API 出现了——Document
Picture-in-Picture API,它能带来一种完全不同的浮窗体验。

为什么我们需要新的解决方案?

传统的 window.open() 虽然简单易用,但限制非常多:

  1. ❌ 容易被浏览器拦截(尤其是在移动端)
  2. ❌ 用户体验差(新窗口可能被挡住)
  3. ❌ 样式控制受限(几乎无法用 CSS 美化)
  4. ❌ 无法保证窗口始终置顶

Modal(模态框)虽然解决了很多问题,但它始终依附于当前页面 DOM,一旦用户切换了标签页、最小化了窗口,就无法再查看。

Document Picture-in-Picture API 是什么?

这是浏览器提供的原生 API,它允许你创建一个独立的、始终置顶的小窗口,并加载自定义 HTML 内容。它和视频画中画(Video PiP)类似,但不是只能放视频,而是可以放任何 HTML 页面内容!

✅ 从技术上说,它本质上是一个轻量、独立的浏览器子窗口,但有专门的样式控制权。

🆚 Modal 和 Document PiP 的对比分析

对比维度表格

对比维度Modal(模态框)Document PiP(文档浮窗)
是否属于当前页面✅ 是❌ 否,独立页面
是否总在顶层显示❌ 需控制 z-index✅ 浏览器层面置顶
是否能脱离标签页❌ 否✅ 是,切标签页依然保留显示
样式与内容控制✅ 可通过 React/Vue 完整控制✅ 需通过 HTML 字符串或 JS 注入
是否能被拦截✅ 不会✅ 不会
用户体验✅ 优秀✅ 更适合小工具类浮窗
使用场景表单、对话框、确认弹窗等数据面板、悬浮工具栏、直播小窗等

这里提供一个html文件示例,可以直接复制 浏览器打开,有直观的体验

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document Picture-in-Picture API 示例</title><style>body {font-family: Arial, sans-serif;max-width: 800px;margin: 0 auto;padding: 20px;background-color: #f5f5f5;}.container {background-color: white;border-radius: 8px;padding: 20px;box-shadow: 0 2px 10px rgba(0,0,0,0.1);}h1 {color: #333;text-align: center;}.video-container {position: relative;width: 100%;height: 300px;background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);border-radius: 8px;display: flex;align-items: center;justify-content: center;color: white;margin: 20px 0;}.controls {display: flex;gap: 10px;justify-content: center;flex-wrap: wrap;margin: 20px 0;}button {padding: 10px 20px;background-color: #4CAF50;color: white;border: none;border-radius: 4px;cursor: pointer;font-size: 16px;}button:hover {background-color: #45a049;}button:disabled {background-color: #cccccc;cursor: not-allowed;}.feature-list {background-color: #f9f9f9;border-left: 4px solid #4CAF50;padding: 15px;margin: 20px 0;}.feature-list h3 {margin-top: 0;}.feature-list ul {padding-left: 20px;}.feature-list li {margin-bottom: 10px;}.pip-window-content {width: 100%;height: 100%;background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);display: flex;flex-direction: column;align-items: center;justify-content: center;color: white;font-family: Arial, sans-serif;}.pip-title {font-size: 18px;font-weight: bold;margin-bottom: 10px;}.pip-clock {font-size: 24px;font-weight: bold;}.pip-controls {margin-top: 20px;display: flex;gap: 10px;}.pip-button {padding: 8px 16px;background-color: rgba(255, 255, 255, 0.2);border: 1px solid white;color: white;border-radius: 4px;cursor: pointer;}.status {text-align: center;padding: 10px;border-radius: 4px;margin: 10px 0;}.supported {background-color: #dff0d8;color: #3c763d;}.not-supported {background-color: #f2dede;color: #a94442;}</style>
</head>
<body><div class="container"><h1>Document Picture-in-Picture API 示例</h1><div id="support-status" class="status">检查浏览器支持情况...</div><div class="video-container"><div><div style="font-size: 24px; margin-bottom: 10px;">主窗口内容</div><div>这是一个模拟的视频播放区域</div></div></div><div class="controls"><button id="openPipButton" disabled>打开画中画窗口</button><button id="closePipButton" disabled>关闭画中画窗口</button></div><div class="feature-list"><h3>Document Picture-in-Picture API 特性:</h3><ul><li>可以在独立窗口中显示任意 HTML 内容</li><li>窗口始终置顶,不会被其他应用遮挡</li><li>可以自定义窗口内容和交互</li><li>支持动态更新窗口内容</li><li>适用于视频播放器、会议工具、聊天应用等场景</li></ul></div><div class="feature-list"><h3>使用步骤:</h3><ul><li>检查浏览器是否支持 Document Picture-in-Picture API</li><li>创建要在画中画窗口中显示的内容</li><li>调用 API 打开画中画窗口</li><li>在窗口中渲染自定义内容</li></ul></div></div><script>// 检查浏览器支持const supportStatus = document.getElementById('support-status');const openPipButton = document.getElementById('openPipButton');const closePipButton = document.getElementById('closePipButton');let pipWindow = null;if ('documentPictureInPicture' in window) {supportStatus.textContent = '✓ 您的浏览器支持 Document Picture-in-Picture API';supportStatus.className = 'status supported';openPipButton.disabled = false;} else {supportStatus.textContent = '✗ 您的浏览器不支持 Document Picture-in-Picture API(需要 Chrome 116+)';supportStatus.className = 'status not-supported';}// 打开画中画窗口openPipButton.addEventListener('click', async () => {try {// 请求打开画中画窗口pipWindow = await window.documentPictureInPicture.requestWindow({width: 400,height: 300});// 在画中画窗口中创建内容const pipDocument = pipWindow.document;// 添加基础样式const style = pipDocument.createElement('style');style.textContent = `body {margin: 0;padding: 0;font-family: Arial, sans-serif;}`;pipDocument.head.appendChild(style);// 创建内容const content = pipDocument.createElement('div');content.className = 'pip-window-content';content.innerHTML = `<div class="pip-title">Document Picture-in-Picture 示例</div><div class="pip-clock" id="pip-clock">00:00:00</div><div class="pip-controls"><button class="pip-button" id="update-content">更新时间</button><button class="pip-button" id="close-window">关闭窗口</button></div>`;pipDocument.body.appendChild(content);// 添加交互功能const clockElement = pipDocument.getElementById('pip-clock');const updateButton = pipDocument.getElementById('update-content');const closeButton = pipDocument.getElementById('close-window');// 更新时钟函数function updateClock() {const now = new Date();clockElement.textContent = now.toTimeString().slice(0, 8);}// 初始更新updateClock();// 定时更新时钟const clockInterval = setInterval(updateClock, 1000);// 更新按钮事件updateButton.addEventListener('click', updateClock);// 关闭按钮事件closeButton.addEventListener('click', () => {pipWindow.close();});// 窗口关闭事件pipWindow.addEventListener('pagehide', () => {clearInterval(clockInterval);pipWindow = null;closePipButton.disabled = true;openPipButton.disabled = false;});// 更新按钮状态openPipButton.disabled = true;closePipButton.disabled = false;// 关闭按钮事件closePipButton.onclick = () => {if (pipWindow) {pipWindow.close();}};} catch (error) {console.error('打开画中画窗口失败:', error);alert('打开画中画窗口失败: ' + error.message);}});</script>
</body>
</html>

如果你想实现:

  • 不被弹窗拦截器阻止的浮窗功能;
  • 永远置顶、跨标签页的小窗口;
  • 快速集成、无需第三方组件的解决方案;

👉 那就大胆尝试 Document Picture-in-Picture API 吧!它或许会成为你项目中意想不到的提升利器!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/92402.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/92402.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python爬虫实战:研究weiboSpider技术,构建新浪微博数据采集系统

1. 引言 1.1 研究背景 在信息时代,社交媒体已成为人们获取信息、表达观点的重要渠道。微博作为其中的典型代表,拥有庞大的用户群体和活跃的内容生态。截至 2023 年底,微博月活跃用户数已超过 5.8 亿,日均发博量达数千万条,数据涵盖社会热点、公众情绪、消费偏好等多维度…

HashMap初始化容量为10,还未添加数据时,它的实际容量是多少?

在Java中&#xff0c;当使用 new HashMap<>(10) 初始化一个容量为10的 HashMap 但尚未添加任何数据时&#xff0c;其实际容量&#xff08;底层数组的长度&#xff09;不是10&#xff0c;而是16。原因如下&#xff1a;关键机制解析&#xff1a;容量必须是2的幂HashMap要求…

前端开发:CSS(2)—— 选择器

前面我们初步学习了CSS&#xff0c;对其有了基本的认识。下面我们来具体学习CSS中的选择器。 目录 选择器的种类 1.基础选择器 &#xff08;1&#xff09;标签选择器 &#xff08;2&#xff09;类选择器 &#xff08;3&#xff09;id选择器 &#xff08;4&#xff09;通…

人工智能2.0时代的人才培养和通识教育

目录引言&#xff1a;从"机器模仿"到"智能协同"的时代跨越一、人工智能2.0的技术演进&#xff1a;从规则到大模型的三次跃迁1. 人工智能0.0&#xff08;1956-2006&#xff09;&#xff1a;规则驱动的"专家系统时代"2. 人工智能1.0&#xff08;20…

管理索引常用的API

二.管理索引常用的API 1.查看现有索引信息 查看所有索引信息列表&#xff1a;curl -X GET http://elk101.k8s.com:9200/_cat/indices?v查看某个索引的详细信息:curl -x GET http://elk101.k8s.com:9200/linux-2020-10-2温馨提示: (1)"?v"表示输出表头信息&#xff…

当文档包含表格时,如何结合大模型和OCR提取数据?

在AI应用极速发展的当下&#xff0c;LLM&#xff08;大语言模型&#xff09;与RAG&#xff08;检索增强生成&#xff09;系统已成为构建智能问答、知识管理等高阶应用的核心引擎。 然而&#xff0c;许多团队在项目落地时遭遇了现实的挑战&#xff1a;模型的实际表现——无论是回…

机器学习工程化 3.0:从“实验科学”到“持续交付”的 7 个关卡

一、背景&#xff1a;为什么 90% 的 ML 项目死在了实验台&#xff1f; Gartner 2024 报告显示&#xff0c;87% 的企业机器学习项目未能走出实验室。原因并非算法落后&#xff0c;而是缺少“工程化骨骼”&#xff1a;数据漂移无人发现&#xff0c;模型上线一周就失效&#xff1b…

BGP笔记整理

一、BGP 基础概念1. 产生背景BGP&#xff08;Border Gateway Protocol&#xff09;是自治系统&#xff08;AS&#xff09;间的动态路由协议&#xff0c;属于外部网关协议&#xff08;EGP&#xff09;&#xff0c;用于在不同 AS 之间传递路由信息。2. 自治系统&#xff08;AS&am…

Mysql-MVCC机制

1. MVCC机制详解 在Read Uncommitted级别下&#xff0c;事务总是读取到最新的数据&#xff0c;因此根本用不到历史版本&#xff0c;所以MVCC不在该级别下工作。 在Serializable级别下&#xff0c;事务总是顺序执行。写会加写锁&#xff0c;读会加读锁&#xff0c;完全用不到MVC…

MySQL面试题及详细答案 155道(061-080)

《前后端面试题》专栏集合了前后端各个知识模块的面试题&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

大数据中需要知道的监控页面端口号都有哪些

以下是一些大数据中常见组件监控页面的端口号&#xff1a;1. Hadoop&#xff1a;HDFS Web UI在Hadoop2.x版本中默认端口为50070&#xff0c;在Hadoop3.x版本中为9870&#xff0c;用于查看集群文件及目录&#xff1b;YARN Web UI端口为8088&#xff0c;可查看MR执行情况&…

时隔六年!OpenAI 首发 GPT-OSS 120B / 20B 开源模型:性能、安全与授权细节全解

为什么这次开放值得关注&#xff1f; OpenAI 时隔六年再次“放权重”&#xff0c;一次性公布 gpt-oss-120b 与 gpt-oss-20b 两个尺寸&#xff0c;并允许商业化二次开发 —— 采用 Apache 2.0 许可且可直接在 Hugging Face 下载(WIRED)。官方表示&#xff0c;开放旨在 降低门槛…

漏洞全讲解之中间件与框架漏洞(数字基础设施的“阿喀琉斯之踵“)

一、中间件漏洞的严峻现状根据Synopsys《2023年开源安全报告》显示&#xff1a;企业应用中平均包含158个中间件依赖高危漏洞年增长率达62%&#xff08;X-Force数据&#xff09;最危险漏洞&#xff1a;Log4j2&#xff08;CVE-2021-44228&#xff09;影响全球83%企业平均修复延迟…

Leetcode——菜鸟笔记2(移动0)

文章目录题目解题题目 解题 /*nums【0&#xff0c;1&#xff0c;0&#xff0c;3&#xff0c;2】numsSize5 nums【1.3.2.0.0】 1.找非零数&#xff0c;依次放在前面 2.剩下补0 */ void moveZeroes(int* nums, int numsSize) {int count0 0;int temp 0;for (int i 0; i < …

【LINUX网络】应用层自定义协议与序列化——通过实现一个简单的网络计算器来体会自定义协议

在了解了各种协议的使用以及简单的socket接口后&#xff0c;学会了“怎么传”的问题&#xff0c;现在来了解一下“传什么”的问题。 1. 序列化与反序列化 在前面的TCP、UDP的socket api 的接口, 在读写数据时, 都是按 "字符串" 的方式来发送接收的. 如果我们要传输一…

电脑一键重装系统win7/win10/win11无需U盘(无任何捆绑软件图文教程)

建议还是使用U盘进行重装系统&#xff0c;如果暂时还不会没有U盘&#xff0c;那就按照我这个来吧。 一&#xff0c;工具下载&#xff1a; 一键重装工具 密码:g5p3 二&#xff0c;镜像下载: 镜像站点&#xff1a;MSDN, 我告诉你 - 做一个安静的工具站 可以下载需要重装的系统…

深入探索Supervision库:Python中的AI视觉助手

深入探索Supervision库&#xff1a;Python中的AI视觉助手 在计算机视觉和机器学习领域&#xff0c;数据处理和结果可视化是项目成功的关键环节。今天我们将深入探讨一个强大的Python库——Supervision&#xff0c;它专为简化AI视觉项目的工作流程而设计。 什么是Supervision&am…

面向对象之类、继承和多态

系统是由汇总了数据和过程的“对象”组成的。在面向对象中&#xff0c;软件被定义为“类”&#xff0c;然后创建“实例”并运行。系统是通过“实例”之间的互相交换“消息”而运行的&#xff0c;但由于进行了“封装”&#xff0c;所以无法查看内部的详细内容&#xff0c;这被称…

传统防火墙与下一代防火墙

防火墙的发展过程第一种简单包过滤防火墙工作于&#xff1a;3、4层实现了对于IP、UDP、TCP信息的一些检查优点&#xff1a;速度快、性能高、可用硬件实现&#xff1b;兼容性较好检查IP、UDP、TCP信息缺点&#xff1a;安全性有限&#xff1a;仅能基于数据包的表面层面进行审查&a…

计算机视觉前言-----OpenCV库介绍与计算机视觉入门准备

前言&#xff1a;OpenCV库介绍与计算机视觉入门 OpenCV概述 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库&#xff0c;由Intel于1999年首次发布&#xff0c;现由非盈利组织OpenCV.org维护。它包含了超过2500种…