Apesar do que muitos desenvolvedores acreditam, a animação baseada em CSS não é a única maneira eficiente de animar na Web. Há também o JavaScript, e o JS tem algumas vantagens incríveis.
Por abandono JavaScript para CSS, como muitos desenvolvedores fazem, estamos inchando nossas folhas de estilo, sacrificando o controle do tempo de animação e renunciando ao movimento baseado em física.
Não me entenda mal. As animações CSS desempenham um papel importante na Web, tanto isoladamente quanto em combinação com animações JavaScript. Em particular, o CSS é perfeito para animações simples relacionadas a interações básicas com o usuário, como estados de foco e hover.
O JavaScript, no entanto, costuma ser a melhor opção para quase todo o resto, pois é muito mais versátil.
Talvez o senhor não acredite que as animações em JavaScript sejam tão rápidas quanto as animações em CSS. O senhor provavelmente já tentou animar com jQuery e viu suas animações tremerem e pularem, e presumiu que isso era um problema inerente ao JavaScript como linguagem.
Não é. Não confunda os dois, JavaScript e jQuery são coisas distintas.
O jQuery é uma biblioteca que consiste em funções que essencialmente se sobrepõem ao JavaScript simples. O jQuery não foi projetado para ser um mecanismo de animação de alto desempenho. Em vez disso, ela foi projetada para aliviar as dores de cabeça da manipulação do DOM – um trabalho que ela faz surpreendentemente bem.
Felizmente, existem bibliotecas de animação de código aberto que permitem que o senhor ignore o jQuery para aproveitar mais o poder bruto do JS simples. Com essas bibliotecas de animação, o senhor pode estabelecer um fluxo de trabalho de animação gerenciável e adicionar recursos que melhoram drasticamente o design de movimento em seus sites.
Vou colocar os senhores a par da Velocity.js Mecanismo de animação JavaScript para que as animações do seu site possam ser vigorosas, suaves e fáceis de implementar.
O que é Velocity.js?
O Velocity é uma biblioteca de animação dedicada. É simples de usar, é incrivelmente avançada e é amplamente adotada por grandes empresas (incluindo Tumblr, Microsoft e WhatsApp), e é gratuito sob a licença licença do MIT.
O Velocity imita a sintaxe do jQuery e combina perfeitamente com ele (embora possa ser usado sem jQuery ), portanto, aprender isso não deve ser problema para o senhor. Devido à onipresença do jQuery, mostrarei ao senhor o Velocity como ele é usado em combinação com o jQuery.
Observação: Para acelerar rapidamente 80/20 todas as suas animações, o senhor pode simplesmente substituir todas as chamadas de função “animate()” do jQuery atuais por chamadas de função “velocity()”, já que o Velocity espelha a sintaxe e a funcionalidade básica da função animate do jQuery (enquanto a expande). Mesmo com apenas essa rápida alteração, seu site pode receber um aumento significativo de desempenho.
Mas também há muito mais para aprender com o Velocity. Antes de nos aprofundarmos em como usar especificamente o Velocity, vamos aprender rapidamente o que é possível fazer com ele para que o senhor possa compreender seu valor.
Abaixo estão as coisas que o senhor pode fazer com a animação JavaScript que simplesmente não podem ser feitas com a animação baseada em CSS.
Rolagem de página
Uma tendência recente no design da Web é ter sites longos de página única em que os links fazem com que a página role suavemente para baixo até a seção apropriada da página, em vez de navegar para uma página totalmente diferente. Esse é um dos usos mais populares das animações JS, pois o CSS não pode executar a rolagem.
No Velocity, basta executar o comando velocity
com a função scroll
no elemento para o qual o senhor deseja rolar:
$element.velocity("scroll", 1000);
Essa função faz com que o navegador role para baixo até o elemento selecionado (jQuery
objeto, $element
) usando uma duração de 1000ms
. Apenas com o jQuery, essa seria uma função muito mais complicada e com várias linhas.
Não deixe que esse código o sobrecarregue se o senhor não entender o que ele significa; vamos analisá-lo lentamente depois de passarmos por mais alguns recursos interessantes.
Reversão de animação
No jQuery, para voltar ao estado original antes do início da animação, o senhor precisa animar manualmente as propriedades de volta aos seus valores originais. Por exemplo:
Com jQuery
// Animate a 50px wide element to a width of 100px over 400ms $element.animate({ width: "100px" }, 400); // Animate it back to its original width value of 50px over 400ms $element.animate({ width: "50px" }, 400);
Em contraste, com o Velocity, é uma simples questão de executar o comando reverse:
// Animate a 50px wide element to a width of 100px over 400ms $element.velocity({ width: "100px" }, 400); // Reverse previous animation - animate back to a width of 50px over 400ms $element.velocity("reverse");
Isso reverterá a animação para o estado original do elemento selecionado antes da animação – não há necessidade de especificar os valores manualmente.
Movimento baseado em física
O movimento no mundo real não é linear nem suave. Ele tem partes rápidas, partes lentas, atrito e até mesmo o conceito de peso. Com animações baseadas em JavaScript, o senhor pode imitar a física do mundo real em suas animações, fazendo com que as coisas pareçam mais naturais. O movimento linear parece robótico (sem vida) e um pouco desconfortável de assistir.
Para imitar o movimento do mundo real, o Velocity oferece um tipo de atenuação com base na física da mola, assumindo um valor de tensão (default: 500
) e um valor de fricção (default: 20
) como seus parâmetros (ver Documentação do Velocity para obter mais informações).
// Animate to a width of 100px with spring physics over the default 400ms. Spring tension is set to 1000, and friction is set to 50. $element.velocity({ width: "100px", [ 1000, 40 ]);
Um valor alto de tensão aumenta a velocidade total e a saliência da animação. Um valor de fricção mais baixo aumenta a velocidade no final da animação (a alta fricção faz com que a animação desacelere mais rapidamente). O ajuste desses valores tornará cada animação única, realista e interessante.
O exemplo acima seria muito rápido e saltitante (alta tensão), mas desaceleraria rapidamente e ficaria lento próximo ao final da animação (alta fricção)
Ok, ótimo, então como posso usá-lo?
Chega de ouvir falar sobre o que o pode vamos descobrir como o senhor pode começar a usá-lo hoje mesmo. Como mencionei anteriormente, o Velocity pode ser usado de forma independente, mas combiná-lo com o jQuery leva a resultados mais rápidos, pois o jQuery facilita muito a seleção de elementos.
A primeira etapa é fazer o download do Velocity.js em aqui. Em seguida, inclua-o em seu arquivo HTML em uma tag de script antes da tag de fechamento do corpo da página. Por exemplo:
<script src="https://code.jquery.com/jquery-2.1.1.min.js"></script> <script src="https://cdn.jsdelivr.net/velocity/1.1.0/velocity.min.js"></script>
Observação: se estiver usando o jQuery, certifique-se de incluir o jQuery antes do Velocity, pois o Velocity adaptará sua API com base na presença ou não do jQuery.
Uma vez incluído, o senhor pode basicamente começar a usá-lo no lugar da função “animate” do jQuery. No entanto, há vários acréscimos que tornam o Velocity muito mais poderoso do que isso, como inversões de animação, transformações, física de mola, encadeamento e animações coloridas (tudo isso será abordado aqui). Mas isso não termina aí, confira o os documentos do Velocity para obter mais informações.
Vamos aprender como realmente usar a sintaxe do Velocity!
Argumentos
O Velocity aceita um ou mais argumentos. O primeiro argumento é o único argumento obrigatório. Ele pode ser o nome de um comando (como no exemplo de “scroll” acima) ou pode ser um objeto de dados que mapeia as propriedades CSS para os valores finais da animação.
// Data object setting the animation final values of CSS properties opacity, and left to 50%, and 500px respectively. $element.velocity({ opacity: "50%", left: "500px"});
O segundo argumento é um objeto de dados de opções de animação, como duração, atenuação, atraso e conclusão (função de retorno de chamada que é executada após a animação). completa).
Objeto de dados
// Animates an element to an opacity of 50% over 200ms after a 200ms delay. $element.velocity({ opacity: "50%" }, { delay: 200, duration 200 });
Como alternativa, como um atalho, o senhor pode passar valores separados por vírgula para a duração, a atenuação e a função completa em qualquer ordem. No entanto, se desejar ter uma opção adicional, como atraso, o senhor deve usar um objeto de dados, e somente um objeto de dados – não é possível misturar e combinar.
Separado por vírgulas
// Animates an element to a left position of 50px with a 500ms duration, an easing of "ease-in-out", and with an alert message firing at the end of the animation. $element.velocity({ left: 50px }, 500, "ease-in-out", function () { alert(‘done') } ); // Won't work: mixes data object and comma separated values $element.velocity({ left: "50px" }, 500, "ease-in-out", function () { alert("done") }, { delay: 200 });
Observação: O segundo argumento é opcional porque há valores padrão para as propriedades mais importantes: duration: 400ms
, e easing: "swing"
. Todas as outras opções de animação são opcionais.
Observe também que o senhor só pode passar um único valor numérico por propriedade CSS, portanto padding: "10px 15px"
não funcionará. Em vez disso, o senhor deve definir cada uma delas separadamente: { paddingLeft: "10px", paddingTop: "15px" … }
. Além de ser mais legível e explícito, isso também significa que o senhor pode especificar tipos de atenuação para cada subpropriedade, em vez de ter um tipo de atenuação global, o que proporciona uma personalização inigualável das animações.
Observação: As propriedades CSS com várias palavras (font-size
e padding-left
) devem ser escritos em camelcase (fontSize
e paddingLeft
), sem hífen.
Veja a caneta Velocity.js – Noções básicas: Argumentos por Julian Shapiro (@julianshapiro) em CodePen.
Valores de propriedade:Se um tipo de unidade não for fornecido, será assumido um (ms
, px
, e deg
são geralmente assumidos), mas ser explícito é melhor para que o senhor possa discernir os tipos de unidade em um relance ao ler o seu código. Se houver qualquer coisa que não seja um valor numérico, então as aspas devem ser usadas. Por exemplo, duration: 500;
seria permitido, mas o duration: 500px;
não, as aspas teriam que ser usadas em torno do 500px
.
A animação JavaScript também permite que quatro operadores de valor sejam usados: operadores de valor +, -, * e /, permitindo que o senhor adicione, subtraia, multiplique e divida o valor atual da propriedade:
$element.velocity({ width: "+= 50px", // Adds 50px to the current width value height: "/= 2" // divides the current height value by two });
O uso desses recursos abreviados mantém toda a lógica de animação dentro do mecanismo de animação do Velocity. Isso mantém o código conciso e legível (eliminando cálculos manuais de valores) e também ajuda a melhorar o desempenho, fornecendo ao Velocity mais informações sobre suas intenções de animação. Quanto mais lógica de animação estiver contida no Velocity, melhor o Velocity poderá otimizar o desempenho do código.
Veja a caneta Velocity.js – Noções básicas: Valores por Julian Shapiro (@julianshapiro) em CodePen.
Encadeamento
Encadear chamadas Velocity uma após a outra no mesmo elemento coloca as animações em fila para serem executadas uma após a outra:
$element .velocity({ width: "500px", height: "300px"}) .velocity({ opacity: 0 });
Isso faria com que o elemento fosse animado para uma largura de 500px
e altura de 300px
e, depois de concluir essa animação, ela desapareceria para uma opacidade de 0%
. Conforme mencionado anteriormente, isso permite que o senhor crie animações complexas e de vários estágios com a garantia de que o tempo ocorrerá exatamente como planejado – uma após a outra – sem nenhum cálculo manual.
Veja a caneta Velocity.js – Noções básicas: Encadeamento por Julian Shapiro (@julianshapiro) em CodePen.
Flexibilização
Mencionei a palavra easing algumas vezes neste artigo, e talvez o senhor esteja se perguntando o que isso significa. Easing são funções matemáticas que determinam a velocidade da animação em diferentes estágios ao longo de sua duração. Por exemplo, uma atenuação “ease-in-out” acelera gradualmente no início da animação e desacelera gradualmente perto do final da animação. Uma atenuação “linear” tem uma velocidade constante durante toda a duração e parece muito chocante e robótica.
O senhor especifica a atenuação com a opção easing:
// Animate an element to a top position of 100px with an easing of "ease-in-out" $element.velocity({ top: 100 }, { easing: "ease-in-out" });
Veja a caneta Velocity.js – Opção: Easing (jQuery UI) por Julian Shapiro (@julianshapiro) em CodePen.
A suavização também é a forma como o senhor usa a física da mola, conforme mencionado anteriormente. O senhor pode usar os valores padrão (tensão de 500, fricção de 20) passando um valor de “spring” ou pode especificá-los manualmente:
// Animates an element to a width of 500px with spring physics with a tension of 250, and a friction of 10 (low tension, low friction). $element.velocity({ width: 500 }, { easing: [ 250, 10 ] });
Os Easings são muito mais complicados, mas, por uma questão de brevidade, vou parar por aqui. Leia a documentação do Velocity para obter mais informações.
Veja a caneta Velocity.js – Opção: Easing (Física da mola) por Julian Shapiro (@julianshapiro) em CodePen.
Cor
O Velocity permite animações de cores para as seguintes propriedades CSS: color, backgroundColor, borderColor e outlineColor. Essas propriedades de cor aceitam apenas cadeias hexadecimais como entradas (#000000
para preto, #3b5998
para o azul do Facebook). Entretanto, o senhor pode ajustar os valores individuais de vermelho, verde e azul (0 a 255) e até mesmo sua opacidade com o valor alfa (0 a 1). Basta acrescentar os nomes das propriedades CSS das cores com “Red” (vermelho), “Green” (verde), “Blue” (azul) ou “Alpha” (alfa).
$element.velocity({ // Animate borderColor to the hex color for "fogdog" (orange) borderColor: "#f06d06", // Animate the background to an opacity (alpha) of 80% backgroundColorAlpha: 0.8, // Animate the blue component of the element's text color to 200 colorBlue: 200 });
Veja a caneta Velocity.js – Recurso: Cores por Julian Shapiro (@julianshapiro) em CodePen.
Rolagem
Conforme mencionado anteriormente, o comando scroll faz com que a página role até a borda superior de um elemento. O senhor pode passar as mesmas opções que as outras animações, bem como encadear com outras chamadas de animação.
$element // scroll to the top edge of the element over 1000ms .velocity("scroll", { duration: 1000 }) // fade in after scroll animation .velocity({ opacity: 1 });
Por padrão, a rolagem da página ocorre no eixo y. Para mudar para a rolagem horizontal, use a opção de eixo:
// Scrolls the browser to the left edge of the element $element.velocity("scroll", { axis: "x" });
Um efeito comum é ter um deslocamento da borda superior durante a rolagem, para que o conteúdo não fique na parte superior do navegador e seja difícil de ler. Para obter esse efeito, ou o efeito oposto no Velocity, use a opção offset:
// Scroll to a position 100px above the element's top edge $element.velocity("scroll", { duration: 1000, offset: "-100px" }); // Scroll to a position 100px below the element's top edge $element.velocity("scroll", { duration: 1000, offset: "100px" });
Veja a caneta Velocity.js – Comando: Rolar com opção de contêiner por Julian Shapiro (@julianshapiro) em CodePen.
Transformações
Deseja combinar o poder das animações CSS e das animações JS? Coloque algumas transformações de CSS, permitindo que o senhor faça manipulações visuais 2D e 3D, como translação, dimensionamento e rotação. Observe que isso não afeta a localização do elemento no site nem a localização dos elementos ao redor dele.
O Velocity é compatível com as seguintes transformações:
translateX
: Mover um elemento ao longo do eixo x (esquerda-direita)translateY
: Mover um elemento ao longo do eixo y (para cima e para baixo)rotateZ
: Girar um elemento em torno do eixo z (sentido horário e anti-horário)rotateX
: Girar um elemento em torno do eixo x (de cima para baixo)rotateY
: Girar um elemento em torno do eixo y (esquerda-direita)scaleX
: Multiplicar a dimensão da largura de um elementoscaleY
: Multiplicar a dimensão da altura de um elemento
$element.velocity({ rotateZ: "90deg", // rotate clockwise 90 degrees scaleX: 2.0 // double the width });
Veja a caneta Velocity.js – Recurso: Transformações por Julian Shapiro (@julianshapiro) em CodePen.
Seguindo em frente
As animações dão vida e interatividade a uma página que, de outra forma, seria estática, e as animações baseadas em JavaScript são a melhor maneira de adicioná-las.
Com as animações CSS, o senhor está limitado em termos de funcionalidade às atualizações pouco frequentes do padrão CSS. Com o JavaScript, há dezenas de novas bibliotecas, plug-ins e atualizações sendo adicionados ao mundo de código aberto todos os dias, expandindo as possibilidades de suas animações por meio do uso de novas ferramentas.
O Velocity tem mais recursos do que os demonstrados aqui, e eu o encorajo a conferir o documentação. Agora vá experimentar! 🙂
Bônus!
Bônus final e duplo: confira este tutorial sobre como usar o pacote UI do Velocity para melhorar as interfaces de usuário. E confira este Galeria de demonstrações do Velocity.

Sobre Neal O’Grady
Neal O’Grady (@NealOGrady) é um desenvolvedor web, designer e escritor freelancer irlandês-canadense. Ele escreveu sobre tópicos de design para o Blog do Webflowe sobre pensamentos aleatórios em seu blog pessoal. Ele está trabalhando em seu sexto idioma e está viajando pelo mundo – atualmente está na Europa.