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ę.
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
optionszawiera 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.
Prześlij opinię
Zgłaszaj problemy na GitHubie, podając sugestie i pytania.