画中画文档演示 - Document Picture-in-Picture API
打开一个始终置顶的小窗口,在其中显示自定义内容(例如笔记/时钟),实验新API。
UD5工具箱
Window Placement API 是一个现代Web API,允许Web应用查询连接的多个显示器的详细信息(如屏幕标签、分辨率、坐标位置、是否主屏幕等),并在指定的屏幕上放置或移动浏览器窗口。
在传统Web开发中,开发者只能通过 window.screen 获取主屏幕的基本信息,无法感知多屏幕环境。Window Placement API 填补了这一空白,使得:
getScreenDetails() 获取多屏幕信息?
调用 window.getScreenDetails() 会返回一个 Promise,解析后得到包含 screens 数组和 currentScreen 属性的对象:
const screenDetails = await window.getScreenDetails();
// screenDetails.screens - 所有屏幕的 ScreenDetailed 数组
// screenDetails.currentScreen - 当前窗口所在的屏幕
screenDetails.screens.forEach(screen => {
console.log(screen.label, screen.width, screen.height);
console.log('位置:', screen.left, screen.top);
console.log('是否主屏:', screen.isPrimary);
console.log('是否内置:', screen.isInternal);
});
首次调用时会触发浏览器权限弹窗,用户授权后才能获取详细屏幕信息。建议在用户点击按钮时调用,而不是页面加载时自动调用。
截至2024年,Window Placement API 的支持情况:
getScreenDetails()、screen.isExtended、screenschange 事件window.screen 获取有限信息)需要使用 HTTPS 或 localhost 环境。对于不支持的浏览器,可以降级使用传统的 window.screen API 获取主屏幕基本信息。
检测代码:'getScreenDetails' in window 或检查 screen.isExtended 属性。
screen.isExtended 属性有什么作用?
screen.isExtended 是一个布尔属性(Chrome 100+),无需用户授权即可访问。它快速告诉你当前是否连接了多个屏幕:
这是一个轻量级的预检查方法,可以用来决定是否需要调用 getScreenDetails() 获取详细的多屏幕信息。在单屏幕环境下可以跳过权限请求,优化用户体验。
有几种方法可以在多屏幕间管理窗口:
left 和 top 在目标屏幕坐标打开新窗口。window.open(url, '_blank', 'left=2000,top=100,width=800,height=600');需要注意浏览器弹窗拦截策略——window.open 需要在用户交互(点击)中调用,且某些浏览器对 moveTo 有限制。
传统 Screen API(window.screen)仅提供主屏幕的有限信息:
screen.width / screen.height — 主屏幕分辨率screen.availWidth / screen.availHeight — 主屏幕可用空间screen.colorDepth — 色深Window Placement API 在此基础上大幅扩展:
简单来说,传统API只能看到主屏幕,Window Placement API能看到完整的桌面空间布局。
Window Placement API 提供了两个事件来监听屏幕配置变化:
ScreenDetails 对象上监听。const screenDetails = await window.getScreenDetails();
screenDetails.addEventListener('screenschange', () => {
console.log('屏幕配置已变化!');
// 重新获取屏幕信息
});
screenDetails.addEventListener('currentscreenchange', () => {
console.log('当前窗口切换到了屏幕:', screenDetails.currentScreen.label);
});
这对于需要实时响应显示器热插拔的应用非常重要,如重新布局窗口或调整UI。
安全性:
window-management 权限,浏览器会明确提示用户授权最佳实践:
screen.isExtended 预检查,避免不必要的权限请求screenschange 事件,优雅处理显示器热插拔打开一个始终置顶的小窗口,在其中显示自定义内容(例如笔记/时钟),实验新API。
请求用户允许读取系统剪贴板,并展示内容,显示权限状态变化。
设置不同验证属性和自定义消息,测试HTML5表单验证触发效果。
展示各种 HTML5 验证属性(required, pattern, min, max 等)和自定义验证消息的效果。
在单页内模拟MPA过渡效果,自定义进场/出场动画,体验View Transitions API丝滑切换。
列出所有 Reflect 静态方法,提供参数输入并执行,查看返回值和副作用。
定义字段名称和类型(姓名、邮箱、数字范围等),批量生成符合规则的 JSON 模拟数据。
通过实例展示原生拖放 API 的使用,包括文件拖拽上传和页面元素排序功能。
使用原生HTML Popover属性创建提示、菜单与对话框,展示四种触发方式及样式定制。
使用Permissions API检查摄像头、地理位置、通知等权限的当前状态和可查询性。
编写 HTML 和 import map,在浏览器中直接导入裸标识符模块并执行。
展示一些常用内置HTML元素和自定义元素例子,提供代码复制。
向任意输入URL发送请求,清晰显示响应状态码、头信息和体,类似轻量级Postman。
捕捉页面粘贴事件,展示文本、HTML 或图片数据,演示如何定制粘贴行为。
注册一个后台同步任务,展示如何在网络恢复后自动同步表单提交等操作。
设计带有大标题、描述、CTA 按钮和背景图的首屏区域,生成完整代码。
使用 WebSocketStream 建立连接,通过 ReadableStream/WritableStream 读写数据。
在两个视图间切换并调用 document.startViewTransition,观察浏览器默认过渡动画。
测试navigator.clipboard读写功能,写入文本或读取系统剪贴板,验证安全限制。
使用 ImageCapture.takePhoto() 拍摄高分辨率照片,或抓取实时帧并下载。
设置浏览器标题和图标,模拟在暗色/亮色主题下标签栏的样子。
输入 Emmet 缩写,实时显示展开后的 HTML 结构,学习高级 Emmet 技巧。
粘贴自定义图标字体的Unicode,调节尺寸颜色立即查看效果。
选择各种数据类型演示structuredClone的深拷贝能力,对比JSON.parse的限制。
利用浏览器地理位置和公开API,显示当前位置的天气图标和温度。
记录页面交互触发的所有DOM事件及其目标、冒泡阶段,以日志和瀑布形式展示。
提供一个用户界面来 get/set/del 基于 idb-keyval 库存储的数据,方便调试。
创建带 # 私有字段的类,尝试外部访问观察语法错误,理解封装。
逐步展示SW从注册、安装到激活的完整流程,并模拟更新与跳过等待的场景。
激活 beforeunload 事件,尝试刷新或关闭标签页时会弹出浏览器确认提示,展示实现方式。