ピクチャインピクチャ(PiP)とDPiP

PR

目次

ピクチャインピクチャ(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が開けなかったことを知らせます。

ソースコード: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でも元と同じレイアウトで表示されます。

ソースコード: DPiP
<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を個別に検証する必要があります。

video以外も対象にできます。
PR