ピクチャインピクチャ(PiP)とは
ピクチャ イン ピクチャ(Picture-in-Picuture: 以下PiPとします)はブラウザが提供する動画(HTMLの<video>要素)を、動画専用の小型ウィンドウで再生できる機能です。
特徴として、動画をページから切り離し、ブラウザやOSの最前面に表示することができます。
DPiP(Document Picture-in-Picuture)とは
PiPが動画専用であったのに対し、DPiPは任意のHTMLドキュメントをPiPのように小型ウィンドウかつ最前面に表示する機能です。
そして、DPiPは元のページと独立したDocumentをもっています。そのため、DPiPのwindow内だけに適応されるstyleを設定したり、レイアウトを変えたりすることも可能ですが、元のページに記述されたJavaScriptやCSSが自動では適応されないため、必要な処理やstyleは個別で用意する必要があります。
コード例: PiP
PiPはブラウザが動画をPiPで開く操作を提供している場合もありますが、JavaScriptからPiPを開くこともできます。下記のコードは「startPiP」ボタンをおすことで<video>要素をPiPで開くようにするコードとブラウザでの動作例です。
PiPで開けなかった場合は「startPiP」の文字でPiPが開けなかったことを知らせます。
<div style="display:flex;flex-direction: column;align-items: center;">
<div style="display: flex;flex-direction: column;">
<video controls id="video-pip" style="border: 1px solid black;" src="test.mp4"></video>
<button id='startPiP' style="width: 100%;">startPiP</button>
</div>
</div>
JavaScriptでは「PiPを開始する」という命令を送るだけでPiPを利用することができるため、コードはかなりシンプルになります。
コード例: DPiP
DPiPはPiPよりも自由度が高く、<video>要素以外にも<div>や<span><button>をはじめとした任意の要素を小型ウィンドウに表示でき、ウィンドウサイズなども設定することができます。しかし、その分コードは複雑になりやすく、2026年現在では対応していないブラウザもあります。
下記のコード例ではDPiPで表示させたい要素群の親要素ごとクローンして、移動させています。HTML要素にそのままstyleを記述しておけば、styleもクローンされるためDPiPのDocumentでも元と同じレイアウトで表示されます。
<div style="display:flex;flex-direction: column;align-items: center;">
<div style="display: flex;flex-direction:column;">
<!-- DPiPはノードが異なるため直接styleを記述するかDPiPウィンドウにstyleをコピーする必要があります -->
<div class="videos-position" style="display: flex;flex-direction: column;">
<video controls style="border: 1px solid black;" src="test.mp4"></video>
<span>video以外も対象にできます。</span>
</div>
<button id='startDPiP' style="width: 100%;background-color: #88f;">startDPiP</button>
</div>
</div>
DPiPはPiPと異なり、独立した別のDocumentを持っているため、デベロッパーモードや検証モードなどでも元のページとは別のページのように扱われます。DPiP内の要素をデバックする際には、DPiP内のDocumentを個別に検証する必要があります。