65
51

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【JavaScript】動画以外の要素でもピクチャーインピクチャーできるらしい!

Last updated at Posted at 2023-02-22

はじめに

みなさんは、ピクチャーインピクチャーをご存じですか?

動画やビデオ通話系のサービスやアプリではよくみますが、他の用途ではあまりみませんよね!
それもそのはずで、今までのピクチャーインピクチャーは、<video> 要素でのみ使うことができました。

ですが、Chrome 111 以降では、documentPictureInPictureを使うことで、<video> 要素以外の任意の要素をピクチャーインピクチャーさせることができるようになります。

今までできなかった <audio><img>のような要素をピクチャーインピクチャーさせることができるようになるので、CDジャケットを表示させながら音楽を再生させたりでき、webサイト上でできることが広がります。

そのためこの記事では、そんな documentPictureInPictureを使ったピクチャーインピクチャーについて紹介します。

ピクチャーインピクチャー(PiP)とは?

image1.png
現在ピクチャーインピクチャーは、モバイルデバイス等で他のアプリを使用しながら、小さなプレーヤーで動画を視聴できる機能です。

私は、youtubeを見ながら、X(Twitter)を見たり、Qiita記事を読んだり、
Prime Videoを見ながら、俳優・女優について調べたりしています。

動画以外にも、ビデオ通話やZoom会議等においても使われていることがあります。

ピクチャーインピクチャーの実装

今回使う、任意の要素をピクチャーインピクチャーは、以下のフラグを有効化してから確認してください。
chrome://flags/#document-picture-in-picture-api

documentPictureInPicture

まずは、今回実装に使う documentPictureInPicture について解説していきます。

○プロパティ

  • documentPictureInPicture.window
    • ピクチャーインピクチャーのウィンドウにアクセスするためのプロパティです。
    • ウィンドウがなければ nullを返します。
       

○メソット

  • documentPictureInPicture.requestWindow(options)
    • ピクチャーインピクチャーのウィンドウを表示する時に使うメソットです。
    • optionsには以下の要素を渡すことができます
      • initialAspectRatio:ウィンドウの縦横比
      • whidth:ウィンドウの幅
      • height:ウィンドウの高さ
      • copyStyleSheets: trueを渡すことで、1度だけスタイルを渡すことができる
         

○イベント

  • documentPictureInPicture.onenter
    •  ピクチャーインピクチャーのウィンドウが表示された時のイベント

実装方法

では早速、任意の要素をピクチャーインピクチャーさせていきましょう。

01. HTMLを記載する

sample.html
<button id="openButton">ピクチャーインピクチャー表示する</button>
<div id="container">
  <div id="player">
    <!--ピクチャーインピクチャーのウィンドウに入れたい要素を記述する-->
  </div>
</div>
  1. id="openButton"は、クリックイベントを取得するために使います。
  2. id="container"は、ピクチャーインピクチャーのウィンドウを閉じた時に要素を戻すために使います。
  3. id="player"は、ピクチャーインピクチャーのウィンドウに入れる要素です。

02. CSSを記載する

sample.css
/*ピクチャーインピクチャーのウィンドウに表示させる要素のスタイルを 記載します。*/
#player {
    background-color: red;
    height: 100px;
    width: 100px;
}

※ スタイルが渡っていることがわかるようなにスタイルを調整

03. ピクチャーインピクチャーのウインドウを表示させる

sample.js
// 1. #openButtonを取得
const OpenButton = window.document.getElementById('openButton')

// 1. クリックイベントを使う
OpenButton.addEventListener('click', async () => {
  const player = document.querySelector("#player");

  // 2. ピクチャーインピクチャーのウインドウの定義
  const pipWindow = await documentPictureInPicture.requestWindow({
    width: player.clientWidth,
    height: player.clientHeight,
    copyStyleSheets: true,
  });

  // 3. ウインドウに`#player`を追加
  pipWindow.document.body.append(player);
});
  1. #openButtonを取得して、クリックされた時のイベントを使います。
  2. ピクチャーインピクチャーのウインドウを定義します
  3. ウインドウに#playerを追加します。

04. ピクチャーインピクチャーのウインドウを閉じた時にもとに戻す

sample.js
const OpenButton = window.document.getElementById('openButton')

OpenButton.addEventListener('click', async () => {
  const player = document.querySelector("#player");

  const pipWindow = await documentPictureInPicture.requestWindow({
    width: player.clientWidth,
    height: player.clientHeight,
    copyStyleSheets: true,
  });

  pipWindow.document.body.append(player);

  // 以下追加
  pipWindow.addEventListener("unload", (event) => {
    const playerContainer = document.querySelector("#container");
    const pipPlayer = event.target.querySelector("#player");
    playerContainer.append(pipPlayer);
  });
});

ピクチャーインピクチャーのウインドウがunloadされた時に、#player要素を#container要素に追加する処理を記載する

05. 完成

このようにHTML・CSS・JavaScriptを記載することで、ピクチャーインピクチャーに任意の要素を記入することができます。

See the Pen picture in picture by でぐぅー | Qiita (@sp_degu) on CodePen.

サンプル

どんな要素でも入れることができそうだったので、モンスターボールでも、表示させようかなということで、サンプルを作成しました。

任意の要素をピクチャーインピクチャーに表示させるには、以下のフラグを有効化してから確認してください。
chrome://flags/#document-picture-in-picture-api

See the Pen picture in picture by でぐぅー | Qiita (@sp_degu) on CodePen.

まとめ

この記事では、、<video>以外の任意の要素をピクチャーインピクチャーさせることができるようになる方法を紹介しました。

この方法は、まだ、Chrome 111 以降でのみの検証のため、実際に業務等で使えるものではありません。

ですが、このやり方が使えるようになった暁には、ピクチャーインピクチャーをwebサービスやアプリなどがちょこちょこ出てくるでしょう。
楽しみですね...

動画、音楽、ビデオ通話以外の実用的な使い方がまだいまいちわかっていないので、
いいアイディアを思いついたよという方は、ぜひコメントください。


最後まで読んでくださってありがとうございます!

普段はデザインやフロントエンドを中心にQiitaに記事を投稿しているので、ぜひQiitaのフォローとX(Twitter)のフォローをお願いします。

65
51
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
65
51

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?