Использование API для отображения документа в полноэкранном режиме
Экспериментальная версия: Это экспериментальная технология .
Перед использованием в продакшене внимательно изучите таблицу совместимости с браузерами.
Безопасный контекст: Эта функция доступна только в безопасных контекстах (HTTPS) в некоторых или всех поддерживающих браузерах.
В этом руководстве показано типичное использование API отображения документа в полноэкранном режиме.
Примечание: Вы можете ознакомиться с демонстрацией функции в действии по адресу Пример API отображения документа в полноэкранном режиме (см. также полный исходный код).
Пример HTML
Следующий HTML создаёт базовый видеоплеер.
<div id="container">
<p class="in-pip-message">
Video player is currently in the separate Picture-in-Picture window.
</p>
<div id="player">
<video
src="assets/bigbuckbunny.mp4"
id="video"
controls
width="320"></video>
<div id="credits">
<a href="https://peach.blender.org/download/" target="_blank">
Video by Blender </a
>;
<a href="https://peach.blender.org/about/" target="_blank">
licensed CC-BY 3.0
</a>
</div>
<div id="control-bar">
<p class="no-picture-in-picture">
Document Picture-in-Picture API not available
</p>
<p></p>
</div>
</div>
</div>
Обнаружение функции
Чтобы проверить поддержку API отображения документа в полноэкранном режиме, можно проверить, доступен ли documentPictureInPicture в window:
if ("documentPictureInPicture" in window) {
document.querySelector(".no-picture-in-picture").remove();
const togglePipButton = document.createElement("button");
togglePipButton.textContent = "Toggle Picture-in-Picture";
togglePipButton.addEventListener("click", togglePictureInPicture, false);
document.getElementById("control-bar").appendChild(togglePipButton);
}
Если он доступен, мы удаляем сообщение "API отображения документа в полноэкранном режиме недоступен" и вместо него добавляем элемент <button>, чтобы открыть видеоплеер в окне отображения документа в полноэкранном режиме.
Открытие окна отображения в полноэкранном режиме
Следующий код JavaScript вызывает window.documentPictureInPicture.requestWindow(), чтобы открыть пустое окно отображения в полноэкранном режиме. Возвращаемое Promise завершается объектом окна отображения в полноэкранном режиме Window. Видеоплеер перемещается в это окно с помощью Element.append(), и отображается сообщение об этом пользователю.
Параметры width и height объекта requestWindow() устанавливают размер окна отображения в полноэкранном режиме. Браузеры могут ограничить значения параметров, если они слишком велики или слишком малы для удобного пользовательского окна.
async function togglePictureInPicture() {
// Early return if there's already a Picture-in-Picture window open
if (window.documentPictureInPicture.window) {
return;
}
// Open a Picture-in-Picture window.
const pipWindow = await window.documentPictureInPicture.requestWindow({
width: videoPlayer.clientWidth,
height: videoPlayer.clientHeight,
});
// ...
// Move the player to the Picture-in-Picture window.
pipWindow.document.body.append(videoPlayer);
// Display a message to say it has been moved
inPipMessage.style.display = "block";
}
Копирование таблиц стилей в окно отображения в полноэкранном режиме
Чтобы скопировать все таблицы стилей из исходного окна, переберите все таблицы стилей, явно связанные с документом или встроенные в него (через Document.styleSheets), и добавьте их в окно отображения в полноэкранном режиме. Обратите внимание, что это однократная копия.
// ...
// 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);
}
});
// ...
Назначение стилей при отображении в режиме полноэкранного видео
Значение picture-in-picture медиа-функции display-mode позволяет разработчикам применять CSS к документу в зависимости от того, отображается ли он в режиме полноэкранного видео. Пример использования:
@media (display-mode: picture-in-picture) {
body {
background: red;
}
}
Этот фрагмент кода сделает фон документа <body> красным только при отображении в полноэкранном режиме.
В нашей демонстрации мы комбинируем значение display-mode: picture-in-picture с медиа-функцией prefers-color-scheme, чтобы создать светлую и тёмную цветовые схемы, которые применяются в зависимости от предпочтений пользователя по цветовой схеме, только когда приложение отображается в полноэкранном режиме.
@media (display-mode: picture-in-picture) and (prefers-color-scheme: light) {
body {
background: antiquewhite;
}
}
@media (display-mode: picture-in-picture) and (prefers-color-scheme: dark) {
body {
background: #333;
}
a {
color: antiquewhite;
}
}
Обработка закрытия окна отображения в полноэкранном режиме
Код для повторного закрытия окна отображения в полноэкранном режиме при повторном нажатии кнопки выглядит следующим образом:
inPipMessage.style.display = "none"; playerContainer.append(videoPlayer); window.documentPictureInPicture.window.close();
Здесь мы отменяем изменения в DOM — скрываем сообщение и возвращаем видеоплеер в контейнер плеера в главном окне приложения. Также мы программно закрываем окно отображения в полноэкранном режиме с помощью метода Window.close().
Однако необходимо также рассмотреть случай, когда пользователь закрывает окно отображения в полноэкранном режиме, нажав кнопку закрытия, предоставленную браузером. Вы можете обработать это, обнаружив событие закрытия окна с помощью события pagehide:
pipWindow.addEventListener("pagehide", (event) => {
inPipMessage.style.display = "none";
playerContainer.append(videoPlayer);
});
Примечание: Управление закрытием, предоставляемое браузером, можно скрыть, задав подсказку disallowReturnToOpener в объекте параметров значением true при вызове DocumentPictureInPicture.requestWindow() для открытия окна отображения в полноэкранном режиме в первую очередь.
Прослушивание входа веб-сайта в полноэкранный режим
Прослушивайте событие enter на экземпляре DocumentPictureInPicture, чтобы узнать, когда открыто окно отображения в полноэкранном режиме.
В нашей демонстрации мы используем событие enter для добавления кнопки переключения звука в окно отображения в полноэкранном режиме:
documentPictureInPicture.addEventListener("enter", (event) => {
const pipWindow = event.window;
console.log("Video player has entered the pip window");
const pipMuteButton = pipWindow.document.createElement("button");
pipMuteButton.textContent = "Mute";
pipMuteButton.addEventListener("click", () => {
const pipVideo = pipWindow.document.querySelector("#video");
if (!pipVideo.muted) {
pipVideo.muted = true;
pipMuteButton.textContent = "Unmute";
} else {
pipVideo.muted = false;
pipMuteButton.textContent = "Mute";
}
});
pipWindow.document.body.append(pipMuteButton);
});
Примечание: Объект события DocumentPictureInPictureEvent содержит свойство window для доступа к окну отображения в полноэкранном режиме.
Доступ к элементам и обработка событий
Вы можете получить доступ к элементам в окне отображения в полноэкранном режиме несколькими способами:
- Экземпляр
Window, возвращаемый методомDocumentPictureInPicture.requestWindow(), как показано выше. - Через свойство
windowобъекта событияDocumentPictureInPictureEvent(событиеenter), как показано выше. - Через свойство
DocumentPictureInPicture.window:
const pipWindow = window.documentPictureInPicture.window;
if (pipWindow) {
// Mute video playing in the Picture-in-Picture window.
const pipVideo = pipWindow.document.querySelector("#video");
pipVideo.muted = true;
}
После получения ссылки на экземпляр окна отображения в полноэкранном режиме window, вы можете манипулировать DOM (например, создавать кнопки) и реагировать на события пользовательского ввода (такие как click) так же, как и в обычном контексте окна браузера.
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/Document_Picture-in-Picture_API/Using