Funkcja obraz w obrazie dla dowolnego elementu, nie tylko dla <filmu&g;

François Beaufort
François Beaufort

Browser Support

  • Chrome: 116.
  • Edge: 116.
  • Firefox: 151.
  • Safari: not supported.

Source

Interfejs Document Picture-in-Picture API umożliwia otwieranie okna, które zawsze znajduje się na wierzchu i może być wypełnione dowolną treścią HTML. Rozszerza on istniejący interfejs Picture-in-Picture API dla <video>, który pozwala na umieszczenie w oknie obrazu w obrazie tylko elementu HTML <video>.

Okno obrazu w obrazie w interfejsie Document Picture-in-Picture API jest podobne do pustego okna z tej samej domeny otwartego za pomocą window.open(), ale z pewnymi różnicami:

  • Okno obrazu w obrazie znajduje się na wierzchu innych okien.
  • Okno obrazu w obrazie nigdy nie jest zamykane przed oknem otwierającym.
  • Okno obrazu w obrazie nie może być nawigowane.
  • Położenie okna obrazu w obrazie nie może być ustawione przez witrynę.
Okno obrazu w obrazie odtwarzające zwiastun filmu Sintel.
Okno obrazu w obrazie utworzone za pomocą interfejsu Document Picture-in-Picture API (demo).

Stan

Krok Stan
1. Utwórz wyjaśnienie Zakończono
2. Utwórz wstępną wersję roboczą specyfikacji W toku
3. Zbieraj opinie i wprowadzaj zmiany w projekcie W toku
4. Testowanie origin : wersja próbna origin Zakończono
5. Uruchom Zakończono (komputer)

Przypadki użycia

Ten interfejs API możesz wykorzystać na wiele sposobów, m.in. w niestandardowych odtwarzaczach wideo, aplikacjach do wideokonferencji i aplikacjach zwiększających produktywność.

Niestandardowy odtwarzacz wideo

Witryna może udostępniać obraz w obrazie za pomocą istniejącego interfejsu Picture-in-Picture API dla <video>, ale jest to bardzo ograniczone. Istniejące okno obrazu w obrazie akceptuje niewiele danych wejściowych i ma ograniczone możliwości stylizacji. Dzięki pełnemu dokumentowi w obrazie w obrazie witryna może udostępniać niestandardowe elementy sterujące i dane wejściowe (np. napisy, listy odtwarzania, pasek czasu, polubienia i brak polubień filmów), aby poprawić komfort użytkownika podczas oglądania filmów w trybie obrazu w obrazie.

Wideokonferencje

Użytkownicy często tymczasowo opuszczają kartę przeglądarki podczas sesji wideokonferencji, np. gdy prezentują coś z innej karty, robią notatki lub wykonują inne czynności wielozadaniowe. W większości przypadków użytkownik nadal chce jednak widzieć połączenie, dlatego jest to idealny przypadek użycia obrazu w obrazie. Obecnie witryna do wideokonferencji może udostępniać obraz w obrazie za pomocą interfejsu Picture-in-Picture API dla <video>, ale jest to ograniczone pod względem stylu i danych wejściowych. Dzięki pełnemu dokumentowi w obrazie w obrazie witryna może łatwo łączyć wiele strumieni wideo w jedno okno obrazu w obrazie bez używania hacków canvas i udostępniać niestandardowe elementy sterujące, takie jak wysyłanie wiadomości, wyciszanie innego użytkownika czy podnoszenie ręki.

Produktywność

Badania wykazały, że użytkownicy potrzebują więcej sposobów na zwiększenie produktywności w internecie. Dokument w obrazie w obrazie daje aplikacjom internetowym większą elastyczność. Niezależnie od tego, czy chodzi o edycję tekstu, robienie notatek, listy zadań, wiadomości i czaty czy narzędzia do projektowania i tworzenia, aplikacje internetowe mogą teraz utrzymywać stały dostęp do swoich treści.

Interfejs

Właściwości

documentPictureInPicture.window
Zwraca bieżące okno obrazu w obrazie, jeśli takie istnieje. W przeciwnym razie zwraca wartość null.

Metody

documentPictureInPicture.requestWindow(options)

Zwraca obietnicę, która jest spełniana po otwarciu okna obrazu w obrazie. Obietnica jest odrzucana, jeśli wywołanie nastąpi bez gestu użytkownika. Słownik options zawiera te opcjonalne elementy:

width
Ustawia początkową szerokość okna obrazu w obrazie.
height
Ustawia początkową wysokość okna obrazu w obrazie.
disallowReturnToOpener
Ukrywa przycisk „Wróć do karty” w oknie obrazu w obrazie, jeśli ma wartość true. Domyślnie ma wartość false.
preferInitialWindowPlacement
Otwiera okno obrazu w obrazie w domyślnym położeniu i rozmiarze, jeśli ma wartość true. Domyślnie ma wartość false.

Wydarzenia

documentPictureInPicture.onenter
Uruchamiane w documentPictureInPicture, gdy otwierane jest okno obrazu w obrazie.

Przykłady

Poniższy kod HTML konfiguruje niestandardowy odtwarzacz wideo i element przycisku, aby otworzyć odtwarzacz wideo w oknie obrazu w obrazie.

<div id="playerContainer">
  <div id="player">
    <video id="video"></video>
  </div>
</div>
<button id="pipButton">Open Picture-in-Picture window</button>

Otwieranie okna obrazu w obrazie

Poniższy kod JavaScript wywołuje documentPictureInPicture.requestWindow(), gdy użytkownik kliknie przycisk, aby otworzyć puste okno obrazu w obrazie. Zwrócona obietnica jest spełniana za pomocą obiektu JavaScript okna obrazu w obrazie. Odtwarzacz wideo jest przenoszony do tego okna za pomocą append().

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

  // Open a Picture-in-Picture window.
  const pipWindow = await documentPictureInPicture.requestWindow();

  // Move the player to the Picture-in-Picture window.
  pipWindow.document.body.append(player);
});

Ustawianie rozmiaru okna obrazu w obrazie

Aby ustawić rozmiar okna obrazu w obrazie, ustaw opcje width i height w documentPictureInPicture.requestWindow() na idealny rozmiar okna obrazu w obrazie. Chrome może zmniejszyć wartości opcji, jeśli są one zbyt duże lub zbyt małe, aby pasowały do rozmiaru okna przyjaznego dla użytkownika.

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

  // Open a Picture-in-Picture window whose size is
  // the same as the player's.
  const pipWindow = await documentPictureInPicture.requestWindow({
    width: player.clientWidth,
    height: player.clientHeight,
  });

  // Move the player to the Picture-in-Picture window.
  pipWindow.document.body.append(player);
});

Ukrywanie przycisku „Wróć do karty” w oknie obrazu w obrazie

Aby ukryć przycisk w oknie obrazu w obrazie, który umożliwia użytkownikowi powrót do karty otwierającej, ustaw opcję disallowReturnToOpener w documentPictureInPicture.requestWindow() na true.

pipButton.addEventListener("click", async () => {
  // Open a Picture-in-Picture window which hides the "back to tab" button.
  const pipWindow = await documentPictureInPicture.requestWindow({
    disallowReturnToOpener: true,
  });
});

Otwieranie obrazu w obrazie w domyślnym położeniu i rozmiarze

Aby nie używać ponownie położenia ani rozmiaru poprzedniego okna obrazu w obrazie, ustaw opcję preferInitialWindowPlacement w documentPictureInPicture.requestWindow() na true.

pipButton.addEventListener("click", async () => {
  // Open a Picture-in-Picture window in its default position / size.
  const pipWindow = await documentPictureInPicture.requestWindow({
    preferInitialWindowPlacement: true,
  });
});

Kopiowanie arkuszy stylów do obrazu w obrazie

Aby skopiować wszystkie arkusze stylów CSS z okna źródłowego, przejdź w pętli przez styleSheets wyraźnie połączone z dokumentem lub w nim osadzone i dołącz je do okna obrazu w obrazie. Pamiętaj, że jest to jednorazowa kopia.

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

  // Open a Picture-in-Picture window.
  const pipWindow = await documentPictureInPicture.requestWindow();

  // Copy style sheets over from the initial document
  // so that the player looks the same.
  [...document.styleSheets].forEach((styleSheet) => {
    try {
      const cssRules = [...styleSheet.cssRules].map((rule) => rule.cssText).join('');
      const style = document.createElement('style');

      style.textContent = cssRules;
      pipWindow.document.head.appendChild(style);
    } catch (e) {
      const link = document.createElement('link');

      link.rel = 'stylesheet';
      link.type = styleSheet.type;
      link.media = styleSheet.media;
      link.href = styleSheet.href;
      pipWindow.document.head.appendChild(link);
    }
  });

  // Move the player to the Picture-in-Picture window.
  pipWindow.document.body.append(player);
});

Obsługa zamykania okna obrazu w obrazie

Nasłuchuj zdarzenia w oknie "pagehide", aby wiedzieć, kiedy okno obrazu w obrazie zostanie zamknięte (ponieważ witryna zainicjowała zamknięcie lub użytkownik zamknął je ręcznie). Moduł obsługi zdarzeń to dobre miejsce na przywrócenie elementów z okna obrazu w obrazie, jak pokazano tutaj.

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

  // Open a Picture-in-Picture window.
  const pipWindow = await documentPictureInPicture.requestWindow();

  // Move the player to the Picture-in-Picture window.
  pipWindow.document.body.append(player);

  // Move the player back when the Picture-in-Picture window closes.
  pipWindow.addEventListener("pagehide", (event) => {
    const playerContainer = document.querySelector("#playerContainer");
    const pipPlayer = event.target.querySelector("#player");
    playerContainer.append(pipPlayer);
  });
});

Zamknij okno obrazu w obrazie programowo za pomocą metody close().

// Close the Picture-in-Picture window programmatically.
// The "pagehide" event will fire normally.
pipWindow.close();

Nasłuchiwanie, kiedy witryna przechodzi do trybu obrazu w obrazie

Nasłuchuj zdarzenia "enter" w documentPictureInPicture, aby wiedzieć, kiedy otwierane jest okno obrazu w obrazie. Zdarzenie zawiera obiekt window, który umożliwia dostęp do okna obrazu w obrazie.

documentPictureInPicture.addEventListener("enter", (event) => {
  const pipWindow = event.window;
});

Dostęp do elementów w oknie obrazu w obrazie

Dostęp do elementów w oknie obrazu w obrazie z obiektu zwróconego przez documentPictureInPicture.requestWindow() lub za pomocą documentPictureInPicture.window.

const pipWindow = documentPictureInPicture.window;
if (pipWindow) {
  // Mute video playing in the Picture-in-Picture window.
  const pipVideo = pipWindow.document.querySelector("#video");
  pipVideo.muted = true;
}

Obsługa zdarzeń z okna obrazu w obrazie

Twórz przyciski i elementy sterujące oraz reaguj na zdarzenia wprowadzania danych przez użytkownika (np. "click"), jak zawsze w JavaScript.

// Add a "mute" button to the Picture-in-Picture window.
const pipMuteButton = pipWindow.document.createElement("button");
pipMuteButton.textContent = "Mute";
pipMuteButton.addEventListener("click", () => {
  const pipVideo = pipWindow.document.querySelector("#video");
  pipVideo.muted = true;
});
pipWindow.document.body.append(pipMuteButton);

Zmienianie rozmiaru okna obrazu w obrazie

Aby zmienić rozmiar okna obrazu w obrazie, użyj metod resizeBy() i resizeTo() obiektu Window. Obie metody wymagają gestu użytkownika.

const resizeButton = pipWindow.document.createElement('button');
resizeButton.textContent = 'Resize';
resizeButton.addEventListener('click', () => {
  // Expand the Picture-in-Picture window's width by 20px and height by 30px.
  pipWindow.resizeBy(20, 30);
});
pipWindow.document.body.append(resizeButton);

Zaznaczanie okna otwierającego

Aby zaznaczyć okno otwierające z okna obrazu w obrazie, użyj metody focus() Window. Ta metoda wymaga gestu użytkownika.

const returnToTabButton = pipWindow.document.createElement("button");
returnToTabButton.textContent = "Return to opener tab";
returnToTabButton.addEventListener("click", () => {
  window.focus();
});
pipWindow.document.body.append(returnToTabButton);

Tryb wyświetlania obrazu w obrazie CSS

Użyj trybu wyświetlania CSS picture-in-picture, aby napisać konkretne reguły CSS, które są stosowane tylko wtedy, gdy (część) aplikacji internetowej jest wyświetlana w trybie obrazu w obrazie.

@media all and (display-mode: picture-in-picture) {
  body {
    margin: 0;
  }
  h1 {
    font-size: 0.8em;
  }
}

Wykrywanie funkcji

Aby sprawdzić, czy interfejs Document Picture-in-Picture API jest obsługiwany, użyj:

if ('documentPictureInPicture' in window) {
  // The Document Picture-in-Picture API is supported.
}

Prezentacje

  • Odtwarzacz VideoJS: wypróbuj prezentację odtwarzacza VideoJS z interfejsem Document Picture-in-Picture API.
  • Tomodoro , aplikacja internetowa pomodoro, korzysta z interfejsu Document Picture-in-Picture API, gdy jest on dostępny. Zobacz ich żądanie pull na GitHubie.
Tomodoro, aplikacja internetowa do techniki Pomodoro.
Okno obrazu w obrazie w Tomodoro.

Prześlij opinię

Zgłaszaj problemy na GitHubie, podając sugestie i pytania.