Spec-Zone.ru › Web APIs

Использование 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API