Criando um Vídeo "Fixo" e Flutuante ao Rolar a Página
Portuguese (Português) translation by Erick Patrick (you can also view the original English article)
Se já navegou em sites de mídia recentemente–sites de transmissão de vídeos, de notícias, Facebook, etc–talvez tenha notado uma tendência em relação aos tocadores de vídeo. Se rolarmos a página de um vídeo, ele flutuará e diminuirá, fixando ao lado da área de visualização ao invés de perdê-lo de vista.
Isso permite os usuários manterem um olho no vídeo ao olharem outros conteúdos ao mesmo tempo. Nesse tutorial, mostraremos como recriar essa experiência–sem mais delongas, comecemos!
Exemplos
Para que saibamos exatamente do que se trata, eis alguns exemplos web a fora:






Adicionando Vídeo do YouTube
Para começar, criemos a marcação da página com um vídeo do YouTube. Especificamente, embutimos o vídeo com o parâmetro enablejsapi=1. Ele nos permite interagir com o vídeo pela API Iframe do YouTube.
1 |
<div class="site-content"> |
2 |
<div class="container"> |
3 |
<header class="content-header"> |
4 |
<h1>Lorem ipsum dolor sit amet.</h1> |
5 |
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tenetur, minima!</p> |
6 |
|
7 |
<!-- The YouTube video -->
|
8 |
<figure class="content-media content-media--video" id="featured-media"> |
9 |
<iframe class="content-media__object" id="featured-video" src="https://www.youtube.com/embed/SF4aHwxHtZ0?enablejsapi=1&rel=0&showinfo=0&controls=0" frameborder="0"></iframe> |
10 |
</figure>
|
11 |
|
12 |
</header>
|
13 |
<!-- Content Body -->
|
14 |
<div class="content-body"> |
15 |
</div>
|
16 |
</div>
|
17 |
</div>
|
18 |
|
19 |
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> |
20 |
<script src="https://www.youtube.com/iframe_api"></script> |
21 |
<script src="scripts/main.js"></script> |
No final da página, como vemos, adicionamos três arquivos JavaScript: jQuery; o que provê a API Iframe do YouTube; e o main.js, onde escreveremos nosso JavaScript customizado.
Estilizando
Podemos estilizar a página como quisermos, mas os estilos que trataremos aqui são responsáveis por lidar com o vídeo do YouTube. Primeiro, adicionaremos estilos para tornar o vídeo responsivo. Essas regras também habilitarão o container, .content-media--video, a manter sua proporção quando o vídeo for reposicionado.
1 |
.content-media--video {
|
2 |
background-color: #ddd; |
3 |
display: block; |
4 |
position: relative; |
5 |
padding: 0 0 56.25% 0; |
6 |
} |
7 |
.content-media--video iframe {
|
8 |
position: absolute; |
9 |
bottom: 0; |
10 |
left: 0; |
11 |
width: 100%; |
12 |
height: 100%; |
13 |
} |
Estilos do Tocador de Vídeo Flutuante
Nossa próxima regra CSS define como o vídeo deve flutuar. Usaremos o seletor .is-sticky, que adicionaremos ao tocador dinamicamente com JavaScript, para flutuar o vídeo na página. Isso também irá diminuí-lo, posicioná-lo à esquerda e ajustá-lo a algumas áreas de visualização.
1 |
#featured-video {
|
2 |
transition: width .2s ease-in-out, height .2s ease-in-out, transform .38s ease-in-out; |
3 |
} |
4 |
/** Use .sticky */ |
5 |
#featured-video.is-sticky {
|
6 |
position: fixed; |
7 |
top: 15px; |
8 |
left: auto; |
9 |
max-width: 280px; |
10 |
max-height: 158px; |
11 |
width: 280px; |
12 |
height: 158px; |
13 |
} |
14 |
@media screen and (min-width: 1120px) {
|
15 |
#featured-video.is-sticky {
|
16 |
transform: translateX(-80%); |
17 |
} |
18 |
} |
19 |
@media screen and (min-width: 1300px) {
|
20 |
#featured-video.is-sticky {
|
21 |
transform: translateX(-115%); |
22 |
} |
23 |
} |
Nota: devemos ajustar essas propriedades (tamanho e posição) de acordo com nosso público e natureza do site. Se, por exemplo, o conteúdo é da direita-para-esquerda, poderá afetar o melhor posicionamento do player para o site.
Agora, ao carregar a página, vemos que o vídeo é mostrado junto de conteúdo aleatório.



Escrevendo JavaScript
Chegamos à parte excitante do tutorial, o JavaScript! Nosso main.js está assim:
1 |
jQuery( function( $ ) {
|
2 |
// Write Code here. |
3 |
} ); |
O trecho acima equivale a $(document).ready(), que nos permite executar JavaScript quando todos os elementos da página tiverem sido analisados e disponibilizados.
Depois, definimos algumas variáveis. Adicionamos comentários em linha ao lado de cada uma, explicando-as.
1 |
var $window = $( window ); // 1. Window Object. |
2 |
var $featuredMedia = $( "#featured-media" ); // 1. The Video Container. |
3 |
var $featuredVideo = $( "#featured-video" ); // 2. The Youtube Video. |
4 |
|
5 |
var player; // 3. Youtube player object. |
6 |
var top = $featuredMedia.offset().top; // 4. The video position from the top of the document; |
7 |
var offset = Math.floor( top + ( $featuredMedia.outerHeight() / 2 ) ); //5. offset. |
API Iframe do YouTube
Como dito antes, adicionamos o arquivo JavaScript que provê acesso à API Iframe do YouTube. Essa API, após carregada, ativará a função onYouTubeIframeReady. Ela está disponível em nível global. E como nosso código está aninhado em jQuery(function($) {}); podemos usar essa função a partir do objeto window, assim:
1 |
window.onYouTubeIframeAPIReady = function() {
|
2 |
player = new YT.Player( "featured-video", {
|
3 |
events: {
|
4 |
"onStateChange": onPlayerStateChange |
5 |
} |
6 |
} ); |
7 |
}; |
Como vemo, selecionamos o atributo ID do iframe bem como passamos a função onPlayerStateChange. Ela será ativada quando o tocador do YouTube for iniciado, pausado ou finalizado.
onPlayerStateChange passa um objeto Event que nos provê dados úteis. Nesse caso, usaremos o objeto .data de Event para obter o estado do vídeo.
O estado do vídeo, como vemos abaixo, é representado por um número: 1 quando está tocando; 2 quando está pausado; e 3 quando o vídeo termina. Adicionaremos e removeremos um nome de classe de acordo com a mudança de estado.
1 |
/** |
2 |
* Run when the Youtube video state (play, pause, etc.) is changed. |
3 |
* |
4 |
* @param {Object} event The Youtube Object Event.
|
5 |
* @return {Void}
|
6 |
*/ |
7 |
function onPlayerStateChange( event ) {
|
8 |
|
9 |
var isPlay = 1 === event.data; |
10 |
var isPause = 2 === event.data; |
11 |
var isEnd = 0 === event.data; |
12 |
|
13 |
if ( isPlay ) {
|
14 |
$featuredVideo.removeClass( "is-paused" ); |
15 |
$featuredVideo.toggleClass( "is-playing" ); |
16 |
} |
17 |
|
18 |
if ( isPause ) {
|
19 |
$featuredVideo.removeClass( "is-playing" ); |
20 |
$featuredVideo.toggleClass( "is-paused" ); |
21 |
} |
22 |
|
23 |
if ( isEnd ) {
|
24 |
$featuredVideo.removeClass( "is-playing", "is-paused" ); |
25 |
} |
26 |
} |
Tornando o Vídeo Flutuante e Fixo
Abaixo temos o código para flutuar e fixar o tocador. Vale notar que apenas devemos fixar o vídeo quando ele está tocando. Assim, primeiro checamos o iframe para ver se possui a classe is-playing antes de adicionar a is-sticky:
1 |
$window |
2 |
.on( "resize", function() {
|
3 |
top = $featuredMedia.offset().top; |
4 |
offset = Math.floor( top + ( $featuredMedia.outerHeight() / 2 ) ); |
5 |
} ) |
6 |
|
7 |
.on( "scroll", function() {
|
8 |
$featuredVideo.toggleClass( "is-sticky", |
9 |
$window.scrollTop() > offset && $featuredVideo.hasClass( "is-playing" ) |
10 |
); |
11 |
} ); |
Testemos tudo que fizemos e vejamos as coisas funcionando!



Conclusão
Terminamos! Esse tutorial focou no básico, mostrando os fundamentos para criar um vídeo flutuante, como em sites de mídia que vemos. Usamos jQuery para simplificar, encurtar e facilitar o entendimento do código no geral.
Em um projeto real, contudo, provavelmente, ajustaremos alguns detalhes aqui e acolá, dependendo da complexidade. Por exemplo, talvez queiramos executar a função de rolagem em uma função de Aceleradora para reduzir invocação de funções. Talvez também queiramos ajustar a posição e tamanho do vídeo para seguir o layout do site em dispositivos móveis, e por aí vai.
Ainda assim, vejamos a demo, toquemos o vídeo e rolemos a página!



