Picture-in-picture (PiP)

François Beaufort
François Beaufort

Desde abril de 2017, o Chrome para Android O oferece suporte ao picture-in-picture. Ele permite que os usuários reproduzam um elemento <video> em uma pequena janela de sobreposição que não é bloqueada por outras janelas, para que eles possam assistir enquanto fazem outras coisas.

Veja como funciona: abra o Chrome, acesse um site que tenha um vídeo e abra em tela cheia. Em seguida, pressione o botão "Início" para acessar a tela inicial do Android, e o vídeo em reprodução vai mudar automaticamente para o modo Picture-in-Picture. É isso. Legal, né?

Imagem em imagem do Android
Figura 1. Foto do modo picture-in-picture do Android

Sim, mas e o computador? E se o site quiser controlar essa experiência?

A boa notícia é que uma especificação da API Web Picture-in-Picture está sendo redigida neste momento. O objetivo dessa especificação é permitir que os sites iniciem e controlem esse comportamento expondo o seguinte conjunto de propriedades à API:

  • Notifique o site quando um vídeo entrar e sair do modo picture-in-picture.
  • Permitir que o site acione o modo picture-in-picture em um elemento de vídeo por meio de um gesto do usuário.
  • Permitir que o site saia do modo picture-in-picture.
  • Permite que o site verifique se o picture-in-picture pode ser acionado.

E ficou assim:

<video id="video" src="https://example.com/file.mp4"></video>

<button id="pipButton"></button>

<script>
    // Hide button if Picture-in-Picture is not supported.
    pipButton.hidden = !document.pictureInPictureEnabled;

    pipButton.addEventListener('click', function() {
    // If there is no element in Picture-in-Picture yet, let's request Picture
    // In Picture for the video, otherwise leave it.
    if (!document.pictureInPictureElement) {
        video.requestPictureInPicture()
        .catch(error => {
        // Video failed to enter Picture-in-Picture mode.
        });
    } else {
        document.exitPictureInPicture()
        .catch(error => {
        // Video failed to leave Picture-in-Picture mode.
        });
    }
    });
</script>

Feedback

O que você acha? Envie seu feedback e relate problemas no repositório do WICG de Picture-in-Picture. Queremos saber sua opinião.

Como evitar o comportamento padrão do PIP no Android

Atualmente, é possível impedir que o vídeo use o comportamento padrão do PiP do Android no Chrome respondendo a um evento de redimensionamento e detectando quando o tamanho da janela mudou significativamente (consulte o código abaixo). Isso não é recomendado como uma solução permanente, mas oferece uma opção temporária até que a API da Web seja implementada.

// See whether resize is small enough to be PiP. It's a hack, but it'll
// work for now.
window.addEventListener('resize', function() {
    if (!document.fullscreenElement) {
    return;
    }

    var minimumScreenSize = 0.33;
    var screenArea = screen.width * screen.height;
    var windowArea = window.outerHeight * window.outerWidth;

    // If the size of the window relative to the screen is less than a third,
    // let's assume we're in PiP and exit fullscreen to prevent Auto PiP.
    if ((windowArea / screenArea) < minimumScreenSize) {
    document.exitFullscreen();
    }
});