首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

这个Web新API让任何内容都能画中画!

• Hey, 我是 沉浸式趣谈

• 本文首发于【沉浸式趣谈】,我的个人博客https://yaolifeng.com也同步更新。

• 转载请在文章开头注明出处和版权信息。

• 如果本文对您有所帮助,请点赞评论转发,支持一下,谢谢!

“画中画”(Picture-in-Picture, PiP)说白了,就是让你能一边看视频,一边干别的,互不耽误。就像给你的桌面贴了个能播放视频的“便利贴”,你可以随便拖动它,调整大小,它还总在最前面,贼方便。

现在主流的搞法:老朋友requestPictureInPicture()

其实,想让元素实现画中画,现在已经有挺成熟的方法了,那就是直接在视频元素上调用requestPictureInPicture()这个 API。

用起来也挺简单,基本上就是:

1. 先搞个标签,放上你的视频。

2. 找个时机(比如用户点个按钮),用 JavaScript 拿到这个 video 元素,然后调用video.requestPictureInPicture()。

搞定!

给个简单的代码片段:

  const video = document.getElementById('myVideo');

  const pipButton = document.getElementById('pipButton');

  pipButton.addEventListener('click', async () => {

      // 先检查浏览器支不支持,是个好习惯

      if (document.pictureInPictureEnabled) {

          try {

              // 如果视频没在画中画模式,就请求进入

              if (document.pictureInPictureElement !== video) {

                  await video.requestPictureInPicture();

              } else {

                  // 如果已经在画中画了,就退出

                  awaitdocument.exitPictureInPicture();

              }

          } catch (error) {

              console.error('操作画中画失败:', error);

          }

      } else {

          console.log('你的浏览器不支持画中画功能。');

      }

  });

  // 还可以监听进入和退出的事件,搞点事情

  video.addEventListener('enterpictureinpicture', () => {

      console.log('进入画中画啦!');

      pipButton.textContent = '退出画中画';

  });

  video.addEventListener('leavepictureinpicture', () => {

      console.log('退出画中画了。');

      pipButton.textContent = '开启画中画';

  });

大部分现代浏览器(Chrome, Edge, Firefox, Safari 这些)对这个 API 支持得都还不错(当然,细节上可能有点小差异,用的时候最好还是查查 MDN 或者 Can I Use)。

那documentPictureInPicture.requestWindow是个啥?

window.documentPictureInPicture.requestWindow更像是个“升级版”或者说“野心更大”的亲戚。

requestPictureInPicture()这个老朋友,它的目标很明确,就是把元素扔进画中画窗口。

而documentPictureInPicture.requestWindow()这个新来的呢,它的目标是把任意的 HTML 内容(理论上是这样的,比如一个,里面可以包含视频、按钮、文字等等)放进那个悬浮的小窗口里!

小结一下

• 目前最常用、最稳妥的实现方式是针对元素的requestPictureInPicture()API。兼容性相对较好,用起来也直接。

• 那个新出的documentPictureInPicture.requestWindowAPI 呢,目标更宏大,想让任意 HTML 都能 PiP。

对这个新技术感兴趣的朋友,可以去翻翻官方文档(下面附了链接),了解下最新进展。

不过动手实践的话,还是先从老朋友requestPictureInPicture()开始吧,至少不会被兼容性搞得头秃,哈哈。

参考资料:

• 关于 Document PiP (新 API): https://developer.chrome.com/docs/web-platform/document-picture-in-picture?hl=zh-cn

• MDN 上的 Document PiP: https://developer.mozilla.org/zh-CN/docs/Web/API/DocumentPictureInPicture

• MDN 上的requestWindow方法: https://developer.mozilla.org/zh-CN/docs/Web/API/DocumentPictureInPicture/requestWindow

• (当然,也别忘了查查HTMLVideoElement.requestPictureInPicture()这个老朋友的文档)

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O8gDh8-lorUFl8uxmpX6hHdQ0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券