WEBVTT 00:00:00.930 --> 00:00:03.213 Estamos de volta com contador do Oh noes. 00:00:03.643 --> 00:00:09.106 Se quisermos fazer o Oh Noes ficar maior conforme o contador se aproxima de zero. 00:00:09.461 --> 00:00:11.771 Para deixar mais dramático. 00:00:12.690 --> 00:00:16.850 Uma maneira de fazer isso é animar o CSS dessa imagem. 00:00:17.319 --> 00:00:19.139 com a propriedade window.setInterval 00:00:20.271 --> 00:00:24.541 O primeiro passo é pegar a imagem e armazenar em uma variável. 00:00:24.801 --> 00:00:30.391 var ohnoes = document.getelementById("ohnoes"); 00:00:31.981 --> 00:00:36.341 Vou configurar o tamanho inicial ohnoes.style.width = "50px"; 00:00:36.458 --> 00:00:39.418 Assim temos um tamanho inicial para começar aumentar a imagem. 00:00:39.508 --> 00:00:43.885 E agora vou criar a função makeItBigger. 00:00:44.483 --> 00:00:47.643 Que será responsável por aumentar a imagem. 00:00:48.194 --> 00:00:52.784 Dentro da função precisamos mudar a propriedade width (largura) da imagem. 00:00:52.949 --> 00:00:58.011 Adicionando um ao tamanho anterior da imagem. 00:01:00.071 --> 00:01:04.191 Por fim vou executar a função window.SetInterval 00:01:04.191 --> 00:01:06.911 window.setInterval(makeItBigger) 00:01:06.911 --> 00:01:11.470 Com que frequência você quer aumentar? 00:01:11.470 --> 00:01:13.780 Queremos uma animação suave 00:01:13.789 --> 00:01:16.750 O que significa que queremos algo entre 24 quadros por segundo 00:01:16.750 --> 00:01:18.220 e 60 quadros por segundo. 00:01:19.010 --> 00:01:21.180 Vou experimentar 30 quadros por segundo. 00:01:21.296 --> 00:01:24.166 Que é 1000 dividido por 30. 00:01:24.925 --> 00:01:27.955 Bem, não está funcionando. 00:01:28.588 --> 00:01:30.728 Você sabe o porque? É um pouco complicado. 00:01:30.848 --> 00:01:33.809 Vamos dar uma olhada nesse trecho de código. 00:01:34.195 --> 00:01:39.105 Qual é o valor de ohnoes.style.width? 00:01:39.108 --> 00:01:40.998 Após essa linha ser executada? 00:01:41.485 --> 00:01:45.757 Você pode achar que foi de 50 para 51 pixels, 00:01:45.757 --> 00:01:50.156 mas vamos imprimir o resultado pra ver qual é o valor. 00:01:50.156 --> 00:01:52.445 Vou incluir o log na div com o seguinte comando 00:01:52.445 --> 00:01:56.245 infoDiv.textContent = ohnoes.style.width; 00:01:58.543 --> 00:02:04.813 E então vamos adicionar 1 a 50 pixels. 00:02:05.429 --> 00:02:07.700 Quanto é 50 pixels + 1? 00:02:07.700 --> 00:02:09.828 Você deve pensar que é 51 pixels, 00:02:09.828 --> 00:02:14.848 mas JavaScript interpreta os 50 pixels como uma string. 00:02:15.787 --> 00:02:20.037 Então na verdade acaba virando "50px1". 00:02:20.058 --> 00:02:21.978 O que não faz sentido nenhum. 00:02:22.551 --> 00:02:25.790 Logo o navegador está simplesmente ignorando nossa tentativa 00:02:25.790 --> 00:02:29.040 de mudar o valor da propriedade width para algo sem o menor sentido. 00:02:29.702 --> 00:02:35.492 Então precisamos converter essa unidade em um número, 00:02:35.648 --> 00:02:39.968 e então adicionar 1 e só depois adicionar o "px" novamente. 00:02:40.678 --> 00:02:45.360 Podemos fazer a conversão para número com a função ParseFlow 00:02:45.360 --> 00:02:53.100 coloca-lá entre chaves e concatenar o "px" no final. 00:02:53.237 --> 00:02:55.977 E está funcionando, está ficando maior. 00:02:56.232 --> 00:02:57.629 Certo. 00:02:58.229 --> 00:03:01.321 Você viu a dificuldade de animar propriedades do CSS. 00:03:01.321 --> 00:03:03.792 Geralmente as propriedades tem as unidades anexadas, 00:03:03.792 --> 00:03:05.892 então você vai ter que converter para número 00:03:05.932 --> 00:03:07.385 Meu Deus está ficando maior ! 00:03:07.385 --> 00:03:08.915 converter para um tipo numérico. 00:03:08.915 --> 00:03:11.265 e concatenar o identificador da unidade novamente 00:03:11.265 --> 00:03:14.426 Ok, está ficando bem assustador ! 00:03:14.477 --> 00:03:18.947 Na verdade há nada de complicado no uso do SetInterval 00:03:18.947 --> 00:03:20.925 para animar propriedades. 00:03:21.337 --> 00:03:27.447 Primeiro, o navegador não garante que o intervalo será obedecido. 00:03:28.647 --> 00:03:31.807 Outras coisas podem surgir como interação com o usuário. 00:03:31.814 --> 00:03:33.164 Como o usuário digitar algo. 00:03:33.164 --> 00:03:36.168 E isso pode fazer com que sua função seja executada mais tarde. 00:03:36.168 --> 00:03:38.297 Assim você não terá essa animação suave. 00:03:38.999 --> 00:03:43.125 Segundo, o navegador irá executar essa função mesmo que a tabela esteja escondida 00:03:43.475 --> 00:03:47.035 fazendo uso de processamento desnecessariamente. 00:03:48.184 --> 00:03:51.764 Por isso eu uso uma nova função disponível em navegadores modernos 00:03:51.804 --> 00:03:55.084 desenvolvidos espacialmente com animações DOM em mente. 00:03:55.550 --> 00:03:58.570 É chamada de windows.RequestAnimationFrame (RFA) 00:03:58.860 --> 00:04:02.782 Para usa-lá vamos nos livrar dessa linha com SetInterval 00:04:03.452 --> 00:04:08.102 e vamos executar a RFA 00:04:08.762 --> 00:04:11.460 de dentro da função 00:04:11.750 --> 00:04:17.420 e referenciar a função makeItBigger. 00:04:18.570 --> 00:04:24.190 E então vamos chamar makeItBigger na função PageLoad 00:04:27.230 --> 00:04:30.480 Nossa, está ficando mair e mais rápido dessa vez. 00:04:30.890 --> 00:04:35.631 Agora o navegador chama a função MakeItBigger logo após imprimir a imagem 00:04:35.631 --> 00:04:37.744 Que é cerca de 60 quadros por segundo, 00:04:37.744 --> 00:04:39.454 o dobro do que tínhamos antes. 00:04:40.021 --> 00:04:43.021 e adicionamos 1 pixel a largura cada vez 00:04:43.114 --> 00:04:47.354 e refaz o cálculo em 60 quadros por segundo 00:04:47.863 --> 00:04:50.723 Em apenas alguns segundos ficar maior que a página. 00:04:51.053 --> 00:04:52.713 Agora ele se foi. 00:04:53.131 --> 00:04:55.301 Como desaceleremos nossa animação? 00:04:56.103 --> 00:05:01.092 Há algumas maneiras, mas um modo que eu gosto é rastrear quanto tempo já passou. 00:05:01.092 --> 00:05:04.332 E então calcular qual deveria ser o novo tamanho baseado nisso. 00:05:04.561 --> 00:05:09.091 Começamos guardando o hora que a animação inicia milisegundos , 00:05:09.123 --> 00:05:10.833 antes da função ser executada. 00:05:11.187 --> 00:05:16.657 var startTime = new Date().getTime(); 00:05:17.151 --> 00:05:20.481 E dentro da função MakeItBigger armazenamos o hora atual. 00:05:20.854 --> 00:05:25.784 var currTime = new Date().getTime(); 00:05:26.716 --> 00:05:31.636 E no cálculo faremos com que cresça 30 pixels por segundo. 00:05:31.636 --> 00:05:33.982 E o tamanho inicial da imagem 50 px. 00:05:34.050 --> 00:05:37.270 Então vamos calcular isso aqui. 00:05:37.476 --> 00:05:43.486 Então o valor inicial da variável newWidth será 50 00:05:44.355 --> 00:05:52.477 mais currTime menos startTime em milissegundos, dividido por 1000 00:05:53.207 --> 00:06:00.166 isso tudo vezes 30, porque vamos aumentar 30 pixels por segundo 00:06:00.166 --> 00:06:02.206 Ok, esse é nossa nova largura. 00:06:02.501 --> 00:06:09.631 Agora vamos associar o style.width a essa nova largura. 00:06:12.234 --> 00:06:18.774 Aí está, a animação suave em 30 quadros por segundo. 00:06:19.506 --> 00:06:24.666 E podemos mudar esse número se quisermos que cresça mais devagar 00:06:25.204 --> 00:06:27.694 ou mais rápido. 00:06:30.520 --> 00:06:34.120 Que tal suavizar a animação quando ela ficar muito grande? 00:06:34.150 --> 00:06:37.700 Podemos simplesmente colocar um if nessa linha 00:06:37.985 --> 00:06:42.548 e para que seja executado somente se a variável currentWidth 00:06:42.548 --> 00:06:48.442 for menor que um número, como 300 00:06:48.442 --> 00:06:49.612 vamos tentar isso. 00:06:54.331 --> 00:06:56.251 Na verdade currentWidth é 00:06:56.470 --> 00:06:58.560 Não, newWidth desculpe. 00:06:58.746 --> 00:07:01.516 Vamos ver se chega a 300. 00:07:03.681 --> 00:07:07.201 Vai Oh noes, você consegue, você consegue. 00:07:07.494 --> 00:07:08.464 Perfeito! 00:07:09.078 --> 00:07:12.348 Essa técnica de usar a propriedade RFA 00:07:12.685 --> 00:07:17.515 deve funcionar para usuários do Chrome, Firefox ou IE 10 ou superior 00:07:18.278 --> 00:07:21.538 Há várias bibliotecas JavaScript e shims 00:07:21.759 --> 00:07:25.259 que irão usar RAF quando estiver disponível 00:07:25.472 --> 00:07:29.312 e usar setInterval em navegadores antigos. 00:07:30.101 --> 00:07:32.521 Essa é a questão do desenvolvimento web. 00:07:32.579 --> 00:07:34.729 A rede está está mudando o tempo todo, 00:07:34.866 --> 00:07:37.216 navegadores estão incluindo novas características 00:07:37.216 --> 00:07:40.946 desenvolvedores estão descobrindo novas maneira de usar essas características. 00:07:40.946 --> 00:07:43.861 Você tem que estar aprendendo constantemente o que há de novo, 00:07:43.861 --> 00:07:46.244 e o que é melhor para o que você quer fazer. 00:07:46.262 --> 00:07:48.132 Legendado por [Valter Bigeli] Revisado por [Fernando dos Reis]