< Return to Video

Animando estilos com RAF (versão vídeo)

  • 0:01 - 0:03
    Estamos de volta com contador do Oh noes.
  • 0:04 - 0:09
    Se quisermos fazer o Oh Noes ficar maior
    conforme o contador se aproxima de zero.
  • 0:09 - 0:12
    Para deixar mais dramático.
  • 0:13 - 0:17
    Uma maneira de fazer isso é
    animar o CSS dessa imagem.
  • 0:17 - 0:19
    com a propriedade window.setInterval
  • 0:20 - 0:25
    O primeiro passo é pegar a
    imagem e armazenar em uma variável.
  • 0:25 - 0:30
    var ohnoes =
    document.getelementById("ohnoes");
  • 0:32 - 0:36
    Vou configurar o tamanho inicial
    ohnoes.style.width = "50px";
  • 0:36 - 0:39
    Assim temos um tamanho inicial para
    começar aumentar a imagem.
  • 0:40 - 0:44
    E agora vou criar a função makeItBigger.
  • 0:44 - 0:48
    Que será responsável por
    aumentar a imagem.
  • 0:48 - 0:53
    Dentro da função precisamos mudar
    a propriedade width (largura) da imagem.
  • 0:53 - 0:58
    Adicionando um ao
    tamanho anterior da imagem.
  • 1:00 - 1:04
    Por fim vou executar a função
    window.SetInterval
  • 1:04 - 1:07
    window.setInterval(makeItBigger)
  • 1:07 - 1:11
    Com que frequência você quer aumentar?
  • 1:11 - 1:14
    Queremos uma animação suave
  • 1:14 - 1:17
    O que significa que queremos algo
    entre 24 quadros por segundo
  • 1:17 - 1:18
    e 60 quadros por segundo.
  • 1:19 - 1:21
    Vou experimentar 30 quadros por segundo.
  • 1:21 - 1:24
    Que é 1000 dividido por 30.
  • 1:25 - 1:28
    Bem, não está funcionando.
  • 1:29 - 1:31
    Você sabe o porque?
    É um pouco complicado.
  • 1:31 - 1:34
    Vamos dar uma olhada nesse
    trecho de código.
  • 1:34 - 1:39
    Qual é o valor de ohnoes.style.width?
  • 1:39 - 1:41
    Após essa linha ser executada?
  • 1:41 - 1:46
    Você pode achar que foi
    de 50 para 51 pixels,
  • 1:46 - 1:50
    mas vamos imprimir o resultado
    pra ver qual é o valor.
  • 1:50 - 1:52
    Vou incluir o log na div com
    o seguinte comando
  • 1:52 - 1:56
    infoDiv.textContent = ohnoes.style.width;
  • 1:59 - 2:05
    E então vamos adicionar 1 a 50 pixels.
  • 2:05 - 2:08
    Quanto é 50 pixels + 1?
  • 2:08 - 2:10
    Você deve pensar que é 51 pixels,
  • 2:10 - 2:15
    mas JavaScript interpreta os
    50 pixels como uma string.
  • 2:16 - 2:20
    Então na verdade acaba virando "50px1".
  • 2:20 - 2:22
    O que não faz sentido nenhum.
  • 2:23 - 2:26
    Logo o navegador está
    simplesmente ignorando nossa tentativa
  • 2:26 - 2:29
    de mudar o valor da propriedade width
    para algo sem o menor sentido.
  • 2:30 - 2:35
    Então precisamos converter essa
    unidade em um número,
  • 2:36 - 2:40
    e então adicionar 1 e só depois
    adicionar o "px" novamente.
  • 2:41 - 2:45
    Podemos fazer a conversão para
    número com a função ParseFlow
  • 2:45 - 2:53
    coloca-lá entre chaves e concatenar
    o "px" no final.
  • 2:53 - 2:56
    E está funcionando, está ficando maior.
  • 2:56 - 2:58
    Certo.
  • 2:58 - 3:01
    Você viu a dificuldade de animar
    propriedades do CSS.
  • 3:01 - 3:04
    Geralmente as propriedades
    tem as unidades anexadas,
  • 3:04 - 3:06
    então você vai ter que converter
    para número
  • 3:06 - 3:07
    Meu Deus está ficando maior !
  • 3:07 - 3:09
    converter para um tipo numérico.
  • 3:09 - 3:11
    e concatenar o identificador
    da unidade novamente
  • 3:11 - 3:14
    Ok, está ficando bem assustador !
  • 3:14 - 3:19
    Na verdade há nada de complicado
    no uso do SetInterval
  • 3:19 - 3:21
    para animar propriedades.
  • 3:21 - 3:27
    Primeiro, o navegador não
    garante que o intervalo será obedecido.
  • 3:29 - 3:32
    Outras coisas podem surgir como
    interação com o usuário.
  • 3:32 - 3:33
    Como o usuário digitar algo.
  • 3:33 - 3:36
    E isso pode fazer com que sua
    função seja executada mais tarde.
  • 3:36 - 3:38
    Assim você não terá essa animação suave.
  • 3:39 - 3:43
    Segundo, o navegador irá executar essa
    função mesmo que a tabela esteja escondida
  • 3:43 - 3:47
    fazendo uso de processamento
    desnecessariamente.
  • 3:48 - 3:52
    Por isso eu uso uma nova função disponível
    em navegadores modernos
  • 3:52 - 3:55
    desenvolvidos espacialmente com
    animações DOM em mente.
  • 3:56 - 3:59
    É chamada de
    windows.RequestAnimationFrame (RFA)
  • 3:59 - 4:03
    Para usa-lá vamos nos livrar
    dessa linha com SetInterval
  • 4:03 - 4:08
    e vamos executar a RFA
  • 4:09 - 4:11
    de dentro da função
  • 4:12 - 4:17
    e referenciar a função makeItBigger.
  • 4:19 - 4:24
    E então vamos chamar makeItBigger
    na função PageLoad
  • 4:27 - 4:30
    Nossa, está ficando mair
    e mais rápido dessa vez.
  • 4:31 - 4:36
    Agora o navegador chama a função
    MakeItBigger logo após imprimir a imagem
  • 4:36 - 4:38
    Que é cerca de 60 quadros por segundo,
  • 4:38 - 4:39
    o dobro do que tínhamos antes.
  • 4:40 - 4:43
    e adicionamos 1 pixel a largura cada vez
  • 4:43 - 4:47
    e refaz o cálculo em 60
    quadros por segundo
  • 4:48 - 4:51
    Em apenas alguns segundos
    ficar maior que a página.
  • 4:51 - 4:53
    Agora ele se foi.
  • 4:53 - 4:55
    Como desaceleremos nossa animação?
  • 4:56 - 5:01
    Há algumas maneiras, mas um modo que eu
    gosto é rastrear quanto tempo já passou.
  • 5:01 - 5:04
    E então calcular qual deveria ser
    o novo tamanho baseado nisso.
  • 5:05 - 5:09
    Começamos guardando o hora que
    a animação inicia milisegundos ,
  • 5:09 - 5:11
    antes da função ser executada.
  • 5:11 - 5:17
    var startTime = new Date().getTime();
  • 5:17 - 5:20
    E dentro da função MakeItBigger
    armazenamos o hora atual.
  • 5:21 - 5:26
    var currTime = new Date().getTime();
  • 5:27 - 5:32
    E no cálculo faremos com que
    cresça 30 pixels por segundo.
  • 5:32 - 5:34
    E o tamanho inicial da imagem 50 px.
  • 5:34 - 5:37
    Então vamos calcular isso aqui.
  • 5:37 - 5:43
    Então o valor inicial da variável
    newWidth será 50
  • 5:44 - 5:52
    mais currTime menos startTime em
    milissegundos, dividido por 1000
  • 5:53 - 6:00
    isso tudo vezes 30, porque vamos
    aumentar 30 pixels por segundo
  • 6:00 - 6:02
    Ok, esse é nossa nova largura.
  • 6:03 - 6:10
    Agora vamos associar o style.width
    a essa nova largura.
  • 6:12 - 6:19
    Aí está, a animação suave em
    30 quadros por segundo.
  • 6:20 - 6:25
    E podemos mudar esse número se quisermos
    que cresça mais devagar
  • 6:25 - 6:28
    ou mais rápido.
  • 6:31 - 6:34
    Que tal suavizar a animação quando
    ela ficar muito grande?
  • 6:34 - 6:38
    Podemos simplesmente
    colocar um if nessa linha
  • 6:38 - 6:43
    e para que seja executado somente
    se a variável currentWidth
  • 6:43 - 6:48
    for menor que um número, como 300
  • 6:48 - 6:50
    vamos tentar isso.
  • 6:54 - 6:56
    Na verdade currentWidth é
  • 6:56 - 6:59
    Não, newWidth desculpe.
  • 6:59 - 7:02
    Vamos ver se chega a 300.
  • 7:04 - 7:07
    Vai Oh noes, você consegue, você consegue.
  • 7:07 - 7:08
    Perfeito!
  • 7:09 - 7:12
    Essa técnica de usar a propriedade RFA
  • 7:13 - 7:18
    deve funcionar para usuários
    do Chrome, Firefox ou IE 10 ou superior
  • 7:18 - 7:22
    Há várias bibliotecas JavaScript e shims
  • 7:22 - 7:25
    que irão usar RAF
    quando estiver disponível
  • 7:25 - 7:29
    e usar setInterval em navegadores antigos.
  • 7:30 - 7:33
    Essa é a questão do desenvolvimento web.
  • 7:33 - 7:35
    A rede está está mudando o tempo todo,
  • 7:35 - 7:37
    navegadores estão incluindo
    novas características
  • 7:37 - 7:41
    desenvolvedores estão descobrindo novas
    maneira de usar essas características.
  • 7:41 - 7:44
    Você tem que estar aprendendo
    constantemente o que há de novo,
  • 7:44 - 7:46
    e o que é melhor para
    o que você quer fazer.
  • 7:46 - 7:48
    Legendado por [Valter Bigeli]
    Revisado por [Fernando dos Reis]
Title:
Animando estilos com RAF (versão vídeo)
Description:

more » « less
Video Language:
English, British
Duration:
07:48

Portuguese, Brazilian subtitles

Revisions